重点 1. 关闭的宏要怎么打开??? -----处理措施: 去它的.h配置文件中添加。 例如: #define CONFIG_S3C2440 2. 怎么删除一个文件??? --处理措施: 例如: 要删除drivers\mtd\nand\s3c2410_nand.c 找到 drivers\mtd\nand\Makefile 搜索 s3c2410_nand 找到 COBJS-$(CONFIG_NAND_S3C2410)+= s3c2410_nand.o 根据 CONFIG_NAND_S3C2410宏 找到 #define CONFIG_NAND_S3C2410的宏开关 注销掉 //#defineCONFIG_NAND_S3C2410的宏开关 3. 编辑出来的U-BOOT非常大,用光盘里的U-BOOT来更新新的U-BOOT. 烧写到NOR FLASH的方法: 把光盘里的u-boot.bin 烧写进NOR FALSH 进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送 Usb 1 30000000 // 一次,目标地址 Protect off all //擦出NOR 的写保护 Erase 0 7ffff //从什么位置擦出,擦出多大 Cp.b 30000000 0 80000 //源地址,目标地址, 复制多大 烧写到 NAND FLASH的方法: 把光盘里的u-boot.bin烧写进NOR FALSH 进去 u-boot模式,接好USB 线,打开DNW.exe 软件发送 Usb 1 30000000 // 一次,目标地址 Nand erase 0 80000 //从什么位置擦出, 擦出多大 Nand write 30000000 0 80000 //源地址,目标地址, 复制多大 A. 尝试创建新单板 1. 编译相近的smdk2410看u-boot能否通过 Make smdk2410_config Make //成功编译出U-BOOT 2. 开始创建自己的单板 cd board/samsung/ cp smdk2410 smdk2440 –rf cd ../../include/configs/ cp smdk2410.h smdk2440.h 但现在还不能make smdk2440_config 通过grep"smdk2410" * -nR知道还需要修改boards.cfg file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 3. viboards.cfg 添加一行: smdk2440 arm arm920t - samsung s3c24x0 现在可以make smdk2440_config,新单板的u-boot的最初模型出来了,但绝对还不能使用,需要修改代码 B. 修改代码(SDRAM, UART,时钟,重定位) 一. 修改时钟 从\u-boot-2012.04.01\arch\arm\cpu\arm920t\start.S阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置 处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置 注释掉原文对PLL,MPLL的设置,,提取到start.S里设置 1. 注释掉(\board\samsung\smdk2410\Smdk2440.c)intboard_early_init_f(void)中的 #if 0 /* to reduce PLL lock time, adjust the LOCKTIMEregister */ writel(0xFFFFFF, &clk_power->locktime); /* configure MPLL */ writel((M_MDIV << 12) + (M_PDIV <<4) + M_SDIV, &clk_power->mpllcon); /* some delay between MPLL and UPLL */ pll_delay(4000); #endif 2. Start.S 修改时钟设置, 注释掉:start.S 中的 #if 0 /* FCLK:HCLK  CLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0,=CLKDIVN mov r1,#3 str r1,[r0] #endif 3. 添加代码 /* 2. 设置时钟 */ ldr r0, =0x4c000014 // movr1, #0x03; // FCLK:HCLK  CLK=1:2:4, HDIVN=1,PDIVN=1 mov r1, #0x05; // FCLK:HCLK  CLK=1:4:8 str r1, [r0] /* 如果HDIVN非0,CPU的总线模式应该从“fastbus mode”变为“asynchronous bus mode” */ mrc p15,0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1,r1, #0xc0000000 /*设置为“asynchronous bus mode” */ mcr p15,0, r1, c1, c0, 0 /* 写入控制寄存器 */ #defineS3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) /* MPLLCON = S3C2440_MPLL_200MHZ */ ldr r0, =0x4c000004 ldr r1, =S3C2440_MPLL_400MHZ str r1, [r0] /* 启动ICACHE */ mrc p15, 0, r0, c1, c0, 0 @ read control reg orr r0, r0, #(1<<12) mcr p15, 0, r0, c1, c0, 0 @ write it back 二:修改SDRAM 注释掉以前对SMRDATA的设置换成 SMRDATA: .long 0x22011110 //BWSCON .long 0x00000700 //BANKCON0 .long 0x00000700 //BANKCON1 .long 0x00000700 //BANKCON2 .long 0x00000700 //BANKCON3 .long 0x00000700 //BANKCON4 .long 0x00000700 //BANKCON5 .long 0x00018005 //BANKCON6 .long 0x00018005 //BANKCON7 .long 0x008C04F4 // REFRESH .long 0x000000B1 //BANKSIZE .long 0x00000030 //MRSRB6 .long 0x00000030 //MRSRB7 make 出现乱码 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 三: UART 波特率 跟踪文件: Start.S board_init_f init_sequence serial_init, /*serial communications setup */ serial_init_dev(UART_NR) _serial_setbrg(dev_index); reg= get_PCLK() / (16 * gd->baudrate) - 1; get_HCLK 最中找到了这句 #ifdef CONFIG_S3C2440) 宏未定义 1. 处理措施:\include\configs\Smdk2440.h 取消/ /#define CONFIG_S3C2410 /* specifically a SAMSUNG S3C2410SoC */ 添加 #define CONFIG_S3C2440 Make 出现一堆问题 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 查看代码发现因为我们关闭了CONFIG_S3C2410 这个宏,导致里面的nand->nfconf成员不能用,需要完全的修改 static voids3c2410_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) 这个函数,但我们现阶段只想让它能正常显示,所以先删除这个文件 2. 删除 drivers\mtd\nand\s3c2410_nand.c文件 --处理措施: 找到drivers\mtd\nand\Makefile 搜索s3c2410_nand 找到COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o 根据CONFIG_NAND_S3C2410宏 找到#defineCONFIG_NAND_S3C2410的宏开关 全部注销 #ifdef CONFIG_CMD_NAND //#defineCONFIG_CMD_NAND Make 烧写进NOR flash file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 看结果能正常显示!!!!! C. 修改代码支持NAND FLASH 原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K). 1. 通过grep "\-pie" * -nR 搜索 arch/arm/config.mk:75:LDFLAGS_u-boot+= -pie vi arch/arm/config.mk +75 ifndef CONFIG_NAND_SPL #LDFLAGS_u-boot += -pie Endif 2. 添加一个 init.c文件进U-BOOT工程 把文件放入board/Samsung/smdk2440文件夹 修改当前目录里的Makefile viboard/samsung/smdk2440/Makefile 添加:COBJS := smdk2410.o init.o Init.c 代码 /* NAND FLASH控制器 */ #define NFCONF (*((volatile unsigned long*)0x4E000000)) #define NFCONT (*((volatile unsigned long*)0x4E000004)) #define NFCMMD (*((volatile unsigned char*)0x4E00000  ) #define NFADDR (*((volatile unsigned char*)0x4E00000C)) #define NFDATA (*((volatile unsigned char*)0x4E000010)) #define NFSTAT (*((volatile unsigned char*)0x4E000020)) void nand_read_ll(unsigned int addr,unsigned char *buf, unsigned int len); static int isBootFromNorFlash(void) { volatileint *p = (volatile int *)0; intval; val= *p; *p= 0x12345678; if(*p == 0x1234567  { /*写成功, 是nand启动 */ *p= val; return0; } else { /*NOR不能像内存一样写 */ return1; } } void copy_code_to_sdram(unsigned char *src,unsigned char *dest, unsigned int len) { inti = 0; /*如果是NOR启动 */ if(isBootFromNorFlash()) { while(i < len) { dest= src; i++; } } else { nand_read_ll((unsignedint)src, dest, len); } } void clear_bss(void) { externint __bss_start, __bss_end; int*p = &__bss_start; for(; p < &__bss_end; p++) *p= 0; } void nand_init_ll(void) { #define TACLS 0 #define TWRPH0 1 #define TWRPH1 0 /*设置时序 */ NFCONF= (TACLS<<12)|(TWRPH0<<  |(TWRPH1<<4); /*使能NAND Flash控制器, 初始化ECC, 禁止片选 */ NFCONT= (1<<4)|(1<<1)|(1<<0); } static void nand_select(void) { NFCONT&= ~(1<<1); } static void nand_deselect(void) { NFCONT|= (1<<1); } static void nand_cmd(unsigned char cmd) { volatileint i; NFCMMD= cmd; for(i = 0; i < 10; i++); } static void nand_addr(unsigned int addr) { unsignedint col = addr % 2048; unsignedint page = addr / 2048; volatileint i; NFADDR= col & 0xff; for(i = 0; i < 10; i++); NFADDR= (col >>  & 0xff; for(i = 0; i < 10; i++); NFADDR = page & 0xff; for(i = 0; i < 10; i++); NFADDR = (page >>  & 0xff; for(i = 0; i < 10; i++); NFADDR = (page >> 16) & 0xff; for(i = 0; i < 10; i++); } static void nand_wait_ready(void) { while(!(NFSTAT & 1)); } static unsigned char nand_data(void) { returnNFDATA; } void nand_read_ll(unsigned int addr,unsigned char *buf, unsigned int len) { intcol = addr % 2048; inti = 0; /*1. 选中 */ nand_select(); while(i < len) { /*2. 发出读命令00h */ nand_cmd(0x00); /*3. 发出地址(分5步发出) */ nand_addr(addr); /*4. 发出读命令30h */ nand_cmd(0x30); /*5. 判断状态 */ nand_wait_ready(); /*6. 读数据 */ for(; (col < 204  && (i < len); col++) { buf= nand_data(); i++; addr++; } col= 0; } /*7. 取消选中 */ nand_deselect(); } 3. 修改start.S 的重定位代码 ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ bl nand_init_ll mov r0, #0 //源地址 ldr r1, _TEXT_BASE //目地地址 ldr r2, _bss_start_ofs //长度 bl copy_code_to_sdram //拷贝代码 bl clear_bss //清除BSS ldr pc, =call_board_init_f //从片内内存掉到SDRAM执行 /* Set stackpointer in internal RAM tocall board_init_f */ call_board_init_f: ldr r0,=0x00000000 bl board_init_f ldr r1, _TEXT_BASE //第二阶段board_init_r(第二个参数) bl board_init_r //跳到第二阶段函数 修改arch\arm\lib\Board.c里的这个 board_init_f 函数,让它有返回值,作为第二阶段board_init_r(第一个参数)保存到r0 里面 unsigned int board_init_f(ulong bootflag) return(unsigned int ) id; 4. 修改目地地址 include\configs\Smdk2440.h 设置为:#define CONFIG_SYS_TEXT_BASE 0x33f80000 //512K 后续还会修改,这只是个自己假设的值.后续编译得出的U-BOOT二进制文件远超过设定的0x33f80000 最终定位:#define CONFIG_SYS_TEXT_BASE 0x33f80000 //1M 5. 删除arch\arm\lib\Board.c //relocate_code(addr_sp,id, addr); 6. 删除start.S里的这一段代码: /*------------------------------------------------------------------------------*/ *void relocate_code (addr_sp, gd, addr_moni) * ………………… ………………… .globl relocate_code relocate_code: mov r4, r0 /*save addr_sp */ ………………….. …………………… blred_led_on #endif 7. 修改链接脚本把 start.S,init.c, lowlevel.S等文件放在最前面 find-name "u-boot.lds" vi ./arch/arm/cpu/u-boot.lds: .text : { __image_copy_start = .; CPUDIR/start.o(.text) 添加:board/samsung/smdk2440/libsmdk2440.o(.text) *(.text) } Make一下 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 提示定义的board_init_f 函数与include/common.h:276行 类型不相同 处理措施: 修改:unsignedint board_init_f (ulong) ; void board_init_r (gd_t *, ulong) ; make 一下 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 提示找不到这个nand_info 处理措施: 8. //addr -= gd->mon_len; //addr &= ~(4096 - 1); addr = CONFIG_SYS_TEXT_BASE; file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg D 修改代码支持NOR FLASH 搜索“Flash:” 找到arch\arm\lib\Board.c //puts(failed); //hang(); puts("0KB"  ; file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg 后续继续更新。。。。。。。。。。。。。。。。
|