[ZLG-ARM] u-boot学习报告(下)

[复制链接]
 楼主| armqt 发表于 2009-7-9 13:32 | 显示全部楼层 |阅读模式
接u-boot学习报告(上)<br /><br />2.&nbsp;Board.c<br />源码位置:lib_arm/board.c<br />运行位置:SDRAM<br />描述:start_armboard()是u-boot运行的第一个c语言函数,完成系统的初始化工作,进入主循环,处理用户的命令。<br />void&nbsp;start_armboot&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init_fnc_t&nbsp;**init_fnc_ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*s;<br />#ifndef&nbsp;CFG_NO_FLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;size;<br />#endif<br />#if&nbsp;defined(CONFIG_VFD)&nbsp;||&nbsp;defined(CONFIG_LCD)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;addr;<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Pointer&nbsp;is&nbsp;writable&nbsp;since&nbsp;we&nbsp;allocated&nbsp;a&nbsp;register&nbsp;for&nbsp;it&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd&nbsp;=&nbsp;(gd_t*)(_armboot_start&nbsp;-&nbsp;CFG_MALLOC_LEN&nbsp;-&nbsp;sizeof(gd_t));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;compiler&nbsp;optimization&nbsp;barrier&nbsp;needed&nbsp;for&nbsp;GCC&nbsp;&gt=&nbsp;3.4&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;__volatile__('':&nbsp;:&nbsp;:'memory');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset&nbsp;((void*)gd,&nbsp;0,&nbsp;sizeof&nbsp;(gd_t));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtbd&nbsp;=&nbsp;(bd_t*)((char*)gd&nbsp;-&nbsp;sizeof(bd_t));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset&nbsp;(gd-&gtbd,&nbsp;0,&nbsp;sizeof&nbsp;(bd_t));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;monitor_flash_len&nbsp;=&nbsp;_bss_start&nbsp;-&nbsp;_armboot_start;<br /><br /><br />/*&nbsp;顺序执行init_sequence数组中的初始化函数&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(init_fnc_ptr&nbsp;=&nbsp;init_sequence;&nbsp;*init_fnc_ptr;&nbsp;++init_fnc_ptr)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((*init_fnc_ptr)()&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hang&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#ifndef&nbsp;CFG_NO_FLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置可用的Flash*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;flash_init&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_flash_config&nbsp;(size);<br />#endif&nbsp;/*&nbsp;CFG_NO_FLASH&nbsp;*/<br /><br />#ifdef&nbsp;CONFIG_VFD<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifndef&nbsp;PAGE_SIZE<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;define&nbsp;PAGE_SIZE&nbsp;4096<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;reserve&nbsp;memory&nbsp;for&nbsp;VFD&nbsp;display&nbsp;(always&nbsp;full&nbsp;pages)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;bss_end&nbsp;is&nbsp;defined&nbsp;in&nbsp;the&nbsp;board-specific&nbsp;linker&nbsp;script&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(_bss_end&nbsp;+&nbsp;(PAGE_SIZE&nbsp;-&nbsp;1))&nbsp;&&nbsp;~(PAGE_SIZE&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;vfd_setmem&nbsp;(addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtfb_base&nbsp;=&nbsp;addr;<br />#endif&nbsp;/*&nbsp;CONFIG_VFD&nbsp;*/<br /><br />#ifdef&nbsp;CONFIG_LCD<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifndef&nbsp;PAGE_SIZE<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;define&nbsp;PAGE_SIZE&nbsp;4096<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;reserve&nbsp;memory&nbsp;for&nbsp;LCD&nbsp;display&nbsp;(always&nbsp;full&nbsp;pages)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;bss_end&nbsp;is&nbsp;defined&nbsp;in&nbsp;the&nbsp;board-specific&nbsp;linker&nbsp;script&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;(_bss_end&nbsp;+&nbsp;(PAGE_SIZE&nbsp;-&nbsp;1))&nbsp;&&nbsp;~(PAGE_SIZE&nbsp;-&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;lcd_setmem&nbsp;(addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtfb_base&nbsp;=&nbsp;addr;<br />#endif&nbsp;/*&nbsp;CONFIG_LCD&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;armboot_start&nbsp;在u-boot.lds连接脚本中定义*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_malloc_init&nbsp;(_armboot_start&nbsp;-&nbsp;CFG_MALLOC_LEN);<br /><br />#if&nbsp;(CONFIG_COMMANDS&nbsp;&&nbsp;CFG_CMD_NAND)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;('NAND:&nbsp;&nbsp;');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nand_init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;go&nbsp;init&nbsp;the&nbsp;NAND&nbsp;*/<br />#endif<br /><br />#ifdef&nbsp;CONFIG_HAS_DATAFLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91F_DataflashInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataflash_print_info();<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;initialize&nbsp;environment&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env_relocate&nbsp;();<br /><br />#ifdef&nbsp;CONFIG_VFD<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;must&nbsp;do&nbsp;this&nbsp;after&nbsp;the&nbsp;framebuffer&nbsp;is&nbsp;allocated&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drv_vfd_init();<br />#endif&nbsp;/*&nbsp;CONFIG_VFD&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;IP&nbsp;Address&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtbd-&gtbi_ip_addr&nbsp;=&nbsp;getenv_IPaddr&nbsp;('ipaddr');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;MAC&nbsp;Address&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ulong&nbsp;reg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*s,&nbsp;*e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;tmp[64];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;getenv_r&nbsp;('ethaddr',&nbsp;tmp,&nbsp;sizeof&nbsp;(tmp));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;(i&nbsp;&gt&nbsp;0)&nbsp;?&nbsp;tmp&nbsp;:&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(reg&nbsp;=&nbsp;0;&nbsp;reg&nbsp;&lt&nbsp;6;&nbsp;++reg)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtbd-&gtbi_enetaddr[reg]&nbsp;=&nbsp;s&nbsp;?&nbsp;simple_strtoul&nbsp;(s,&nbsp;&e,&nbsp;16)&nbsp;:&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;(*e)&nbsp;?&nbsp;e&nbsp;+&nbsp;1&nbsp;:&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#ifdef&nbsp;CONFIG_HAS_ETH1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;getenv_r&nbsp;('eth1addr',&nbsp;tmp,&nbsp;sizeof&nbsp;(tmp));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;(i&nbsp;&gt&nbsp;0)&nbsp;?&nbsp;tmp&nbsp;:&nbsp;NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(reg&nbsp;=&nbsp;0;&nbsp;reg&nbsp;&lt&nbsp;6;&nbsp;++reg)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gd-&gtbd-&gtbi_enet1addr[reg]&nbsp;=&nbsp;s&nbsp;?&nbsp;simple_strtoul&nbsp;(s,&nbsp;&e,&nbsp;16)&nbsp;:&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;(*e)&nbsp;?&nbsp;e&nbsp;+&nbsp;1&nbsp;:&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;devices_init&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;get&nbsp;the&nbsp;devices&nbsp;list&nbsp;going.&nbsp;*/<br /><br />#ifdef&nbsp;CONFIG_CMC_PU2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;load_sernum_ethaddr&nbsp;();<br />#endif&nbsp;/*&nbsp;CONFIG_CMC_PU2&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jumptable_init&nbsp;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console_init_r&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;fully&nbsp;init&nbsp;console&nbsp;as&nbsp;a&nbsp;device&nbsp;*/<br /><br />#if&nbsp;defined(CONFIG_MISC_INIT_R)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;miscellaneous&nbsp;platform&nbsp;dependent&nbsp;initialisations&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;misc_init_r&nbsp;();<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;enable&nbsp;exceptions&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable_interrupts&nbsp;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Perform&nbsp;network&nbsp;card&nbsp;initialisation&nbsp;if&nbsp;necessary&nbsp;*/<br />#ifdef&nbsp;CONFIG_DRIVER_CS8900<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs8900_get_enetaddr&nbsp;(gd-&gtbd-&gtbi_enetaddr);<br />#endif<br /><br />#if&nbsp;defined(CONFIG_DRIVER_SMC91111)||defined&nbsp;(CONFIG_DRIVER_LAN91C96)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(getenv&nbsp;('ethaddr'))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smc_set_mac_addr(gd-&gtbd-&gtbi_enetaddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#endif&nbsp;/*&nbsp;CONFIG_DRIVER_SMC91111&nbsp;||&nbsp;CONFIG_DRIVER_LAN91C96&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;from&nbsp;environment&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((s&nbsp;=&nbsp;getenv&nbsp;('loadaddr'))&nbsp;!=&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;load_addr&nbsp;=&nbsp;simple_strtoul&nbsp;(s,&nbsp;NULL,&nbsp;16);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#if&nbsp;(CONFIG_COMMANDS&nbsp;&&nbsp;CFG_CMD_NET)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((s&nbsp;=&nbsp;getenv&nbsp;('bootfile'))&nbsp;!=&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy_filename&nbsp;(BootFile,&nbsp;s,&nbsp;sizeof&nbsp;(BootFile));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;CFG_CMD_NET&nbsp;*/<br /><br />#ifdef&nbsp;BOARD_LATE_INIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;board_late_init&nbsp;();<br />#endif<br />#if&nbsp;(CONFIG_COMMANDS&nbsp;&&nbsp;CFG_CMD_NET)<br />#if&nbsp;defined(CONFIG_NET_MULTI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;('Net:&nbsp;&nbsp;&nbsp;');<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eth_initialize(gd-&gtbd);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;main_loop()&nbsp;can&nbsp;return&nbsp;to&nbsp;retry&nbsp;autoboot,&nbsp;if&nbsp;so&nbsp;just&nbsp;run&nbsp;it&nbsp;again.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main_loop&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;NOTREACHED&nbsp;-&nbsp;no&nbsp;way&nbsp;out&nbsp;of&nbsp;command&nbsp;loop&nbsp;except&nbsp;booting&nbsp;*/<br />}<br /><br />3.&nbsp;Init_sequence[]<br />Init_sequence数组中保存系统启动过程顺序初始化的函数指针。<br />init_fnc_t&nbsp;*init_sequence[]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpu_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;基本处理器相关配置&nbsp;&nbsp;--&nbsp;cpu/arm920t/cpu.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;board_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;基本的板级相关配置—board/smdk2410/smdk2410.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interrupt_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;初始化异常处理&nbsp;–&nbsp;cpu/arm920t/s3c24x0/interrupt.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;env_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;初始化环境变量&nbsp;–&nbsp;common/cmd_flash.c*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init_baudrate,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;初始化波特率设置&nbsp;&nbsp;--&nbsp;lib_arm/board.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serial_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;串口通讯设置&nbsp;&nbsp;--cpu/arm920t/s3c24x0/serial.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console_init_f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;控制台初始化阶段1&nbsp;–common/console.c*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_banner,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;打印u-boot信息&nbsp;&nbsp;--lib_arm/board.c*/<br />#if&nbsp;defined(CONFIG_DISPLAY_CPUINFO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_cpuinfo,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;display&nbsp;cpu&nbsp;info&nbsp;(and&nbsp;speed)&nbsp;*/<br />#endif<br />#if&nbsp;defined(CONFIG_DISPLAY_BOARDINFO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkboard,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;display&nbsp;board&nbsp;info&nbsp;*/<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dram_init,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置可用的RAM&nbsp;&nbsp;--board/smdk2410/smdk2410.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_dram_config,&nbsp;&nbsp;/*显示RAM的配置大小&nbsp;–&nbsp;lib_arm/board.c&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br />};<br /><br />3.<br />u-boot移植过程3.1.<br />准备工作俗话说工欲善其事,必先利其器。在移植u-boot之前,第一步要做的事情就是要搭建移植过程所必需的软硬件环境。<br />3.1.1.<br />软件环境操作系统:Red&nbsp;Hat&nbsp;9.0&nbsp;<br />虚拟机:VMware5.5&nbsp;workstation<br />交叉编译器:ELDK4.1<br />U-Boot源码:u-boot-1.2.0<br />烧写软件:sjf2410或者JFlash<br />3.1.2.<br />硬件环境PC机<br />目标开发板<br />串口线<br />网线<br />JTAG下载线<br />3.1.3.<br />目标板的硬件构架我们要清楚地掌握目标板的硬件配置,如CPU体系结构;FALSH,SDRAM的型号;串口和以太网控制芯片;运行前和运行过程内存空间的映射关系;目标板的启动方式等等。可以参阅目标板的数据手册获得这些方面的相关信息。<br />以Samsung&nbsp;S3c2410开发板为例。<br />CPU:&nbsp;arm920t<br />SoC:&nbsp;S3C2410<br />SDRAM:&nbsp;HY57V561620<br />Nand&nbsp;flash:&nbsp;K9F1208U0B(64M)<br />以太网芯片:&nbsp;CS8900A(10M/100MB)<br />S3C2410复位后内存映射图如下:<br /><br /><br />3.2.<br />移植步骤U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。<br />开始移植U-Boot之前,先要熟悉硬件电路板和处理器。确认U-Boot是否已经支持新开发板的处理器和I/O设备。假如U-Boot已经支持一块非常相似的电路板,那么移植的过程将非常简单。<br />移植U-Boot工作就是添加开发板硬件相关的文件、配置选项,然后配置编译。<br />开始移植之前,需要先分析一下U-Boot已经支持的开发板,比较出硬件配置最接近的开发板。选择的原则是,首先处理器相同,其次处理器体系结构相同,然后是以太网接口等外围接口。还要验证一下这个参考开发板的U-Boot,至少能够配置编译通过。<br />以S3C2410处理器的开发板为例,U-Boot-1.1.2版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。<br />我们以基于S3C2410SoC的开发板fs2410为例说明。移植的过程参考SMDK2410开发板,SMDK2410在U-Boot-1.1.2中已经支持。<br />移植U-Boot的基本步骤如下。<br />(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。<br />smdk2410_config&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unconfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;arm920t&nbsp;smdk2410&nbsp;NULL&nbsp;s3c24x0<br />参考上面2行,添加下面2行。<br />fs2410_config&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unconfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;arm920t&nbsp;fs2410&nbsp;NULL&nbsp;s3c24x0<br />(2)创建一个新目录存放开发板相关的代码,并且添加文件。<br />board/fs2410/config.mk<br />board/fs2410/flash.c<br />board/fs2410/fs2410.c<br />board/fs2410/Makefile<br />board/fs2410/lowlevel_init.S<br />board/fs2410/u-boot.lds<br />(3)为开发板添加新的配置文件<br />可以先复制参考开发板的配置文件,再修改。例如:<br />$cp&nbsp;include/configs/smdk2410.h&nbsp;&nbsp;include/configs/fs2410.h<br />如果是为一颗新的CPU移植,还要创建一个新的目录存放CPU相关的代码。<br />(4)配置开发板<br />$&nbsp;make&nbsp;fs2410_config<br />(5)编译U-Boot<br />执行make命令,编译成功可以得到U-Boot映像。有些错误是跟配置选项是有关系的,通常打开某些功能选项会带来一些错误,一开始可以尽量跟参考板配置相同。<br />(6)添加驱动或者功能选项<br />在能够编译通过的基础上,就可以根据目标板和实际开发需要,实现U-Boot的以太网接口、Flash擦写、LCD、NVRAM等一些其它功能。<br />由于FS2410开发板的以太网驱动和smdk2410完全相同,所以可以直接使用。CS8900驱动程序文件如下。<br />drivers/cs8900.c<br />drivers/cs8900.h<br />如果目标板上的以太网控制器xxx与参考板上的不同,按照以下的步骤添加网卡驱动。<br />①查找对应于开发板上的以太网控制器的驱动程序,如果可以找到万事大吉,否则自己编写。<br />②拷贝驱动程序到drivers目录下,如:drivers/xxx.c<br />drivers/xxx.h<br />③在drivers/Makefile&nbsp;里添加目标文件&nbsp;xxx.o<br />④将lib_arm/board.c文件中所有的cs8900换成xxx&nbsp;也就是<br />cs8900=〉xxx<br />⑤在include/configs/fs2410..h中加入以下几句<br />#define&nbsp;xxx_BASE&nbsp;&gt;&gt;&gt;&gt;<br />#define&nbsp;xxx_BUS16&nbsp;1<br />#define&nbsp;CONFIG_ETHADDR<br />&gt;&gt;:&gt;&gt;:&gt;&gt;:&gt;&gt;:&gt;&gt;:&gt;&gt;<br />#define&nbsp;CONFIG_NETMASK<br />&gt;&gt;.&gt;&gt;.&gt;&gt;.&gt;&gt;<br />#define&nbsp;CONFIG_IPADDR<br />&gt;&gt;.&gt;&gt;.&gt;&gt;.&gt;&gt;<br />#define&nbsp;CONFIG_SERVERIP<br />&gt;&gt;.&gt;&gt;.&gt;&gt;.&gt;&gt;<br /><br />对于Flash的选择就麻烦多了,Flash芯片价格或者采购方面的因素都有影响。多数开发板大小、型号不都相同。所以还需要移植Flash的驱动。每种开发板目录下一般都有flash.c这个文件,需要根据具体的Flash类型修改。例如:<br />board/fs2410/flash.c<br />(7)添加命令<br />为了方便以后的某项操作,如kernel的更新,需要将新编译的kernel写入flash中,这是u-boot提供的flash擦除和写入命令就能够很好完成这项工作。当然u-boot已经提供了许多常用的命令,如上面提到的flash擦、写命令。尽管如此,不管出于什么目的,我们还是可以定义我们自己的命令。<br />原理:<br />每个命令都有一个命令结构体<br />struct&nbsp;cmd_tbl_s&nbsp;{<br />char*name;&nbsp;&nbsp;/*&nbsp;Command&nbsp;Name*/<br />intmaxargs;&nbsp;/*&nbsp;maximum&nbsp;number&nbsp;of&nbsp;arguments*/<br />intrepeatable;&nbsp;/*&nbsp;autorepeat&nbsp;allowed?*/<br />int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*cmd)(struct&nbsp;cmd_tbl_s&nbsp;*,&nbsp;int,&nbsp;int,&nbsp;char&nbsp;*[]);&nbsp;&nbsp;/*&nbsp;Implementation&nbsp;function*/<br />char*usage;/*&nbsp;Usage&nbsp;message(short)*/<br />char*help;/*&nbsp;Help&nbsp;&nbsp;message(long)*/<br />};<br />Cmd为要调用的命令函数,name为该命令名字符串。&nbsp;<br />在u-boot里面有这样的宏<br />#define&nbsp;Struct_Section&nbsp;&nbsp;__attribute__&nbsp;((unused,section&nbsp;('.u_boot_cmd')))&nbsp;<br />#define&nbsp;U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)&nbsp;\<br />cmd_tbl_t&nbsp;__u_boot_cmd_##name&nbsp;Struct_Section&nbsp;=&nbsp;{#name,&nbsp;maxargs,&nbsp;rep,&nbsp;cmd,&nbsp;usage,&nbsp;<br />help}&nbsp;<br />宏U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)就是将<br />cmd_tbl_s{<br />ame,<br />maxargs,<br />rep,<br />cmd,<br />usage,<br />help<br />}<br />这样的一个命令结构体放入内存.u_boot_cmd这个区域,.u_boot_cmd这个域在board/smdk2410/u-boot.lds中定义。在U-boot中的shell中,根据用户输入的命令,就会在.u_boot_cmd这个内存区域中查找,当.u_boot_cmd中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd(&nbsp;….)函数。&nbsp;<br />下面以添加USB下载命令为例介绍如何添加命令。<br />①在include/configs/smdk2410.h中的CONFIG_COMMANDS中增加一项:CFG_CMD_USBLOAD,&nbsp;<br />/***********************************************************<br />*&nbsp;Command&nbsp;definition<br />***********************************************************/<br />#define&nbsp;CONFIG_COMMANDS&nbsp;\<br />(CONFIG_CMD_DFL&nbsp;|&nbsp;\<br />CFG_CMD_CACHE&nbsp;|&nbsp;\<br />CFG_CMD_NET&nbsp;|&nbsp;\<br />CFG_CMD_ENV&nbsp;|&nbsp;\<br />CFG_CMD_FLASH&nbsp;|&nbsp;\<br />CFG_CMD_PING&nbsp;|&nbsp;\<br />CFG_CMD_NAND&nbsp;|&nbsp;\<br />/*CFG_CMD_EEPROM&nbsp;|*/&nbsp;\<br />/*CFG_CMD_I2C&nbsp;|*/&nbsp;\<br />/*CFG_CMD_USB&nbsp;|*/&nbsp;\<br />CFG_CMD_REGINFO&nbsp;&nbsp;|&nbsp;\<br />CFG_CMD_DATE&nbsp;|&nbsp;\<br />CFG_CMD_USBLOAD&nbsp;|\<br />CFG_CMD_ELF)&nbsp;<br />②在include/cmd_confdefs.h中加入命令标志位&nbsp;<br />#define&nbsp;CFG_CMD_USBLOAD0&nbsp;x00000055ULL&nbsp;(可以是其它值,不冲突就好)&nbsp;<br />③在common\下面加入usbload.c<br />框架如下&nbsp;<br />#If(CONFIG_COMMANDS&nbsp;&amp;&nbsp;CFG_CMD_USBLOAD)&nbsp;<br />Int&nbsp;usb_load(cmd_tbl_t&nbsp;*cmdtp,&nbsp;int&nbsp;flag,&nbsp;int&nbsp;argc,&nbsp;char&nbsp;*argv[&nbsp;]&nbsp;)<br />{&nbsp;&nbsp;&nbsp;&nbsp;………………….&nbsp;<br />}&nbsp;<br />U_BOOT_CMD{<br />Usbload,<br />2,<br /><br />1,<br />usb_load,<br />“usb&nbsp;load&nbsp;img&nbsp;file”,<br />“This&nbsp;is&nbsp;a&nbsp;test”<br />};<br />#endif&nbsp;<br />④在common/Makefile&nbsp;添加要编译的目标文件。<br />⑤重新编译u-boot。<br />(8)调试U-Boot源代码,直到U-Boot在开发板上能够正常启动。<br />3.3.<br />主要涉及修改的文件从移植U-Boot最小要求,U-Boot能正常启动的角度出发,主要考虑修改如下文件。<br />①&lt;目标板&gt;.h头文件,如include/configs/smdk2410.h。可以是U-BOOt源码中已有的目标板头文件,也可以是新命名的配置头文件;大多数的寄存器参数都是在这一文件中设置完成的。<br />②&lt;目标板&gt;.c文件,如board/smdk2410/smdk2410.c。它是SDRAM的驱动程序,主要完成SDRAM的UPM表设置,上电初始化。<br />③Flash的驱动程序,如board/smdk2410/flash.c或common/eft-flash.c。可在参考已有Flash驱动的基础上,结合目标板Flash数据手册,进行适当修改;<br />④串口驱动,如修改cpu/arm920t/s3c24x0/serial.c串口收发器芯片使能部分。<br />3.4.<br />移植要点①<br />u—Boot移植参考板,这是进行u-boot移植首先要明确的。可以根据目标板上CPU、Flash、SDRAM的情况,以尽可能相一致为原则,先找出一个与所移植目标板为同一个或同一系列处理器的u-Boot支持板为移植参考板。如上面提到fs2410板可选择U-Boot源码中smdk2410板作为U-Boot移植参考板。对U-Boot移植新手,建议依照循序渐进的原则,目标板文件名暂时先用移植参考板的名称,在逐步熟悉U-Boot移植基础上,再考虑给目标板重新命名。在实际移植过程中,可用Linux命令查找移植参考板的特定代码,如grep&nbsp;-r&nbsp;sm2410&nbsp;./&nbsp;可确定出在U-Boot中与smdk2410板有关的代码,依此对照目标板实际进行屏蔽或修改。同时,应不局限于移植参考板中的代码,要广泛借鉴U-Boot中已有的代码,更好地实现一些具体的功能。<br />②<br />U-Boot烧写地址。不同目标板,对U-Boot在Flash中存放地址的要求不尽相同。事实上,这是由处理器中断复位向量来决定的,与主板硬件相关。对MPC8XX主板来讲,就是由硬件配置字(HRCW)决定的。也就是说,U-Boot烧写具体位置是由硬件决定的,而不是程序设计来选择的。程序中相应u-Boot起始地址必须与硬件所确定的硬件复位向量相吻合,如RPXlite&nbsp;DW板的中断复位向量设置为0x00000100。因此,U-Boot的BIN镜像文件必须烧写到Flash的起始位置。事实上,大多数的PPC系列的处理器中断复位向量是0x00000100和0xfff00100。这也是一般所说的高位启动和低位启动的Bootloader所在位置。可通过修改u-boot源码&lt;目标板&gt;.h头文件中CFG_MONITOR_BASE和board/&lt;目标板&gt;/config.mk中的TEXT_BASE的设置来与硬件配置相对应。<br />③<br />CPU寄存器参数设置。根据处理器系列、类型不同,寄存器名称与作用有一定差别,必须根据目标板的实际进行合理配置。一个较为可行和有效的方法是,借鉴参考移植板的配置,再根据目标板实际,进行合理修改。这是一个较费功夫和考验耐力的过程。需要仔细对照处理器各寄存器定义、参考设置、目标板实际作出选择并不断测试。<br />④<br />串口调试。能从串口输出信息,即使是乱码,也可以说U-Boot移植取得了实质性突破。串口是否有输出,除了与串口驱动相关外,还与Flash相关的寄存器设置有关。因为u-boot是从Flash中被引导启动的,如果Flash设置不正确,U-Boot代码读取和执行就会出现一些问题。因此,还需要就Flash的相关寄存器设置进行一些参数调试。同时,要注意串口收发芯片相关引脚工作波形。<br />⑤<br />与启动Flash相关的寄存器BR0、OR0的参数设置,应根据目标板Flash的数据手册与BR0和OR0的相关位含义进行合理设置。这不仅关系到Flash能否正常工作,而且与串口调试有直接的关联。<br />⑥<br />SDRAM的驱动。串口能输出以后,u-Boot移植是否顺利基本取决于SDRAM的驱动是否正确。与串口调试相比,这部分工作更为重要,难度更大。MPC8xx目标板SDRAM驱动涉及三部分。一是相关寄存器的设置;二是UPM表;三是SDRAM上电初始化过程。任何一部分有问题,都会影响U-Boot、嵌入式操作系统甚至应用程序的稳定、可靠运行。所以说,SDRAM的驱动不仅关系到U-Boot本身能否正常运行,而且还与后续部分相关,是相当关键的部分。<br /><br />4.<br />举例说明(JK2410)这部分将详细介绍u-boot-1.1.3到JK2410目标板的移植过程。<br />4.1.<br />JK2410目标板的硬件组成Samsung&nbsp;S3c2410<br />&nbsp;JK2410<br />&nbsp;u-boot-1.1.3支持<br />&nbsp;<br />CPU<br />&nbsp;Arm920t<br />&nbsp;√<br />&nbsp;<br />SoC<br />&nbsp;S3C2410<br />&nbsp;√<br />&nbsp;<br />SDRAM<br />&nbsp;Samsung&nbsp;K4s5616323C&nbsp;(64M)<br />&nbsp;√<br />&nbsp;<br />Nand&nbsp;lash<br />&nbsp;Samsung&nbsp;K9F1208U0B&nbsp;(64M)<br />&nbsp;?<br />&nbsp;<br />NOR&nbsp;flash<br />&nbsp;AMD&nbsp;AM29LV800&nbsp;(1M)<br />&nbsp;√<br />&nbsp;<br />Ethernet<br />&nbsp;CS8900A(10M/100MB)<br />&nbsp;√<br />&nbsp;<br />LCD&nbsp;/DMA&nbsp;LCD-dedicated<br />&nbsp;Samsung&nbsp;2.83’’&nbsp;TFT&nbsp;<br />&nbsp;?<br />&nbsp;<br />UART<br />&nbsp;<br />&nbsp;?<br />&nbsp;<br />MMU<br />&nbsp;<br />&nbsp;?<br />&nbsp;<br />SD&amp;MMC<br />&nbsp;<br />&nbsp;√<br />&nbsp;<br />GPIO<br />&nbsp;<br />&nbsp;?<br />&nbsp;<br />PLL<br />&nbsp;<br />&nbsp;?<br />&nbsp;<br />PWM<br />&nbsp;<br />&nbsp;?<br />&nbsp;<br />……<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />4.2.<br />U-Boot-1.1.3-JK2410-r3移植过程这一部分将按照3.2节介绍的u-boot移植步骤详细分析移植U-Boot-1.1.3到开发板JK2410的过程。<br />首先选择参考板。由于JK2410是参考SMDK2410开发板设计的培训用板,CPU都是arm920t,基本的硬件配置相同,所以选择SMDK2410作为开发板,这符合参考板选择标准。由于u-boot从1.1.2版本开始支持smdk2410,所以只要选择u-boot-1.1.2或以后的版本都可以基本满足需求。这里Jollen选择u-boot-1.1.3。<br />移植U-Boot的基本步骤如下。<br />(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。<br />smdk2410_config&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unconfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;arm920t&nbsp;smdk2410&nbsp;NULL&nbsp;s3c24x0<br />参考上面2行,添加下面2行。<br />JK2410_config&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unconfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;arm920t&nbsp;JK2410&nbsp;NULL&nbsp;s3c24x0<br />(2)创建一个新目录存放开发板相关的代码,并且添加文件。<br />board/JK2410/config.mk<br />board/JK2410/flash.c<br />board/JK2410/JK2410.c<br />board/JK2410/Makefile<br />board/JK2410/lowlevel_init.S<br />board/JK2410/u-boot.lds<br />(3)为开发板添加新的配置文件<br />可以先复制参考开发板的配置文件,再修改。例如:<br />$cp&nbsp;include/configs/smdk2410.h&nbsp;&nbsp;include/configs/JK2410.h<br />由于都是采用arm920t&nbsp;CPU所以不需要建立新的目录存放CPU相关的代码。<br />(4)配置开发板<br />$&nbsp;make&nbsp;JK2410_config<br />(5)编译U-Boot<br />执行make命令,编译成功可以得到U-Boot映像。<br />(6)添加驱动或者功能选项<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由4.1节目标板的硬件配置知道开发板需要添加的功能有以下几个方面:<br />a.<br />LCD驱动端口的设置<br />b.<br />Boot&nbsp;**的添加<br />c.<br /><br />U-boot中Nand&nbsp;flash驱动的配置<br />d.<br />MMU功能添加<br />下面详细介绍功能添加过程<br />①<br />Include/configs/jk2410.h<br /><br />/*&nbsp;Nand&nbsp;flash&nbsp;Boot&nbsp;声明&nbsp;*/<br />#define<br />CONFIG_JK2410<br />1<br />/*&nbsp;#undef<br />CONFIG_JK2410_EXTUART<br />In&nbsp;the&nbsp;future,&nbsp;there&nbsp;will&nbsp;be&nbsp;an&nbsp;external&nbsp;UART&nbsp;*/<br />//&nbsp;NAND&nbsp;boot&nbsp;is&nbsp;came&nbsp;from&nbsp;vivi.<br />#define&nbsp;CONFIG_NAND_BOOT<br /><br />/*&nbsp;LCD&nbsp;&amp;&amp;&nbsp;MMU声明<br />*/<br />//&nbsp;jollen:&nbsp;LCD&nbsp;Panel&nbsp;(TFT)<br />#define<br />CONFIG_LCD<br />#define&nbsp;<br />CONFIG_LCD_**<br />#define<br />CONFIG_LCD_INFO<br />#define&nbsp;USE_920T_MMU<br />/*<br /><br />jollen:&nbsp;Use&nbsp;920T&nbsp;MMU&nbsp;means&nbsp;that&nbsp;the&nbsp;Dcache&nbsp;function&nbsp;will&nbsp;be&nbsp;used,&nbsp;but&nbsp;it&nbsp;doesn't&nbsp;mean&nbsp;that<br /><br />the&nbsp;MMU&nbsp;will&nbsp;be&nbsp;turned&nbsp;off/off&nbsp;during&nbsp;boot&nbsp;sequence.<br /><br />See&nbsp;cpu/arm920t/cpu.c.<br />*/<br /><br />/*&nbsp;打开CFG_CMD_NAND&nbsp;CFG_CMD_JFFS2命令项 */<br />由于提供了从Nand&nbsp;Flash&nbsp;启动功能,则也同时学要提供相应的对Nand&nbsp;Flash操作的命令;开发板portingJFFS文件系统,所以要提供相应的对JFFS2操作的命令。<br />#define&nbsp;CONFIG_COMMANDS&nbsp;\<br /><br />(CONFIG_CMD_DFL<br />|&nbsp;\<br /><br />CFG_CMD_CACHE<br />|&nbsp;\<br /><br />CFG_CMD_NAND<br />|&nbsp;\<br /><br />/*CFG_CMD_EEPROM&nbsp;|*/&nbsp;\<br /><br />/*CFG_CMD_I2C<br />|*/&nbsp;\<br /><br />/*CFG_CMD_USB<br />|*/&nbsp;\<br /><br />CFG_CMD_JFFS2<br />|&nbsp;\<br /><br />CFG_CMD_REGINFO<br />|&nbsp;\<br /><br />CFG_CMD_DATE<br />|&nbsp;\<br /><br />CFG_CMD_ELF)<br />/*&nbsp;重新组织物理内存映射图<br />*/<br />#define&nbsp;CONFIG_NR_DRAM_BANKS<br />1<br />/*&nbsp;we&nbsp;have&nbsp;1&nbsp;bank&nbsp;of&nbsp;DRAM&nbsp;*/<br />#define&nbsp;PHYS_SDRAM_1<br />0x30000000&nbsp;/*&nbsp;SDRAM&nbsp;Bank&nbsp;#1&nbsp;*/<br /><br />#ifdef&nbsp;CONFIG_LCD<br />#define&nbsp;PHYS_SDRAM_1_SIZE<br />0x04000000&nbsp;/*&nbsp;64&nbsp;MB&nbsp;*/<br />#define&nbsp;PHYS_FB_BASE<br />0x33f00000<br />#ifdef&nbsp;CONFIG_NAND_BOOT&nbsp;//&nbsp;2006/8/21<br />#define&nbsp;PHYS_FB_SIZE<br />1&nbsp;*&nbsp;1024&nbsp;*&nbsp;1024&nbsp;/*&nbsp;FB:&nbsp;1M&nbsp;bytes&nbsp;*/<br />#define&nbsp;STACK_BASE<br />PHYS_FB_BASE&nbsp;+&nbsp;PHYS_FB_SIZE<br />#else<br />#define&nbsp;PHYS_FB_SIZE<br />4&nbsp;*&nbsp;1024&nbsp;*1024&nbsp;/*&nbsp;FB:&nbsp;4M&nbsp;Bytes&nbsp;(max)&nbsp;*/<br />#endif&nbsp;//&nbsp;CONFIG_NAND_BOOT<br />#else<br />#define&nbsp;PHYS_SDRAM_1_SIZE<br />0x04000000&nbsp;/*&nbsp;64&nbsp;MB&nbsp;*/<br />#endif<br /><br />/*&nbsp;声明NOR&nbsp;Flash&nbsp;为AMD&nbsp;AM29LV800<br />*/<br />#define&nbsp;CONFIG_AMD_LV800<br />1<br /><br /><br />/*&nbsp;LCD端口设置<br />*/<br />Register<br /><br />LCDCON1<br />LCD&nbsp;Control&nbsp;1<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDCON2<br />LCD&nbsp;Control&nbsp;2<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDCON3<br />LCD&nbsp;Control&nbsp;3<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDCON4<br />LCD&nbsp;Control&nbsp;4<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDCON5<br />LCD&nbsp;Control&nbsp;5<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDADDR1<br />STN/TFT:&nbsp;Frame&nbsp;Buffer&nbsp;Start&nbsp;Addr1<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDADDR2<br />STN/TFT:&nbsp;Frame&nbsp;Buffer&nbsp;Start&nbsp;Addr2<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />LCDADDR3<br />STN/TFT:&nbsp;Virtual&nbsp;Screen&nbsp;Address&nbsp;Set<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />REDLUT<br />STN:&nbsp;Red&nbsp;Lookup&nbsp;Table<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />GREENLUT<br />STN:&nbsp;Green&nbsp;Lookup&nbsp;Table<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />BLUELUT<br />STN:&nbsp;Blue&nbsp;Lookup&nbsp;Table<br />[word,&nbsp;R/W,&nbsp;0x0000]<br /><br />DP1_2<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;1/2<br />[word,&nbsp;R/W]<br /><br />DP4_7<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;4/7<br />[word,&nbsp;R/W]<br /><br />DP3_5<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;3/5<br />[word,&nbsp;R/W]<br /><br />DP2_3<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;2/3<br />[word,&nbsp;R/W]<br /><br />DP5_7<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;5/7<br />[word,&nbsp;R/W]<br /><br />DP3_4<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;3/4<br />[word,&nbsp;R/W]<br /><br />DP4_5<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;4/5<br />[word,&nbsp;R/W]<br /><br />DP6_7<br />STN:&nbsp;Dithering&nbsp;Pattern&nbsp;Duty&nbsp;6/7<br />[word,&nbsp;R/W]<br /><br />DITHMODE<br />STN:&nbsp;Dithering&nbsp;Mode<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />TPAL<br />TFT:&nbsp;Temporary&nbsp;Pallete<br />[word,&nbsp;R/W,&nbsp;0x00000000]<br /><br />*<br /><br />*/<br /><br />#define&nbsp;bLCD_CTL(Nb)<br />__REG(0x4d000000&nbsp;+&nbsp;(Nb))<br />#define&nbsp;rLCDCON1<br />bLCD_CTL(0x00)<br />#define&nbsp;rLCDCON2<br />bLCD_CTL(0x04)<br />#define&nbsp;rLCDCON3<br />bLCD_CTL(0x08)<br />#define&nbsp;rLCDCON4<br />bLCD_CTL(0x0c)<br />#define&nbsp;rLCDCON5<br />bLCD_CTL(0x10)<br />#define&nbsp;rLCDADDR1<br />bLCD_CTL(0x14)<br />#define&nbsp;rLCDADDR2<br />bLCD_CTL(0x18)<br />#define&nbsp;rLCDADDR3<br />bLCD_CTL(0x1c)<br />#define&nbsp;rREDLUT<br />bLCD_CTL(0x20)<br />#define&nbsp;rGREENLUT<br />bLCD_CTL(0x24)<br />#define&nbsp;rBLUELUT<br />bLCD_CTL(0x28)<br />#define&nbsp;rDITHMODE<br />bLCD_CTL(0x4c)<br />#define&nbsp;rTPAL<br />bLCD_CTL(0x50)<br />#define&nbsp;rLCDINTPND<br />bLCD_CTL(0x54)<br />#define&nbsp;rLCDSRCPND<br />bLCD_CTL(0x58)<br />#define&nbsp;rLCDINTMSK<br />bLCD_CTL(0x5c)<br />#define&nbsp;rLCDLPCSEL<br />bLCD_CTL(0x60)<br /><br />#define&nbsp;fLCD1_LINECNT<br />Fld(10,18)<br />/*&nbsp;the&nbsp;status&nbsp;of&nbsp;the&nbsp;line&nbsp;counter&nbsp;*/<br />#define&nbsp;LCD1_LINECNT<br />FMsk(fLCD_LINECNT)<br /><br />#define&nbsp;fLCD1_CLKVAL<br />Fld(10,8)<br />/*&nbsp;rates&nbsp;of&nbsp;VCLK&nbsp;and&nbsp;CLKVAL[9:0]&nbsp;*/<br />#define&nbsp;LCD1_CLKVAL(x)<br />FInsrt((x),&nbsp;fLCD1_CLKVAL)<br />#define&nbsp;LCD1_CLKVAL_MSK<br />FMask(fLCD1_CLKVAL)<br /><br />#define&nbsp;LCD1_MMODE&nbsp;(1&lt;&lt;7)<br /><br />#define&nbsp;fLCD1_PNR<br />Fld(2,5)<br />/*&nbsp;select&nbsp;the&nbsp;display&nbsp;mode&nbsp;*/<br />#define&nbsp;LCD1_PNR_4D<br />FInsrt(0x0,&nbsp;fLCD1_PNR)<br />/*&nbsp;STN:&nbsp;4-bit&nbsp;dual&nbsp;scan&nbsp;*/<br />#define&nbsp;LCD1_PNR_4S<br />FInsrt(0x1,&nbsp;fLCD1_PNR)<br />/*&nbsp;STN:&nbsp;4-bit&nbsp;single&nbsp;scan&nbsp;*/<br />#define&nbsp;LCD1_PNR_8S<br />FInsrt(0x2,&nbsp;fLCD1_PNR)<br />/*&nbsp;STN:&nbsp;8-bit&nbsp;single&nbsp;scan&nbsp;*/<br />#define&nbsp;LCD1_PNR_TFT<br />FInsrt(0x3,&nbsp;fLCD1_PNR)<br />/*&nbsp;TFT&nbsp;LCD&nbsp;*/<br /><br />#define&nbsp;fLCD1_BPP<br />Fld(4,1)<br />/*&nbsp;select&nbsp;BPP(Bit&nbsp;Per&nbsp;Pixel)&nbsp;*/<br />#define&nbsp;LCD1_BPP_1S<br />FInsrt(0x0,&nbsp;fLCD1_BPP)<br />/*&nbsp;STN:&nbsp;1&nbsp;bpp,&nbsp;mono&nbsp;*/<br />#define&nbsp;LCD1_BPP_2S<br />FInsrt(0x1,&nbsp;fLCD1_BPP)<br />/*&nbsp;STN:&nbsp;2&nbsp;bpp,&nbsp;4-grey&nbsp;*/<br />#define&nbsp;LCD1_BPP_4S<br />FInsrt(0x2,&nbsp;fLCD1_BPP)<br />/*&nbsp;STN:&nbsp;4&nbsp;bpp,&nbsp;16-grey&nbsp;*/<br />#define&nbsp;LCD1_BPP_8S<br />FInsrt(0x3,&nbsp;fLCD1_BPP)<br />/*&nbsp;STN:&nbsp;8&nbsp;bpp,&nbsp;color&nbsp;*/<br />#define&nbsp;LCD1_BPP_12S<br />FInsrt(0x4,&nbsp;fLCD1_BPP)<br />/*&nbsp;STN:&nbsp;12&nbsp;bpp,&nbsp;color&nbsp;*/<br />#define&nbsp;LCD1_BPP_1T<br />FInsrt(0x8,&nbsp;fLCD1_BPP)<br />/*&nbsp;TFT:&nbsp;1&nbsp;bpp&nbsp;*/<br />#define&nbsp;LCD1_BPP_2T<br />FInsrt(0x9,&nbsp;fLCD1_BPP)<br />/*&nbsp;TFT:&nbsp;2&nbsp;bpp&nbsp;*/<br />#define&nbsp;LCD1_BPP_4T<br />FInsrt(0xa,&nbsp;fLCD1_BPP)<br />/*&nbsp;TFT:&nbsp;4&nbsp;bpp&nbsp;*/<br />#define&nbsp;LCD1_BPP_8T<br />FInsrt(0xb,&nbsp;fLCD1_BPP)<br />/*&nbsp;TFT:&nbsp;8&nbsp;bpp&nbsp;*/<br />#define&nbsp;LCD1_BPP_16T<br />FInsrt(0xc,&nbsp;fLCD1_BPP)<br />/*&nbsp;TFT:&nbsp;16&nbsp;bpp&nbsp;*/<br />……&nbsp;……<br />……&nbsp;……<br /><br />②<br />Cpu/arm920t/Start.s<br />由于增加从Nand&nbsp;flash启动功能,u-boot启动第一阶段需要增加代码复制的程序段也就是copy_myself。具体语句不贴出来了。相应地也要做堆栈的修改。<br />③<br />Lib_arm/board.c<br />在u-boot启动第二阶段添加新增的板级配置的初始化项。<br />void&nbsp;board_postinit(void)<br />{<br />#ifdef&nbsp;CONFIG_JK2410<br />#undef&nbsp;CONFIG_S3C2410_NAND_BOOT<br /><br />/*&nbsp;ports&nbsp;from&nbsp;vivi&nbsp;,&nbsp;by&nbsp;jollen.org&nbsp;*/<br /><br />/*&nbsp;NOTICE:&nbsp;not&nbsp;work&nbsp;for&nbsp;current&nbsp;framebuffer&nbsp;memory&nbsp;base&nbsp;address&nbsp;setting&nbsp;*/<br /><br />/*&nbsp;This&nbsp;is&nbsp;a&nbsp;TODO&nbsp;issue.&nbsp;*/<br /><br />//mem_map_init();<br /><br />//mmu_init();<br />#endif<br /><br /><br />#ifdef<br />JK2410_DEBUG<br /><br />printf('%s:&nbsp;',<br />__FUNCTION__);<br />#endif<br /><br />board_ioportinit();<br /><br />#ifdef&nbsp;CONFIG_LCD<br /><br />lcd_enable();<br /><br />lcd_boot_**();<br />#endif<br />#if<br />defined(CONFIG_JK2410)&nbsp;&amp;&amp;&nbsp;defined(CONFIG_PLL_DEBUG)<br /><br />jk2410_show_PLLCLK();<br />#endif<br /><br />}<br />④<br />编译调试直至实现所有功能为止。<br /><br />
lpc2410 发表于 2009-7-9 14:07 | 显示全部楼层

写的不错,楼上的辛苦了

  
tmake 发表于 2009-7-11 14:15 | 显示全部楼层

好复杂啊

  
bespecial 发表于 2009-11-21 18:02 | 显示全部楼层
现在还看不懂
收藏以后在看
linhai1986 发表于 2009-11-21 21:35 | 显示全部楼层
好长啊:dizzy:
linhai1986 发表于 2009-11-21 21:36 | 显示全部楼层
收藏了,慢慢看
xiaoxin1986 发表于 2009-11-22 00:22 | 显示全部楼层
这个也很长,收藏了
beny5566 发表于 2009-11-22 16:06 | 显示全部楼层
确实很长啊。
woshic23 发表于 2011-3-30 10:53 | 显示全部楼层
都是2410,怎么不弄点新鲜的
maoyanketi 发表于 2011-3-30 20:46 | 显示全部楼层
uboot不会啊!
woshic23 发表于 2011-4-1 18:47 | 显示全部楼层
要做一块TI A8的板子,不知道uboot移植与ARM9的不同之处在哪,有做过的给点建议吧!!谢谢!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

150

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部