nor启动的u-boot已经搞定
<p>U-Boot 1.1.6 (Aug 19 2009 - 22:36:49) for SMDK6410</p><p>****************************************<br/>** UT-S3C6410 Nor boot v2 **<br/>****************************************</p><p>CPU: <a href="mailto:S3C6410@666MHz">S3C6410@666MHz</a><br/> Fclk = 666MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (ASYNC Mode) <br/>Board: SMDK6410<br/>DRAM: 128 MB<br/>Flash: 1 MB<br/>NAND: 256 MB <br/>In: serial<br/>Out: serial<br/>Err: serial<br/>kyon6410 # flinfo</p><p>Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)<br/> Size: 1 MB in 19 Sectors<br/> Sector Start Addresses:<br/> 10000000 10004000 10006000 10008000 10010000 <br/> 10020000 10030000 10040000 10050000 10060000 <br/> 10070000 10080000 10090000 100A0000 100B0000 <br/> 100C0000 100D0000 100E0000 100F0000 <br/>kyon6410 # </p><p></p><p>明天上教程</p> <p><font color="#000000">查看开发板硬件原理图,发现使用的nor flash芯片是am29lv160DB,2MByte,但是由于a20被ddr占用,只连接了a0-a18这19根数据线,也就是只能使用1Mbyte空间。</font></p><p><font color="#000000">既然只有1Mbyte空间,应该和am29lv800这颗芯片的使用方法兼容,查看smdk6410.h,发现启动有AMD_LV800相关的定义,smdk6410文件夹中的flash.c文件也是针对AMD_LV800的,看来使用nor芯片的难度不大。</font></p><p><font color="#000000">1 为u-boot添加nor驱动支持<br/>1)修改smdk6410.h文件<br/>确认打开宏定义#define CONFIG_AMD_LV800</font></p><p><font color="#000000">修改#define CFG_FLASH_BASE 0x10000000 <br/>根据原理图,nor芯片使用CSn[0]片选,基址0x10000000</font></p><p><font color="#000000">修改#define CFG_MAX_FLASH_BANKS 1 <br/>至少有一颗nor芯片</font></p><p><font color="#000000">修改#define CFG_MAX_FLASH_SECT 19 <br/>nor flash大小</font></p><p><font color="#000000">2)重新编译下载后,启动能够识别出nor flash芯片<br/>Flash: 1 MB<br/>但是任何操作均没有响应</font></p><p><font color="#000000">3)查看flash.c源码,发现只要定义CONFIG_AMD_LV800,在flash_init中就会对nor参数进行赋值,并没有从芯片读取数据。<br/>也就说目前并没有真正从nor flash芯片中读到数据。</font></p><p><font color="#000000">4)开始怀疑bank宽度设置不正确,因为前面做dm9000ae时就需要将bank宽度设置为16。<br/>查看s3c6410数据手册,发现CSn[0]的bank宽度又H/W控制,如果配置nor启动,能够正确设置,但我目前还是nand启动。。。<br/>调用printf,在启动时打印出SROM_BW_REG的值,是0xd0,果然,只初始化了CSn[1],CSn[0]还是停留在8bit宽带</font></p><p><font color="#000000">5)参考dm9000的初始化,修改smdk6410.c文件<br/>SROM_BW_REG &= ~(0xf); //nor<br/>SROM_BW_REG |= (1<<3) | (1<<2) | (1);<br/>添加初始化带宽代码,当然也可以修改SROM_BC0_REG,优化时序,也可以使用默认值。</font></p><p><font color="#000000">6)重新编译后,nor flash可以使用!<br/>nor 开头会被默认设置为RO,每次要unprotect比较烦,可以注释掉flash.c中flash_init相关代码<br/>/*<br/>flash_protect (FLAG_PROTECT_SET,<br/> CFG_FLASH_BASE,<br/> CFG_FLASH_BASE + monitor_flash_len - 1,<br/> &flash_info[0]);</font></p><p><font color="#000000">flash_protect (FLAG_PROTECT_SET,<br/> CFG_ENV_ADDR,<br/> CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);<br/>*/</font></p><p><br/><font color="#000000">2 为u-boot添加nor启动<br/>其实nor启动比nand启动简单多了,因为程序可以直接在nor中运行,通过简单的搬运代码将自身搬运到ram中即可。</font></p><p><font color="#000000">1)修改smdk6410.h文件<br/>#define CONFIG_BOOT_NOR <br/>//#define CONFIG_BOOT_NAND<br/>将nand_boot改为nor_boot</font></p><p><font color="#000000">注释掉下面内容<br/>//# error Define one of CONFIG_BOOT_{NAND|MOVINAND|ONENAND|ONENAND_IROM}</font></p><p><font color="#000000">还有个宏不知道是否有用,也打开<br/>#define CONFIG_USE_NOR_BOOT</font></p><p><font color="#000000">2)重新编译,将内容烧到nor flash的开头(用cp.b比较方便)<br/>将启动方式改为nor(1010)<br/>上电后发现只能显示“OK”就没有内容了,郁闷<br/>用si搜索了ok,没发现相关代码,估计这个ok使用asicii代码输出的(后面印证确实如此)</font></p><p><font color="#000000">3)无奈跟u-boot启动代码<br/>首先是执行s3c64xx的start.s文件<br/>下面是代码执行顺序<br/>_start:<br/>reset:<br/>cpu_init_crit:<br/>bl lowlevel_init<br/>这句bl 跳转到lowlevel_init.S初始化处理器代码,如果将其屏蔽掉,就没有OK了</font></p><p><font color="#000000">4)跳转到lowlevel_init.s文件<br/>lowlevel_init:<br/>bl mem_ctrl_asm_init (这段在cpu_init.s中)<br/>wakeup_reset:<br/>system_clock_init: 初始化时钟,就是上次改666频率那段汇编<br/>uart_asm_init: 初始话串口<br/>找到输出'O'的代码<br/>ldr r1, =0x4f4f4f4f<br/>str r1, [r0, #UTXH_OFFSET] @'O'<br/>nand_asm_init: 初始话nand基本代码<br/>最后找到输出'K'的代码<br/>ldr r0, =ELFIN_UART_BASE<br/>ldr r1, =0x4b4b4b4b<br/>str r1, [r0, #UTXH_OFFSET]<br/>这段代码可用来跟踪初始化流程!</font></p><p><font color="#000000">5)回到start.s,下面的代码实现搬运<br/>/*<br/>* Go setup Memory and board specific bits prior to relocation.<br/>*/<br/>bl lowlevel_init /* go setup pll,mux,memory */</font></p><p><font color="#000000">/* when we already run in ram, we don't need to relocate U-Boot.<br/>* and actually, memory controller must be configured before U-Boot<br/>* is running in ram.<br/>*/<br/>ldr r0, =0xff000fff<br/>bic r1, pc, r0 /* r0 <- current base addr of code */<br/>ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */<br/>bic r2, r2, r0 /* r0 <- current base addr of code */<br/>cmp r1, r2 /* compare r0, r1 */<br/>beq after_copy /* r0 == r1 then skip flash copy */</font></p><p><font color="#000000">#ifdef CONFIG_BOOT_NOR /* relocate U-Boot to RAM */<br/>adr r0, _start /* r0 <- current position of code */<br/>ldr r1, _TEXT_PHY_BASE /* r1 <- destination */<br/>ldr r2, _armboot_start<br/>ldr r3, _bss_start<br/>sub r2, r3, r2 /* r2 <- size of armboot */<br/>add r2, r0, r2 /* r2 <- source end address */</font></p><p><font color="#000000">nor_copy_loop:<br/>ldmia r0!, {r3-r10} /* copy from source address [r0] */<br/>stmia r1!, {r3-r10} /* copy to target address [r1] */<br/>cmp r0, r2 /* until source end addreee [r2] */<br/>ble nor_copy_loop</font></p><p><font color="#000000">ldr r0, =ELFIN_UART_BASE //在这儿输出'1',是可以的,说明搬运完成,代码应该已经到ram中<br/>ldr r1, =0x31313131<br/>str r1, [r0, #UTXH_OFFSET]</font></p><p><font color="#000000">b after_copy</font></p><p><font color="#000000">after_copy:<br/>enable_mmu: //打开mmu<br/>ldr r0, =ELFIN_UART_BASE //在这儿输出'2',也可以,说明mmu打开正常<br/>ldr r1, =0x32323232<br/>str r1, [r0, #UTXH_OFFSET]<br/>stack_setup: //初始化堆栈<br/>clear_bss:<br/>ldr r0, =ELFIN_UART_BASE<br/>ldr r1, =0x33333333<br/>str r1, [r0, #UTXH_OFFSET] //在这儿输出'3',也可以,下面就要跳转到c代码了!</font></p><p><font color="#000000">ldr pc, _start_armboot<br/>_start_armboot:<br/>.word start_armboot</font></p><p><font color="#000000">6)start_armboot位于lib_arm/board.c<br/>void start_armboot (void)<br/>在line289添加puts("a");后,竟然也可以输出,orz,然后,整个u-boot就莫名其妙的好了。。怀疑还是和总线时序配置有关,待查</font></p><p><font color="#000000">OK123a</font></p><p><font color="#000000">U-Boot 1.1.6 (Aug 19 2009 - 22:36:49) for SMDK6410</font></p><p><font color="#000000">****************************************<br/>** UT-S3C6410 Nor boot v2 **<br/>****************************************</font></p><p><font color="#000000">CPU: </font><a href="mailto:S3C6410@666MHz"><font color="#000000">S3C6410@666MHz</font></a><br/><font color="#000000"> Fclk = 666MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (ASYNC Mode) <br/>Board: SMDK6410<br/>DRAM: 128 MB<br/>Flash: 1 MB<br/>NAND: 256 MB <br/>In: serial<br/>Out: serial<br/>Err: serial<br/>kyon6410 #</font></p>[align=right][color=#000066][此贴子已经被作者于2009-8-21 11:01:07编辑过][/color][/align] 能上传一个uboot吗? [font=楷体_GB2312][color=red][color=red][b][font=宋体][size=5]
[/size][/font][/b][color=red][/color]
[color=red][size=5]资费随着地方走,长途也可变市话[/size]
[/color][/color][color=red][color=red][/color][/color][color=red][color=red][url=http://www.ykdhzj.com/viewthread.php?tid=5][font=宋体][size=5][color=blue][b]http://www.ykdhzj.com/viewthread.php?tid=5[/b][/color][/size][/font][/url][/color][/color]
[/color][/font]
页:
[1]