从本文开始,将记录博主在进行u-boot 1.1.6移植过程中遇到的问题。本文将涉及两个问题:

1. u-boot中添加开发板

2. u-boot第一阶段启动代码

1. u-boot中添加开发板

1.1. Makefile更改

1.1.1. 增加反汇编文件输出

Makefile文件中239行,源文件为:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

更改为:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $(U_BOOT_NAND)

1.1.2. 添加开发板

Makefile文件1879行,按照smdk2410的形式,添加mini2440开发板配置如下:

mini2440_config  :   unconfig@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0

1.1.3. 自动清理时删除反汇编文件

Makefile文件2293行,源文件为:

rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)

修改为:

rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(obj)u-boot.dis $(ALL)

1.2. 添加头文件

在include/configs/目录下添加mini2440.h文件。可以直接拷贝一份smdk2410.h文件。

1.3. 添加核心版文件

在board/目录下添加mini2440目录。可直接拷贝smdk2410文件夹即可。

1.4. 小结

自此,mini2440开发板已经添加到u-boot 1.1.6中。可直接执行如下命令生成u-boot.bin文件

make mini2440_configmake

但这个u-boot.bin文件并无法启动,需要修改相关代码进行移植。

2. U-boot第一阶段启动代码移植

mini2440的SOC为S3C2440,它的CPU为一个ARM920t的核,因此u-boot第一阶段启动代码就是cpu/arm920t/start.S文件。

2.1. 关闭看门狗和中断服务

S3C2440的看门狗和S3C2410一样,因此在start.S文件进行如下修改:

124行源代码:

#elif defined(CONFIG_S3C2410)
# define pWTCON     0x53000000
# define INTMSK     0x4A000008  /* Interupt-Controller base addresses */
# define INTSUBMSK  0x4A00001C
# define CLKDIVN        0x4C000014    /* clock divisor register */

更改为:

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
# define pWTCON     0x53000000  /* watchdog register address */
# define INTMSK     0x4A000008  /* interrupt mask register address */
# define INTSUBMSK  0x4A00001C  /* interrupt sub-mask register address */
# define CLKDIVN    0x4C000014  /* clock divisor register */

131行源代码:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)ldr     r0, =pWTCONmov     r1, #0x0str     r1, [r0]

更改为:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
ldr     r0, =pWTCON
mov     r1, #0x0
str     r1, [r0]

142行源代码:

# if defined(CONFIG_S3C2410)ldr  r1, =0x3ffldr  r0, =INTSUBMSKstr  r1, [r0]

之后添加部分代码,变为:

# if defined(CONFIG_S3C2410)ldr  r1, =0x3ffldr  r0, =INTSUBMSKstr  r1, [r0]
#elif defined(CONFIG_S3C2440)ldr    r1, =0x7FFFldr r0, =INTSUBMSKstr  r1, [r0]

2.2. 设置MPLL和UPLL

源代码中,找到:

 /* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldr r0, =CLKDIVNmov    r1, #3str   r1, [r0]

更改为:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldr    r0, =CLKDIVNmov    r1, #3str   r1, [r0]
#elif defined(CONFIG_S3C2440)
# define MPLLCON    0x4C000004
# define UPLLCON    0x4C000008ldr   r0, =CLKDIVNldr    r1, =0x5       /* FCLK:HCLK:PCLK = 1:4:8 */str    r1, [r0]ldr r0, =MPLLCONldr    r1, =0x5C011       /* MPLL=400MHz */str   r1, [r0]ldr r0, =UPLLCONldr    r1, =0x38022       /* UPLL=48MHz */str    r1, [r0]/* configure S3C2440 to asynchronous bus mode */mrc p15, 0, r1, c1, c0, 0orr    r1, r1, #0xc0000000mcr  p15, 0, r1, c1, c0, 0
#endif

2.3. 添加NAND启动代码

u-boot的smdk2410代码中默认为NOR启动,这里需要自行添加NAND启动代码。

找到源文件中NOR启动部分代码:

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:               /* relocate U-Boot to RAM       */adr   r0, _start      /* r0 <- current position of code   */ldr    r1, _TEXT_BASE      /* test if we run from flash or RAM */cmp     r0, r1                  /* don't reloc during debug         */beq     stack_setupldr r2, _armboot_startldr   r3, _bss_startsub   r2, r3, r2      /* r2 <- size of armboot            */add    r2, r0, r2      /* r2 <- source end address         */copy_loop:ldmia    r0!, {r3-r10}       /* copy from source address [r0]    */stmia r1!, {r3-r10}       /* copy to   target address [r1]    */cmp   r0, r2          /* until source end addreee [r2]    */ble   copy_loop
#endif  /* CONFIG_SKIP_RELOCATE_UBOOT */

更改为:

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:               /* relocate U-Boot to RAM       */adr   r0, _start      /* r0 <- current position of code   */ldr    r1, _TEXT_BASE      /* test if we run from flash or RAM */cmp     r0, r1                  /* don't reloc during debug         */beq     stack_setup
#if defined(CONFIG_NOR_BOOT)ldr r2, _armboot_startldr   r3, _bss_startsub   r2, r3, r2      /* r2 <- size of armboot            */add    r2, r0, r2      /* r2 <- source end address         */
copy_loop:ldmia r0!, {r3-r10}       /* copy from source address [r0]    */stmia r1!, {r3-r10}       /* copy to target address [r1]      */cmp   r0, r2          /* until source end addreee [r2]    */ble   copy_loop
#elif defined(CONFIG_NAND_BOOT)ldr  sp, =0x1000        /* setup stack to 4k temporarily to call the c function nand_read_ll*/bl    nand_init_ll        /* initialize nand flash */ldr  r0, _TEXT_BASE      /* destination for u-boot relocation */ldr  r1, =0x0       /* source address in NAND */ldr r2, =0x40000       /* length to read from NAND to SDRAM, 256K */bl nand_read_ll        /* call nand_read_ll to relocate u-boot */
#endif
#endif  /* CONFIG_SKIP_RELOCATE_UBOOT */

2.4. 小结

到此为止,start.S的所有代码均已修改完毕。

3. 说明

最后一部分涉及到nand_init_ll和nand_read_ll两个函数,网上关于NAND启动中使用的这两个C代码有很多,但博主下载之后均报错。最后横下一条心,根据韦东山大神的NAND裸机程序修改了一版,效果不错。

下一篇博文将对这两个函数及相关设置进行充分说明。

友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)相关推荐

  1. 友善之臂mini6410开发板学习笔记

    接口布局如下: 开发板与PC机连接

  2. 【黑马程序员新版Linux学习笔记】Linux系统实用操作命令——操作演示

    [黑马程序员新版Linux学习笔记]Linux 零基础快速入门: (一)Linux基本命令--操作演示 (二)Linux用户和权限 -- 操作演示 (三)Linux 小技巧快捷键 (四)Linux系统 ...

  3. 【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL

    一 LVGL简介 最近emwin用的比较烦躁,同时被LVGL酷炫的界面吸引到了,所以准备换用LVGL试试水. LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切 ...

  4. 移植u-boot1.1.6到友善mini2440学习笔记之环境搭建(系列之一)

    前记:两年前就想学习ARM,由于一些原因耽搁了下来.如今迫于找硬件岗位工作的压力,不得不硬着头皮学习ARM,以前就知道ARM入门是计较困难的,如今真是体会深切啊,全是心酸泪,不仅自己的无知跟自己作对, ...

  5. 友善之臂中的mini2440 GPIO相关函数操作

    在mini2440的驱动中,如果要对GPIO进行相关功能的配置和数据的写入获取,需要直接对相应的寄存器进行操作,其中使用的函数有: mini2440中端口号的形成可以使用下边的宏: S3C2410_G ...

  6. 小甲鱼python(2019最新版)学习笔记(P3-P8)

    P3:设计小游戏 """用python设计第一个游戏"""temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:&q ...

  7. JAVA学习笔记JEECG BOOT介绍

    JEECG JEECG BOOT 低代码开发平台(前后端分离版本) 当前最新版本: 3.1.0(发布日期:2022-03-01) AUR GitHub stars GitHub forks 项目介绍: ...

  8. 学习笔记-Spring Boot 开发 RESTful Web API(一)

    题记: 本篇是Spring Boot 开发学习系列中基础知识学习的一部分,为 RESTful Web API 相关基础知识,为实践操作奠定理论基础. REST不是一个标准,而是一种软件应用架构风格.基 ...

  9. Spring Boot学习笔记——Spring Boot与ActiveMQ的集成

    Spring Boot对JMS(Java Message Service,Java消息服务)也提供了自动配置的支持,其主要支持的JMS实现有ActiveMQ.Artemis等.这里以ActiveMQ为 ...

  10. SpringCloud学习笔记015---Spring Boot集成RabbitMQ发送接收JSON

    在Spring Boot 集成RabbitMQ一文中介绍了如何集成RabbitMQ.默认情况下发送的消息是转换为字节码,这里介绍一下如何发送JSON数据. ObjectMapper 最简单发送JSON ...

最新文章

  1. 模糊数学笔记:六、模糊模型识别-I(最大隶属度原则)
  2. html贪吃蛇自动走,分享一个用html5实现的贪吃蛇特效代码
  3. Gossip数据传播协议
  4. 暖通lisp快捷键_CAD 快捷键一览
  5. 4.2 算法之数论 185 反正切函数的应用 python
  6. BootStrap笔记-栅格系统
  7. Python_爬虫_案例汇总:
  8. 【通告更新】Apache Tomcat服务器文件包含漏洞安全风险通告第三次更新
  9. STL源码剖析-vector
  10. 大学生计算机考试题题库,大学生统考计算机一级考试试题题库(供参考)
  11. 程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序
  12. 自己给打印机怎么加粉墨,联想兄弟打印机加粉步骤
  13. 2021三跨985重庆大学917计算机上岸经验分享
  14. Python学习之路,简单的注册登录小屁程序
  15. Oracle的Replace函数与translate函数详解与比较
  16. kali liunx安装拼音输入法,必须成功,只需5步
  17. 商标复审成功率是多少?
  18. FPGA小技巧-左移右移实现
  19. Arduino用超声波测距模块HC-SR04获得精确测量值——误差数据的排除
  20. 华中科技大学有计算机科学与技术学院导师,华中科技大学计算机科学与技术学院导师简介-袁平鹏...

热门文章

  1. 网易易盾首席产品风控官imlolo分享对社交业务安全风控的认知和思考
  2. 新版标准日本语中级_第二十七课
  3. Java 结构化数据处理开源库 SPL
  4. 美团面试-2016校园招聘
  5. CodeForces128A - Statues 解题报告
  6. 5个最优秀的Java和C#代码转换工具
  7. Java如何实现阶梯字符型输出
  8. 线性代数【8】-1 线性方程组 - 非常重要的概念 - 三个基本的问题
  9. realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
  10. 软碟通 刻录linux光盘,使用UltraISO软碟通刻录光盘