友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)
2016-05-30 20:36
489 查看
从本文开始,将记录博主在进行u-boot 1.1.6移植过程中遇到的问题。本文将涉及两个问题:
1. u-boot中添加开发板
2. u-boot第一阶段启动代码
更改为:
修改为:
但这个u-boot.bin文件并无法启动,需要修改相关代码进行移植。
2. U-boot第一阶段启动代码移植
mini2440的SOC为S3C2440,它的CPU为一个ARM920t的核,因此u-boot第一阶段启动代码就是cpu/arm920t/start.S文件。
更改为:
更改为:
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
之后添加部分代码,变为:
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
#elif defined(CONFIG_S3C2440)
ldr r1, =0x7FFF
ldr r0, =INTSUBMSK
str r1, [r0]
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
更改为:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#elif defined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004
# define UPLLCON 0x4C000008
ldr r0, =CLKDIVN
ldr r1, =0x5 /* FCLK:HCLK:PCLK = 1:4:8 */
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x5C011 /* MPLL=400MHz */
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022 /* UPLL=48MHz */
str r1, [r0]
/* configure S3C2440 to asynchronous bus mode */
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
#endif
找到源文件中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_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub 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_start
ldr r3, _bss_start
sub 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裸机程序修改了一版,效果不错。
下一篇博文将对这两个函数及相关设置进行充分说明。
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_config make
但这个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, =pWTCON mov r1, #0x0 str 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, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
之后添加部分代码,变为:
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
#elif defined(CONFIG_S3C2440)
ldr r1, =0x7FFF
ldr r0, =INTSUBMSK
str r1, [r0]
2.2. 设置MPLL和UPLL
源代码中,找到:/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
更改为:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#elif defined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004
# define UPLLCON 0x4C000008
ldr r0, =CLKDIVN
ldr r1, =0x5 /* FCLK:HCLK:PCLK = 1:4:8 */
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x5C011 /* MPLL=400MHz */
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022 /* UPLL=48MHz */
str r1, [r0]
/* configure S3C2440 to asynchronous bus mode */
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr 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_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub 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_start
ldr r3, _bss_start
sub 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裸机程序修改了一版,效果不错。下一篇博文将对这两个函数及相关设置进行充分说明。
相关文章推荐
- 第一章 JAVA初步
- [poj 1201]Intervals 差分约束
- 设计模式笔记-Strategy策略模式
- 上拉刷新--下拉加载XListView
- openwrt中使用ubus实现进程通信
- 无线通信大作业 开题报告
- 基因数据处理43之mango之503错误
- window 局域网下文件共享的开启与关闭方法
- 文件操作1-php
- READING NOTE: Semantic Object Parsing with Graph LSTM
- java的并发测试
- [bzoj2818]gcd
- java34: 流
- poj1984 Navigation Nightmare(带权并查集)
- NoSQL之Redis---下载与安装
- 安卓小案例收集二
- 客户端调用服务端接口减少请求数据容量的优化例子
- 1054. The Dominant Color (20)
- Hi~~~
- 如何下载收费音乐