1、uboot116的移植目标板TQ24401 编译测试u-boot1.1.6的移植(目标板TQ2440)1 编译测试Linux内核 2009-12-15 01:18:50 阅读146 评论0 字号:大中小订阅 如何将u-booot1.1.6从smdk2410移植到tq2440目标板?阅读了天嵌公司的tq2440开发板u-boot代码,以下是我的总结。 为实践需要,另起自己的目标板名字,故用jzy2440替代tq2440。蓝色的为修改部分,红色为jzy23注释。(一)编译测试1. /board目录下(1).将smdk2410目录复制为jzy2440目录。(2). 将jzy2440目录下的Makef
2、ile中的COBJS改为: COBJS :=jzy2440.o flash.o2./include/configs目录下将smdk2410.h复制为jzy2440.h。3.修改顶层Makefile 增加: jzy2440_config: unconfig$(MKCONFIG) $(:_config=) arm arm920t jzy2440 NULL s3c24X0 这两句的含义,可参见韦东山编著的嵌入式Linux应用开发完全手册的bootloader部分-第15章,第249页u-boot配置过程。4.使用支持softfloat的交叉编译器:crosstools_3.4.1_soft(光盘附带
3、)。5.编译测试 配置make jzy2440_config编译:make 具体u-boot编译,连接过程参看韦东山嵌入式Linux应用开发完全手册第254页。6.清除上次编译的结果:make mrproperu-boot1.1.6的移植(目标板TQ2440)4 .lds设置Linux内核 2009-12-15 01:17:34 阅读43 评论0 字号:大中小订阅 (四).lds文件设置 注:蓝色部分为修改或者改动部分,红色部分为jzy23注解。在board/jzy2440/u-boot.lds里修改: SECTIONS. = 0x00000000;. = ALIGN(4);.text : c
4、pu/arm920t/start.o(.text) board/jzy2440/boot_init.o (.text)/添加这句 *(.text). = ALIGN(4);.rodata : *(.rodata) . = ALIGN(4);.data : *(.data) . = ALIGN(4);.got : *(.got) . = .;_u_boot_cmd_start = .;.u_boot_cmd : *(.u_boot_cmd) _u_boot_cmd_end = .;. = ALIGN(4);_bss_start = .;.bss : *(.bss) _end = .;u-boot
5、1.1.6的移植(目标板TQ2440)5代码重定向Linux内核 2009-12-15 01:15:55 阅读81 评论0 字号:大中小订阅 (五) 代码重定向 注:蓝色部分为修改或者改动部分,红色部分为jzy23注解。1. start.S里修改:#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:/* relocate U-Boot to RAM */adrr0, _start/* r0 - current position of code (r0=0) */ldrr1, _TEXT_BASE/* test if we run from flash or R
6、AM(r1=0x33f80000 */cmp r0, r1 /*dont reloc during debug */beq clear_bss /*(原来为stack_setup)*/ldrr2, _armboot_start /*(r2为_start的地址=0x3ff80000)*/ldrr3, _bss_start /*(在连接文件中定义)*/subr2, r3, r2#if 1/*(增加)*/bl CopyCode2Ram/* r0: source, r1: dest, r2: size */ /*(跳转到CopyCode2Ram函数)*/#elseaddr2, r0, r2/ r2 -
7、 source end address */copy_loop:ldmiar0!, r3-r10/ copy from source address r0 */stmiar1!, r3-r10/ copy to target address r1 */cmpr0, r2/ until source end addreee r2 */blecopy_loop#endif#endif/ CONFIG_SKIP_RELOCATE_UBOOT */2.在board/jzy2440/boot_init.c中与CopyCode2Ram()相关的函数与定义如下:#include #include #defi
8、ne GSTATUS1 (*(volatile unsigned int *)0x560000B0)#define BUSY 1/ 供外部调用的函数 */void nand_init_ll(void);int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size);/ NAND Flash操作的总入口, 它们将调用S3C2410或S3C2440的相应函数 */static void nand_reset(void);static void wait_idle(void);static void nand_sele
9、ct_chip(void);static void nand_deselect_chip(void);static void write_cmd(int cmd);static void write_addr(unsigned int addr);static unsigned char read_data(void);/ S3C2410的NAND Flash处理函数 */static void s3c2410_nand_reset(void);static void s3c2410_wait_idle(void);static void s3c2410_nand_select_chip(vo
10、id);static void s3c2410_nand_deselect_chip(void);static void s3c2410_write_cmd(int cmd);static void s3c2410_write_addr(unsigned int addr);static unsigned char s3c2410_read_data(void);/ S3C2440的NAND Flash处理函数 */static void s3c2440_nand_reset(void);static void s3c2440_wait_idle(void);static void s3c24
11、40_nand_select_chip(void);static void s3c2440_nand_deselect_chip(void);static void s3c2440_write_cmd(int cmd);static void s3c2440_write_addr(unsigned int addr);static unsigned char s3c2440_read_data(void);/ S3C2410的NAND Flash操作函数 */ 复位 */static void s3c2410_nand_reset(void) s3c2410_nand_select_chip(
12、); s3c2410_write_cmd(0xff); / 复位命令 s3c2410_wait_idle(); s3c2410_nand_deselect_chip();/ 等待NAND Flash就绪 */static void s3c2410_wait_idle(void) int i;S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000; volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand-NFSTAT; while(!(*p & BUSY) for
13、(i=0; iNFCONF &= (111); for(i=0; iNFCONF |= (1NFCMD; *p = cmd;/ 发出地址 */static void s3c2410_write_addr(unsigned int addr) int i;S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000; volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand-NFADDR; *p = addr & 0xff; for(i=0; i 9) & 0xff; f
14、or(i=0; i 17) & 0xff; for(i=0; i 25) & 0xff; for(i=0; iNFDATA; return *p;/ S3C2440的NAND Flash操作函数 */ 复位 */static void s3c2440_nand_reset(void) s3c2440_nand_select_chip(); s3c2440_write_cmd(0xff); / 复位命令 s3c2440_wait_idle(); s3c2440_nand_deselect_chip();/ 等待NAND Flash就绪 */static void s3c2440_wait_idl
15、e(void) int i;S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000; volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand-NFSTAT; while(!(*p & BUSY) for(i=0; iNFCONT &= (11); for(i=0; iNFCONT |= (1NFCMD; *p = cmd;/ 发出地址 */static void s3c2440_write_addr(unsigned int addr) int i;S3C244
16、0_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000; volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand-NFADDR; *p = addr & 0xff; for(i=0; i 9) & 0xff; */(不是8!)*/ for(i=0; i 17) & 0xff; for(i=0; i 25) & 0xff; for(i=0; iNFDATA; return *p;/ 在第一次使用NAND Flash前,复位一下NAND Flash */static void
17、nand_reset(void) / 判断是S3C2410还是S3C2440 */ if (GSTATUS1 = 0x32410000) | (GSTATUS1 = 0x32410002) s3c2410_nand_reset();else s3c2440_nand_reset();static void wait_idle(void) / 判断是S3C2410还是S3C2440 */ if (GSTATUS1 = 0x32410000) | (GSTATUS1 = 0x32410002) s3c2410_wait_idle();else s3c2440_wait_idle();static
18、void nand_select_chip(void) int i; / 判断是S3C2410还是S3C2440 */ if (GSTATUS1 = 0x32410000) | (GSTATUS1 = 0x32410002) s3c2410_nand_select_chip();else s3c2440_nand_select_chip(); for(i=0; iNFCONF = (115)|(112)|(111)|(TACLS8)|(TWRPH04)|(TWRPH1NFCONF = (TACLS12)|(TWRPH08)|(TWRPH1NFCONT = (14)|(11)|(10); / 复
19、位NAND Flash */nand_reset();#define NAND_SECTOR_SIZE 512#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)/ 读函数 */int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) int i, j; if (start_addr & NAND_BLOCK_MASK) | (size & NAND_BLOCK_MASK) return ; / 选中芯片 */ nand_select_chip(); for(i=start_addr; i (start_addr + size);) / 发出READ0命令 */
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1