[ZLG-ARM] UBOOT在普光ARM-9200嵌入式开发板过程

[复制链接]
2138|1
 楼主| reeper 发表于 2009-4-9 15:24 | 显示全部楼层 |阅读模式
u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot&nbsp;1.0.2,见include/version.h中的定义。&nbsp;<br /><br /><br />#cvs&nbsp;–d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot&nbsp;login<br /><br />#cvs&nbsp;–z3&nbsp;–d&nbsp;:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot&nbsp;checkout&nbsp;–P&nbsp;u-boot<br /><br />本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:<br /><br />l&nbsp;CPU:S3C2410<br /><br />lNOR:&nbsp;16M,INTEL&nbsp;EP28F128J3A<br /><br />lSDRAM:64M,&nbsp;MICRON&nbsp;48LC16M16A2-75&nbsp;B<br /><br />lDM9000AVICOM&nbsp;(10/100M)&nbsp;网卡<br /><br />lUSB&nbsp;HOST一个<br /><br />配置自已的主板<br />l阅读Makefile文件,在Makefile文件中添加两行:<br /><br />s3c2410_config:&nbsp;unconfig&nbsp;<br /><br />@./mkconfig&nbsp;$(@:_config=)&nbsp;arm&nbsp;arm920t&nbsp;s3c2410<br /><br />其中ARM是CPU的种类,&nbsp;arm920t是ARM&nbsp;CPU对应的代码目录,s3c2410是自已主板对应的目录。<br /><br />l在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cp&nbsp;smdk2410/*&nbsp;s3c2410)。<br /><br />l在include/configs/目录下复制smdk2410.h(cp&nbsp;smdk2410.h&nbsp;s3c2410.h)<br /><br />l修改ARM编译器的目录名及前缀<br /><br />本人ARM编译器的目录是在:/opt/host/armv4l/bin/armv4l-unknown-linux-<br /><br />把CROSS-COMPILE&nbsp;=&nbsp;arm-linux-&nbsp;改为实际目录:如<br /><br />CROSS-COMPILE&nbsp;=&nbsp;/opt/host/armv4l/bin/arm4l-unknown-linux-<br /><br />l完成之后,可以测试一下你的配置:&nbsp;<br /><br />#make&nbsp;s3c2410_config&nbsp;<br /><br />#make&nbsp;<br /><br />编译应该在processor.h中出错<br /><br />l修改processor.h中:<br /><br />union&nbsp;debug_insn<br /><br />{<br /><br />u32&nbsp;arm;<br /><br />u16&nbsp;thumb;<br /><br />}<br /><br />修改成:<br /><br />union&nbsp;debug_insn<br /><br />{<br /><br />u32&nbsp;arm_mode;<br /><br />u16&nbsp;thumb_mode;<br /><br />}<br /><br /><br />l编译成功,编译好的程序同smdk2410一样。<br /><br />l注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在examples目录中运行touch命令(不运行touch还会出错,可能uboot&nbsp;Makefile没有写好,没查原因),再编译。<br /><br />生成最基本的u-boot,&nbsp;没有功能,只能起动<br />l修改程序连接地址:<br /><br />在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。<br /><br />l为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句:<br /><br />lmov&nbsp;r3,&nbsp;pc<br /><br />lldr&nbsp;r4,&nbsp;=0x3FFF0000<br /><br />land&nbsp;r3,&nbsp;r3,&nbsp;r4&nbsp;//以上三句得到实际起动的内存地址<br /><br />laad&nbsp;r0,&nbsp;r0,&nbsp;r3&nbsp;//用GO命令调试uboot时,启动地址在RAM<br /><br />ladd&nbsp;r2,&nbsp;r2,&nbsp;r3&nbsp;//把初始化内存信息的地址,加上实际起动地址<br /><br />l0标记符0,&nbsp;原来存在的标记符)<br /><br />l用SJF软件通过jtag口下载编译的u-boot,&nbsp;启动!读取环境块时CRC出错,然后进入SMDK#。<br /><br />l把MIZI&nbsp;vivi中的PrintHexWord,&nbsp;PrintWord拷过来,&nbsp;这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr&nbsp;r0,&nbsp;[r2,&nbsp;r0]&nbsp;应改为ldrb&nbsp;r0,&nbsp;[r2,&nbsp;r0],这样可以在四字节对齐的系统中使用。<br /><br />INTEL&nbsp;nor&nbsp;flash操作功能<br />lINTEL&nbsp;的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。<br /><br />lcmi中的flash.c在写入时要交换字节,所以删除它的write_short()和wirte_buff()函数,把ep7312主板目录中flash.c的wirte_word()和wirite_buff()函数复制过来。把flash.c中的FLASH_BASE0_PRELIM改为CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A&nbsp;flash中块的大小是128K)。<br /><br />l&nbsp;把s3c2410.h中的flash内容由原来的:<br /><br />1.&nbsp;#define&nbsp;PHYS_FLASH_1&nbsp;0x00000000&nbsp;/*&nbsp;Flash&nbsp;Bank&nbsp;#1&nbsp;*/<br /><br />2.&nbsp;#define&nbsp;CFG_FLASH_BASE&nbsp;PHYS_FLASH_1<br /><br />3.&nbsp;#define&nbsp;CONFIG_AMD_LV400&nbsp;1&nbsp;<br /><br />4.&nbsp;#if&nbsp;0<br /><br />5.&nbsp;#define&nbsp;CONFIG_AMD_LV800&nbsp;1&nbsp;<br /><br />     6.&nbsp;#endif<br /><br />    7.&nbsp;#define&nbsp;CFG_MAX_FLASH_BANKS&nbsp;1&nbsp;/*&nbsp;max&nbsp;number&nbsp;of&nbsp;memory&nbsp;banks&nbsp;*/<br /><br />     8.&nbsp;#ifdef&nbsp;CONFIG_AMD_LV800<br /><br />     9.&nbsp;#define&nbsp;PHYS_FLASH_SIZE&nbsp;0x00100000&nbsp;/*&nbsp;1MB&nbsp;*/<br /><br />     10.&nbsp;#define&nbsp;CFG_MAX_FLASH_SECT&nbsp;(19)&nbsp;/*&nbsp;max&nbsp;number&nbsp;of&nbsp;sectors&nbsp;on&nbsp;one&nbsp;chip&nbsp;*/<br /><br />     11.&nbsp;#define&nbsp;CFG_ENV_ADDR&nbsp;(CFG_FLASH_BASE&nbsp;+&nbsp;0x0F0000)&nbsp;/*&nbsp;addr&nbsp;of&nbsp;environment&nbsp;*/<br /><br />     12.&nbsp;#endif<br /><br />     13.&nbsp;#ifdef&nbsp;CONFIG_AMD_LV400<br /><br />     14.&nbsp;#define&nbsp;PHYS_FLASH_SIZE&nbsp;0x00080000&nbsp;/*&nbsp;512KB&nbsp;*/<br /><br />     15.&nbsp;#define&nbsp;CFG_MAX_FLASH_SECT&nbsp;(11)&nbsp;/*&nbsp;max&nbsp;number&nbsp;of&nbsp;sectors&nbsp;on&nbsp;one&nbsp;chip&nbsp;*/<br /><br />     16.&nbsp;#define&nbsp;CFG_ENV_ADDR&nbsp;(CFG_FLASH_BASE&nbsp;+&nbsp;0x070000)&nbsp;<br /><br />改为:<br /><br />1.&nbsp;#define&nbsp;PHYS_FLASH_1&nbsp;0x00000000&nbsp;/*&nbsp;Flash&nbsp;Bank&nbsp;#1&nbsp;*/<br /><br />2.&nbsp;#define&nbsp;PHYS_FLASH_SIZE&nbsp;0x01000000&nbsp;/*&nbsp;16&nbsp;MB&nbsp;*/<br /><br />3.&nbsp;##define&nbsp;CFG_FLASH_PROTECTION<br /><br />4.&nbsp;#define&nbsp;CFG_FLASH_BASE&nbsp;PHYS_FLASH_1<br /><br />5.&nbsp;#define&nbsp;CFG_MONITOR_BASE&nbsp;PHYS_FLASH_1<br /><br />6.&nbsp;#define&nbsp;CFG_MAX_FLASH_BANKS&nbsp;1/*&nbsp;max&nbsp;number&nbsp;of&nbsp;memory&nbsp;banks&nbsp;*/<br /><br />7.&nbsp;#define&nbsp;CFG_MAX_FLASH_SECT&nbsp;128/*&nbsp;max&nbsp;number&nbsp;of&nbsp;sectors&nbsp;on&nbsp;one&nbsp;chip&nbsp;*/<br /><br />8.&nbsp;#define&nbsp;CFG_FLASH_ERASE_TOUT&nbsp;(2*CFG_HZ)&nbsp;/*&nbsp;Timeout&nbsp;for&nbsp;Flash&nbsp;Erase&nbsp;*/<br /><br />9.&nbsp;#define&nbsp;CFG_FLASH_WRITE_TOUT&nbsp;(2*CFG_HZ)&nbsp;/*&nbsp;Timeout&nbsp;for&nbsp;Flash&nbsp;Write&nbsp;*/<br /><br />10.&nbsp;#define&nbsp;CFG_ENV_IS_IN_FLASH&nbsp;1<br /><br />11.&nbsp;#define&nbsp;CFG_ENV_ADDR&nbsp;(PHYS_FLASH_1&nbsp;+&nbsp;0x60000)<br /><br />12.&nbsp;#define&nbsp;CFG_ENV_SIZE&nbsp;0x20000&nbsp;/*&nbsp;Total&nbsp;Size&nbsp;of&nbsp;Environment&nbsp;Sector&nbsp;*/<br /><br />l&nbsp;把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1,&nbsp;默认以字节显示,更直观,并且不会出现地址对齐错(data&nbsp;abort)。而在do_mem_mw()及mod_mem()中加入:<br /><br />if(addr2info(addr)&nbsp;!=&nbsp;NULL)<br /><br />{<br /><br />printf(“can’t&nbsp;wirte&nbsp;or&nbsp;modify&nbsp;in&nbsp;flash!&nbsp;Use&nbsp;cp&nbsp;instead.<br />”);<br /><br />return&nbsp;0;<br /><br />}<br /><br />以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。<br /><br />l&nbsp;改board/s3c2410/flash.c中的flash_erase(),把start&nbsp;=&nbsp;get_timer(0)移到for(),&nbsp;以去掉flash_erase&nbsp;timeout&nbsp;错误。<br /><br />设置FLASH和SDRAM时序<br />根据28F128J3A-150,这是一150ns的flash,&nbsp;所以把flash时序设为最慢。把s3c2410设成202.8MHZ,&nbsp;并且工作在异步模式,&nbsp;修改memsetup.S。<br /><br />实现网卡功能<br />本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。<br /><br />1.&nbsp;把驱动拷到drivers/dm9000.c<br /><br />2.&nbsp;在drivers/Makefile中加入dm9000.o<br /><br />3.&nbsp;在lib_arm/board.c中修改CS8900=&gtDM9000<br /><br />4.&nbsp;在include/configs/s3c2410中加入以下几句<br /><br />#define&nbsp;CONFIG_DRIVER_DM9000&nbsp;1&nbsp;/*&nbsp;we&nbsp;have&nbsp;a&nbsp;CS8900&nbsp;on-board&nbsp;*/<br /><br />#define&nbsp;DM9000_BASE&nbsp;0x08000000<br /><br />#define&nbsp;DM9000_BUS16&nbsp;1&nbsp;/*&nbsp;the&nbsp;Linux&nbsp;driver&nbsp;does&nbsp;accesses&nbsp;as&nbsp;shorts&nbsp;*/<br /><br />#define&nbsp;CONFIG_ETHADDR&nbsp;08:00:3e:26:0a:5b&nbsp;<br /><br />#define&nbsp;CONFIG_NETMASK&nbsp;255.255.255.0<br /><br />#define&nbsp;CONFIG_IPADDR&nbsp;192.168.2.120<br /><br />#define&nbsp;CONFIG_SERVERIP&nbsp;192.168.2.122<br /><br /><br />实现USB功能<br />1.&nbsp;在include/configs/s3c2410中的CONFIG_COMMANDS中加入:<br /><br />l&nbsp;CFG_CMD_USB&nbsp;|<br />l&nbsp;CFG_CMD_FAT&nbsp;|<br />2.&nbsp;并在文件中加入以下设置:<br /><br />l&nbsp;#define&nbsp;CONFIG_USB_OHCI&nbsp;<br /><br />l&nbsp;#define&nbsp;CONFIG_USB_STORAGE<br /><br />l&nbsp;#define&nbsp;CONFIG_USB_KEYBOARD<br /><br />l&nbsp;#define&nbsp;CONFIG_DOS_PARTITION<br /><br />l&nbsp;#define&nbsp;CFG_DEVICE_DEREGISTER<br /><br />l&nbsp;#define&nbsp;CONFIG_SUPPORT_VFAT<br /><br />l&nbsp;#define&nbsp;LITTLEENDIAN<br /><br />3.&nbsp;这时usb&nbsp;start&nbsp;和&nbsp;usb&nbsp;info等功能正常,而其它一些功能不正常。<br /><br />4.&nbsp;功能fatls&nbsp;不正常,修改fs/fat/fat.c<br /><br />l&nbsp;没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(),&nbsp;增加slot2str()的cp936版,&nbsp;增加一个toshort()。<br /><br />l&nbsp;加入#define&nbsp;cp936<br /><br />l&nbsp;在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。<br /><br />l&nbsp;在do_fat_read()中加入两句,以消除列根目录错误。<br /><br />l&nbsp;在board/cmd_fat.c中加入两句,以消除没有usb&nbsp;storage设备时的错误:<br /><br />if(!dev_desc)<br /><br />printf(“Not&nbsp;init&nbsp;storage&nbsp;usb&nbsp;device:<br />usb&nbsp;start<br />usb&nbsp;info<br />usb&nbsp;scan<br />”);<br /><br />5.&nbsp;修改fs/fat/fat.c<br /><br />get_cluster()函数中加入&nbsp;if(size&nbsp;/&nbsp;FS_BLOCK_SIZE&nbsp;&gt&nbsp;0),&nbsp;以防读文件时不能成功读出。<br /><br />引导LINUX<br />现在我们可以引导LINUX了。<br /><br />l&nbsp;要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M<br /><br />l&nbsp;把编译好的LINUX内存,通过uboot/tools/mkimage转换成uboot格式<br /><br />1.&nbsp;mkimage&nbsp;-A&nbsp;arm&nbsp;-O&nbsp;linux&nbsp;-T&nbsp;kernel&nbsp;-C&nbsp;bzip2&nbsp;-a&nbsp;30000000&nbsp;-e&nbsp;30008000&nbsp;-n&nbsp;'linux&nbsp;kernel'&nbsp;-d&nbsp;vmlinux1.bz2&nbsp;c<br /><br />2.&nbsp;mkimage&nbsp;-A&nbsp;arm&nbsp;-O&nbsp;linux&nbsp;-T&nbsp;kernel&nbsp;-C&nbsp;gzip&nbsp;-a&nbsp;30000000&nbsp;-e&nbsp;30008000&nbsp;-n&nbsp;'linux&nbsp;kernel'&nbsp;-d&nbsp;vmlinux.gz&nbsp;b<br /><br />3.&nbsp;mkimage&nbsp;-A&nbsp;arm&nbsp;-O&nbsp;linux&nbsp;-T&nbsp;ramdisk&nbsp;-C&nbsp;gzip&nbsp;-a&nbsp;0&nbsp;-e&nbsp;0&nbsp;-n&nbsp;'init&nbsp;ramdisk'&nbsp;-d&nbsp;ramdisk.image.gz&nbsp;ramdisk<br /><br />l&nbsp;在include/configs/s3c2410.h中加入:<br /><br />1.&nbsp;#define&nbsp;CONFIG_BOOTARGS&nbsp;'initrd=0x30800000,0x200000&nbsp;root=/dev/ram&nbsp;init=/linuxrc&nbsp;console=ttyS0,115200'<br /><br />2.&nbsp;#define&nbsp;CONFIG_BOOTFILE&nbsp;'vmlinux_for_uboot.gz'&nbsp;<br /><br />3.&nbsp;#define&nbsp;CONFIG_BOOTCOMMAND&nbsp;'bootm&nbsp;0x80000&nbsp;0x1a0000'<br /><br />0x80000为内核在flash中的位置。<br /><br />0x1a0000为ramdisk.image.gz在flash中的内容。<br /><br />4.&nbsp;#define&nbsp;CFG_LOAD_ADDR&nbsp;0x30800000&nbsp;/*&nbsp;default&nbsp;load&nbsp;address&nbsp;*/<br /><br />l&nbsp;在lib_arm/armlinux.c的do_bootm_linux中加入:<br /><br />1.&nbsp;memcpy&nbsp;((char&nbsp;*)CFG_LOAD_ADDR,&nbsp;(char&nbsp;*)data,&nbsp;len);<br /><br />2.&nbsp;data&nbsp;=&nbsp;CFG_LOAD_ADDR;<br /><br />把ramdisk复制到0x30800000位置的RAM中<br /><br />3.&nbsp;定义以下配置,把信息传入LINUX核心的TAG区<br /><br />#define&nbsp;CONFIG_SETUP_MEMORY_TAGS<br /><br />#define&nbsp;CONFIG_INITRD_TAG<br /><br />#define&nbsp;CONFIG_CMDLINE_TAG<br /><br /><br />常用U-BOOT命令介绍<br />1.&nbsp;得到所有命令列表<br /><br />2.&nbsp;help:&nbsp;help&nbsp;usb,&nbsp;列出USB功能的使用说明<br /><br />3.&nbsp;ping:注:只能开发板PING别的机器<br /><br />4.&nbsp;setenv:&nbsp;设置互环境变量:<br /><br />5.&nbsp;setenv&nbsp;serverip&nbsp;192.168.0.1<br /><br />6.&nbsp;setenv&nbsp;ipaddr&nbsp;192.168.0.56<br /><br />7.&nbsp;setenv&nbsp;bootcmd&nbsp;‘tftp&nbsp;32000000&nbsp;vmlinux;&nbsp;kgo&nbsp;32000000’<br /><br />8.&nbsp;saveenv:&nbsp;保存环境变量<br /><br />9.&nbsp;在设置好环境变量以后,&nbsp;保存变量值<br /><br />10.&nbsp;tftp:&nbsp;tftp&nbsp;32000000&nbsp;vmlinux,&nbsp;把server(IP=环境变量中设置的serverip)中/tftpdroot/&nbsp;下的vmlinux通过TFTP读入到物理内存32000000处。<br /><br />11.&nbsp;kgo:&nbsp;起动没有压缩的linux内核,kgo&nbsp;32000000<br /><br />12.&nbsp;bootm:起动UBOOT&nbsp;TOOLS制作的压缩LINUX内核,&nbsp;bootm&nbsp;3200000<br /><br />13.&nbsp;protect:&nbsp;对FLASH进行写保护或取消写保护,&nbsp;protect&nbsp;on&nbsp;1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect&nbsp;off&nbsp;1:0-3取消写保护<br /><br />14.&nbsp;erase:&nbsp;删除FLASH的扇区,&nbsp;erase&nbsp;1:0-2(就是对每一块FLASH的0-2扇区进行删除)<br /><br />15.&nbsp;cp:&nbsp;在内存中复制内容,&nbsp;cp&nbsp;32000000&nbsp;0&nbsp;40000(把内存中0x32000000开始的0x40000字节复制到0x0处)<br /><br />16.&nbsp;mw:&nbsp;对RAM中的内容写操作,&nbsp;mw&nbsp;32000000&nbsp;ff&nbsp;10000(把内存0x32000000开始的0x10000字节设为0xFF)<br /><br />17.&nbsp;md:&nbsp;修改RAM中的内容,&nbsp;md&nbsp;32000000(内存的起始地址)<br /><br />18.&nbsp;usb:&nbsp;<br /><br />l&nbsp;usb&nbsp;start:&nbsp;起动usb&nbsp;功能<br /><br />l&nbsp;usb&nbsp;info:&nbsp;列出设备<br /><br />l&nbsp;usb&nbsp;scan:&nbsp;扫描usb&nbsp;storage(u&nbsp;盘)设备<br /><br />19.&nbsp;fatls:列出DOS&nbsp;FAT文件系统,&nbsp;如:fatls&nbsp;usb&nbsp;0列出第一块U盘中的文件<br /><br />20.&nbsp;fatload:&nbsp;读入FAT中的一个文件,如:fatload&nbsp;usb&nbsp;0:0&nbsp;32000000&nbsp;aa.txt<br /><br />21.&nbsp;把USB中的aa.txt&nbsp;读到物理内存0x32000000处!<br /><br />22.&nbsp;flinfo:&nbsp;列出flash的信息<br /><br />23.&nbsp;loadb:&nbsp;准备用&nbsp;KERMIT协议接收来自kermit或超级终端传送的文件。<br /><br />24.&nbsp;nfs:&nbsp;nfs&nbsp;32000000&nbsp;192.168.0.2:aa.txt&nbsp;,&nbsp;把192.168.0.2(LINUX&nbsp;的NFS文件系统)中的NFS文件系统中的aa.txt&nbsp;读入内存0x32000000处。<br />
zcying 发表于 2009-4-9 15:26 | 显示全部楼层

移植方法一般都是通用的

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

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