----------------------------------------------------------
使用环境
PC: Centos5.4
kernel: 3.0.1
corss: arm-linux-gcc 4.4.1
arm: s3c6410
uboot: uboot-2010-03
----------------------------------------------------------
uboot的第一阶段,其实做的事情也是比较多的,,但是一般来说,重点就是配置各种硬件环境,来保证第二阶段能正常启动.
而该部分根据不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我为了保证我的代码能正常执行,
我必须得把代码搬移到内存里面去.不然代码在nand中也没法执行...但是为什么代码在nand中不能执行呢?其中一个比较
重要的原因就是nand并不是挂在CPU总线上面的,而是采用专门的硬件处理单元来控制的...nand控制器.
在你不添加任何代码的情况下,是不能控制外围的nand芯片的...但是怎么办.cpu内根本没有代码,怎么才能读取nand中的
代码到内存中去呢?没错-----s3c6410在启动的时候会帮我们以nand的最基本的时序.搬移nand中的前8K代码,到stepping
这样就可以执行了.而uboot的代码远比这个大..以至于我们得紧靠这部分代码,来完成剩下的代码部分的搬移....
今天的重点就是这个了.主要是来完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常启动起来....好了.直接开始..
首先,你得有smdk6410_config 编译目标,不然怎么开始.....此处省略N字...请看我的移植篇第一篇...
下面开始.打开start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)
我们得一边参看头文件中的配置,一边修改代码,来达到我们的目的..
在start.S 中,最开始就是一段啥?异常向量表,此处忽略,请参考分析篇中对start.S的分析
前面一部分是MMU啥的...直接招待after_copy:这个标签
什么?之前没有任何copy的东西???怎么有after_copy一说呢?
没错..所以我们得把copy代码添加在这里..从nand中把数据搬移出来,放到这之前完成,这样才对得起这个after_copy的标签
说干就干,这里我是调用的C代码,你也可以用汇编来完成的,只要功能一样就行了
图片转文字:
ldr r0, =0xff000fff
bic r1, pc, r0
ldr r2, _TEXT_BASE
bic r2, r2, r0
cmp r1, r2
beq after_copy
#ifdef CONFIG_NAND_BOOT
mov r0, #0x1000
bl copy_from_nand
#endif
这里我们得向我们的配置头文件内添加一个宏,就是 #define CONFIG_NAND_BOOT
接着,我们要去添加我们要调用的copy_from_nand
这个文件比较大,分析篇我会重点分析,究竟nand是如何搬移数据的. 在cpu/arm1176/下创建个文件nand_cp.c,这里我们只要复制下好了,
[cpp] view plaincopyprint?
#include #ifdef CONFIG_S3C64XX #include #include #include static int nandll_read_page(uchar * buf, ulong addr, int large_block) { int i; int page_size = 512; if (large_block == 1) page_size = 2048; if (large_block == 2) page_size = 4096; NAND_ENABLE_CE(); NFCMD_REG = NAND_CMD_READ0; /* Write Address */ NFADDR_REG = 0; if (large_block) NFADDR_REG = 0; NFADDR_REG = (addr) & 0xff; NFADDR_REG = (addr >> 8) & 0xff; NFADDR_REG = (addr >> 16) & 0xff; if (large_block) NFCMD_REG = NAND_CMD_READSTART; NF_TRANSRnB(); /* for compatibility(2460). u32 cannot be used. by scsuh */ for (i = 0; i < page_size; i++) { *buf++ = NFDATA8_REG; } NAND_DISABLE_CE(); return 0; } static int nandll_read_blocks(ulong dst_addr, ulong size, int large_block) { uchar *buf = (uchar *) dst_addr; int i; uint page_shift = 9; if (large_block == 1) page_shift = 11; /* Read pages */ if (large_block == 2) page_shift = 12; if (large_block == 2) { /* Read pages */ for (i = 0; i < 4; i++, buf += (1 << (page_shift - 1))) { nandll_read_page(buf, i, large_block); } /* Read pages */ for (i = 4; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) { nandll_read_page(buf, i, large_block); } } else { for (i = 0; i < (0x60000 >> page_shift);i++, buf += (1 << page_shift)) { nandll_read_page(buf, i, large_block); } } return 0; } int copy_uboot_to_ram(void) { int large_block = 0; int i; vu_char id; NAND_ENABLE_CE(); NFCMD_REG = NAND_CMD_READID; NFADDR_REG = 0x00; /* wait for a while */ for (i = 0; i < 200; i++) ; id = NFDATA8_REG; id = NFDATA8_REG; if (id > 0x80) large_block = 1; if (id == 0xd5) large_block = 2; /* read NAND Block. * 128KB ->240KB because of U-Boot size increase. by scsuh * So, read 0x3c000 bytes not 0x20000(128KB). */ return nandll_read_blocks(CONFIG_SYS_PHY_UBOOT_BASE, 0x60000,large_block); } #endif 然后修改Makefile 把我们的nand_cp.c添加到uboot中去编译 最后make下.你会发现.编译好了....编译器记得重新make smdk6410_config下.因为我们修改了头文件,需要重新生成.mk文件 今天的任务基本完成了,今天比较轻松,接着我们稍微修改下smdk6410.h中的配置. 主要是改几个名字,把什么6400的改成6410就好了.. 没错,你只要查找替换就行了...因为我们现在编译的已经是6410了.不是6400了... 修改完之后,有一个地方得稍微改下. cpu/arm1176/s3c64xx/Makefile 把6400改成64XX因为,我们的配置文件里面已经没有6400了.... 这个请查看头文件中的配置定义...
上一篇:ok6410的mplayer移植
下一篇:u-boot2010.03 移植篇(三)-----进一步修改start.S,smdk6410.h,支持nand启动及配置DM9000网卡
推荐阅读最新更新时间:2024-11-17 03:19
设计资源 培训 开发板 精华推荐
- RTL8152B-USB有线网卡
- A1 - VL812气氛下的USB3.0超高速扩展坞
- 雅特力AT32F415CBT7最小实验板
- AN54,使用 LTC1148、4-10V、-5V/1A 正负转换器的应用电路
- 当 LTC2380IDE-16 中启用数字增益压缩时,使用 LT6350 的典型应用被配置为接受 ±10V 输入信号,同时运行一个 5.5V 单电源
- ESP-01S台灯PWM控制模块
- AM2F-0518SH30Z 18V 2瓦DC-DC转换器的典型应用
- SECO-1KW-MCTRL-GEVB:具有紧凑型智能功率模块 (IPM) 的 1kW 600V 工业电机控制电源板
- LT1171HVIT、5V/2.5A 正降压转换器的典型应用
- OP413FSZ 超低噪声、单电源仪表放大器的典型应用