[置顶] 亮仔移植u-boot系列之-- S3c2440在最新版本U-boot-2015.10移植(支持SPL模式启动) -- 2
2015-12-15 11:58
621 查看
这章讲解BL1的移植方法.
打开Start.S文件,在Cpu上电后的第一条命令b reset后进入这个文件执行后续操作,和老的u-boot版本一样执行了以下步骤
1:切换到svc32模式,关闭icache和dcache
2:关中断
3:关狗
4:设置时钟分频比
5:设置各个Bank
6:搬移BL2的代码从Nand Flash到SDRAM
7:跳转到_main执行
显然过程1-过程5只需要在BL1阶段执行1次,BL2直接在b reset后直接跳转到过程6执行.(++表示添加的)
由于2440和2410时钟设置上有区别,因此我将时钟设置这段代码注释了,因为俺的汇编比较渣,所以针对2440的时钟初始化工作我移到设置完sp后跳转到c代码yl_clock_init去执行.
还要注意关闭中断,将ldr r1, =0x3ff修改为0x7fff
_main在arch\arm\lib目录下的Crt0.S文件内,我在yl2440.h目录下设置了
#define CONFIG_SPL_STACK 0x1000
即SPL模式下的堆栈指针指向Cpu的Steppingstone的最顶部.
当PC指针指向这个点,BL1的任务只剩下之前提到的step4,6,7了,在bl board_init_f处做如下处理,即SPL模式下不需要进入
board_init_f板块第一次初始化函数,修改为bl yl_clock_init通过C语言的方式初始化时钟,具体yl_clock_init()功能实现网上很多,本文就不多讲了.
在yl2440.h定义上面上个宏:
BL2_MTD_OFFSET因为我板子上的Nand Flash是2K/Page,总共64个Page,那么整个Block大小是128K.规划BL1.bin存放在Block0,BL2.bin存放在Block1,BL2_MTD_LENTH表示了BL2占用从block1起头的1M空间.
CONFIG_SYS_TEXT_BASE是BL2链接时在SDRAM的运
8b86
行地址,因此只要yl_copy_code_from_nand_to_sdram函数将Nand Flash所在的BL2位子搬移到SDRAM的CONFIG_SYS_TEXT_BASE处,再将pc指针指向这个BL2代码运行的首地址,则BL1就一去不复返了,将控制权交给了BL2.
BL2无非需要实现以下几个任务:
1:能通过串口打印相关信息,通过串口实现有关功能
2:能读写nand flash,将内核镜像和根文件系统写道某个nand flash特定分区内
3:能通过网线实现tftp传输相关文件
4:能引导linux内核
下一章将实力分析BL2代码的重定位和串口功能的实现.
打开Start.S文件,在Cpu上电后的第一条命令b reset后进入这个文件执行后续操作,和老的u-boot版本一样执行了以下步骤
1:切换到svc32模式,关闭icache和dcache
2:关中断
3:关狗
4:设置时钟分频比
5:设置各个Bank
6:搬移BL2的代码从Nand Flash到SDRAM
7:跳转到_main执行
显然过程1-过程5只需要在BL1阶段执行1次,BL2直接在b reset后直接跳转到过程6执行.(++表示添加的)
++ #if defined(CONFIG_SPL_BUILD) /* * set the cpu to SVC32 mode */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr, r0 . . . . . ++#else //#if defined(CONFIG_SPL_BUILD) ldr r0, =0x56000054 mov r1, #0xffffff8f str r1, [r0] //Set Led1 2 3 On ++#endif bl _main
由于2440和2410时钟设置上有区别,因此我将时钟设置这段代码注释了,因为俺的汇编比较渣,所以针对2440的时钟初始化工作我移到设置完sp后跳转到c代码yl_clock_init去执行.
/* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ -- ldr r0, =CLKDIVN -- mov r1, #3 -- str r1, [r0]
还要注意关闭中断,将ldr r1, =0x3ff修改为0x7fff
ldr r1, =0x7ff ldr r0, =INTSUBMSK str r1, [r0]
_main在arch\arm\lib目录下的Crt0.S文件内,我在yl2440.h目录下设置了
#define CONFIG_SPL_STACK 0x1000
即SPL模式下的堆栈指针指向Cpu的Steppingstone的最顶部.
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) ldr sp, =(CONFIG_SPL_STACK) #else ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) #endif
当PC指针指向这个点,BL1的任务只剩下之前提到的step4,6,7了,在bl board_init_f处做如下处理,即SPL模式下不需要进入
board_init_f板块第一次初始化函数,修改为bl yl_clock_init通过C语言的方式初始化时钟,具体yl_clock_init()功能实现网上很多,本文就不多讲了.
#if defined(CONFIG_SPL_BUILD) bl yl_clock_init /* Read u-boot from Nandflash to SDRAM address $CONFIG_SYS_TEXT_BASE */ ldr r0, =BL2_MTD_OFFSET ldr r1, =CONFIG_SYS_TEXT_BASE ldr r2, =BL2_MTD_LENTH bl yl_copy_code_from_nand_to_sdram ldr pc, =CONFIG_SYS_TEXT_BASE #else bl board_init_f #endif
在yl2440.h定义上面上个宏:
#define BL2_MTD_OFFSET 0x20000 /* BL2: 128K nand offset - 1Block */ #define BL2_MTD_LENTH 0x100000 /* BL2: 1M nand lenth */ #define CONFIG_SYS_TEXT_BASE 0x30008000
BL2_MTD_OFFSET因为我板子上的Nand Flash是2K/Page,总共64个Page,那么整个Block大小是128K.规划BL1.bin存放在Block0,BL2.bin存放在Block1,BL2_MTD_LENTH表示了BL2占用从block1起头的1M空间.
CONFIG_SYS_TEXT_BASE是BL2链接时在SDRAM的运
8b86
行地址,因此只要yl_copy_code_from_nand_to_sdram函数将Nand Flash所在的BL2位子搬移到SDRAM的CONFIG_SYS_TEXT_BASE处,再将pc指针指向这个BL2代码运行的首地址,则BL1就一去不复返了,将控制权交给了BL2.
BL2无非需要实现以下几个任务:
1:能通过串口打印相关信息,通过串口实现有关功能
2:能读写nand flash,将内核镜像和根文件系统写道某个nand flash特定分区内
3:能通过网线实现tftp传输相关文件
4:能引导linux内核
下一章将实力分析BL2代码的重定位和串口功能的实现.
相关文章推荐
- Unity3D AI角色移动和自动跟随
- NGINX 日志文件切割及管理
- Android中WIFI开发总结(一)
- 解决客户端无法连接服务器数据库SQL2000
- android studio svn 更改依赖包名后 报错 Gradle Configuration with name 'default' not found
- Fastest Gaussian Blur (in linear time)
- mysql 恢复
- EEPROM和FLASH的区别
- 列表选择编辑风格-报表系统
- 接口的幂等性
- day02注释 进制 数据类型 常量 变量(上)
- 包含中文字符的NSString转换为NSURL结果为nil解决方法
- 使用密钥ssh登录到主机
- 简单的搭建安装nexus
- JavaScript(19)jQuery HTML 获取和设置内容和属性
- 频繁分配释放内存导致的性能问题的分析
- 诸子百家
- python lambda函数
- 升级Xcode 7 各种插件无法使用解决方法
- H-Index,H-Index II