学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

aokikyon 发表于 2009-8-19 22:50

nor启动的u-boot已经搞定

<p>U-Boot 1.1.6 (Aug 19 2009 - 22:36:49) for SMDK6410</p><p>****************************************<br/>**&nbsp;&nbsp;&nbsp; UT-S3C6410 Nor boot v2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **<br/>****************************************</p><p>CPU:&nbsp;&nbsp;&nbsp;&nbsp; <a href="mailto:S3C6410@666MHz">S3C6410@666MHz</a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fclk = 666MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (ASYNC Mode) <br/>Board:&nbsp;&nbsp; SMDK6410<br/>DRAM:&nbsp;&nbsp;&nbsp; 128 MB<br/>Flash:&nbsp;&nbsp; 1 MB<br/>NAND:&nbsp;&nbsp;&nbsp; 256 MB <br/>In:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Out:&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Err:&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>kyon6410 # flinfo</p><p>Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)<br/>&nbsp; Size: 1 MB in 19 Sectors<br/>&nbsp; Sector Start Addresses:<br/>&nbsp;&nbsp;&nbsp; 10000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10004000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10006000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10008000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10010000&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; 10020000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10030000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10040000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10050000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10060000&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; 10070000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10080000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10090000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100A0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100B0000&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; 100C0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100D0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100E0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100F0000&nbsp;&nbsp;&nbsp;&nbsp; <br/>kyon6410 # </p><p></p><p>明天上教程</p>

aokikyon 发表于 2009-8-21 11:00

<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&nbsp;&nbsp; 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:&nbsp;&nbsp; 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 &amp;= ~(0xf);&nbsp;&nbsp;&nbsp;&nbsp; //nor<br/>SROM_BW_REG |= (1&lt;&lt;3) | (1&lt;&lt;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/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFG_FLASH_BASE,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFG_FLASH_BASE + monitor_flash_len - 1,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;flash_info[0]);</font></p><p><font color="#000000">flash_protect (FLAG_PROTECT_SET,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFG_ENV_ADDR,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &amp;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&nbsp;&nbsp;<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: &nbsp;&nbsp; 初始话串口<br/>找到输出'O'的代码<br/>ldr r1, =0x4f4f4f4f<br/>str r1, [r0, #UTXH_OFFSET]&nbsp;&nbsp; @'O'<br/>nand_asm_init:&nbsp;&nbsp; 初始话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&nbsp;&nbsp; /* r0 &lt;- current base addr of code */<br/>ldr r2, _TEXT_BASE&nbsp;&nbsp; /* r1 &lt;- original base addr in ram */<br/>bic r2, r2, r0&nbsp;&nbsp; /* r0 &lt;- current base addr of code */<br/>cmp&nbsp;&nbsp;&nbsp;&nbsp; r1, r2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* compare r0, r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>beq&nbsp;&nbsp;&nbsp;&nbsp; after_copy&nbsp;&nbsp; /* r0 == r1 then skip flash copy&nbsp;&nbsp; */</font></p><p><font color="#000000">#ifdef CONFIG_BOOT_NOR&nbsp;&nbsp;&nbsp; /* relocate U-Boot to RAM */<br/>adr r0, _start&nbsp;&nbsp; /* r0 &lt;- current position of code&nbsp;&nbsp; */<br/>ldr r1, _TEXT_PHY_BASE /* r1 &lt;- destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>ldr r2, _armboot_start<br/>ldr r3, _bss_start<br/>sub r2, r3, r2&nbsp;&nbsp; /* r2 &lt;- size of armboot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br/>add r2, r0, r2&nbsp;&nbsp; /* r2 &lt;- source end address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</font></p><p><font color="#000000">nor_copy_loop:<br/>ldmia r0!, {r3-r10}&nbsp;&nbsp; /* copy from source address [r0]&nbsp;&nbsp;&nbsp; */<br/>stmia r1!, {r3-r10}&nbsp;&nbsp; /* copy to&nbsp;&nbsp; target address [r1]&nbsp;&nbsp;&nbsp; */<br/>cmp r0, r2&nbsp;&nbsp;&nbsp; /* until source end addreee [r2]&nbsp;&nbsp;&nbsp; */<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/>**&nbsp;&nbsp;&nbsp; UT-S3C6410 Nor boot v2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **<br/>****************************************</font></p><p><font color="#000000">CPU:&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="mailto:S3C6410@666MHz"><font color="#000000">S3C6410@666MHz</font></a><br/><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fclk = 666MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (ASYNC Mode) <br/>Board:&nbsp;&nbsp; SMDK6410<br/>DRAM:&nbsp;&nbsp;&nbsp; 128 MB<br/>Flash:&nbsp;&nbsp; 1 MB<br/>NAND:&nbsp;&nbsp;&nbsp; 256 MB <br/>In:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Out:&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>Err:&nbsp;&nbsp;&nbsp;&nbsp; serial<br/>kyon6410 #</font></p>
[align=right][color=#000066][此贴子已经被作者于2009-8-21 11:01:07编辑过][/color][/align]

zb7401 发表于 2009-10-18 20:31

能上传一个uboot吗?

函澜骟 发表于 2010-4-7 16:34

[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]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0