UBoot移植.docx
《UBoot移植.docx》由会员分享,可在线阅读,更多相关《UBoot移植.docx(20页珍藏版)》请在冰豆网上搜索。
![UBoot移植.docx](https://file1.bdocx.com/fileroot1/2023-2/6/d05f37a7-0861-48b4-8f20-333b33bfc982/d05f37a7-0861-48b4-8f20-333b33bfc9821.gif)
UBoot移植
用户名:
密码:
登录注册嵌入式Android_Linux开发主要讨论Android、Linux、ARM9、Xscale等相关问题!
主页博客相册|个人档案|好友查看文章
uboot在ARMs3c2410上移植过程2007-07-0606:
58总述
u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。
当前版本号:
u-boot1.0.2,见include/version.h中的定义。
#cvs–dserver:
anonymous@:
/cvsroot/u-bootlogin
#cvs–z3–dserver:
anonymous@:
/cvsroot/u-bootcheckout–Pu-boot
本文讲述S3C2410中u-boot的移植过程:
S3C2410的硬件配置是:
lCPU:
S3C2410
lNOR:
16M,INTELEP28F128J3A
lSDRAM:
64M,MICRON48LC16M16A2-75B
lDM9000AVICOM(10/100M)网卡
lUSBHOST一个
配置自已的主板
l阅读Makefile文件,在Makefile文件中添加两行:
s3c2410_config:
unconfig
@./mkconfig$(@:
_config=)armarm920ts3c2410
其中ARM是CPU的种类,arm920t是ARMCPU对应的代码目录,s3c2410是自已主板对应的目录。
l在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cpsmdk2410/*s3c2410)。
l在include/configs/目录下复制smdk2410.h(cpsmdk2410.hs3c2410.h)
l修改ARM编译器的目录名及前缀
本人ARM编译器的目录是在:
/opt/host/armv4l/bin/armv4l-unknown-linux-
把CROSS-COMPILE=arm-linux-改为实际目录:
如
CROSS-COMPILE=/opt/host/armv4l/bin/arm4l-unknown-linux-
l完成之后,可以测试一下你的配置:
#makes3c2410_config
#make
编译应该在processor.h中出错
l修改processor.h中:
uniondebug_insn
{
u32arm;
u16thumb;
}
修改成:
uniondebug_insn
{
u32arm_mode;
u16thumb_mode;
}
l编译成功,编译好的程序同smdk2410一样。
l注:
如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在examples目录中运行touch命令(不运行touch还会出错,可能ubootMakefile没有写好,没查原因),再编译。
生成最基本的u-boot,没有功能,只能起动
l修改程序连接地址:
在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。
l为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:
在board/s3c2410的memsetup.S中标记符”0:
”上加入五句:
lmovr3,pc
lldrr4,=0x3FFF0000
landr3,r3,r4//以上三句得到实际起动的内存地址
laadr0,r0,r3//用GO命令调试uboot时,启动地址在RAM
laddr2,r2,r3//把初始化内存信息的地址,加上实际起动地址
u0标记符0,原来存在的标记符)
l用SJF软件通过jtag口下载编译的u-boot,启动!
读取环境块时CRC出错,然后进入SMDK#。
l把MIZIvivi中的PrintHexWord,PrintWord拷过来,这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldrr0,[r2,r0]应改为ldrbr0,[r2,r0],这样可以在四字节对齐的系统中使用。
INTELnorflash操作功能
lINTEL的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。
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,(E28F128J3Aflash中块的大小是128K)。
l把s3c2410.h中的flash内容由原来的:
1.#definePHYS_FLASH_10x00000000/*FlashBank#1*/
2.#defineCFG_FLASH_BASEPHYS_FLASH_1
3.#defineCONFIG_AMD_LV4001
4.#if0
5.#defineCONFIG_AMD_LV8001
6.#endif
7.#defineCFG_MAX_FLASH_BANKS1/*maxnumberofmemorybanks*/
8.#ifdefCONFIG_AMD_LV800
9.#definePHYS_FLASH_SIZE0x00100000/*1MB*/
10.#defineCFG_MAX_FLASH_SECT(19)/*maxnumberofsectorsononechip*/
11.#defineCFG_ENV_ADDR(CFG_FLASH_BASE+0x0F0000)/*addrofenvironment*/
12.#endif
13.#ifdefCONFIG_AMD_LV400
14.#definePHYS_FLASH_SIZE0x00080000/*512KB*/
15.#defineCFG_MAX_FLASH_SECT(11)/*maxnumberofsectorsononechip*/
16.#defineCFG_ENV_ADDR(CFG_FLASH_BASE+0x070000)
改为:
1.#definePHYS_FLASH_10x00000000/*FlashBank#1*/
2.#definePHYS_FLASH_SIZE0x01000000/*16MB*/
3.##defineCFG_FLASH_PROTECTION
4.defineCFG_FLASH_BASEPHYS_FLASH_1
5.#defineCFG_MONITOR_BASEPHYS_FLASH_1
6.#defineCFG_MAX_FLASH_BANKS1/*maxnumberofmemorybanks*/
7.#defineCFG_MAX_FLASH_SECT128/*maxnumberofsectorsononechip*/
8.#defineCFG_FLASH_ERASE_TOUT(2*CFG_HZ)/*TimeoutforFlashErase*/
9.#defineCFG_FLASH_WRITE_TOUT(2*CFG_HZ)/*TimeoutforFlashWrite*/
10.#defineCFG_ENV_IS_IN_FLASH1
11.#defineCFG_ENV_ADDR(PHYS_FLASH_1+0x60000)
12.#defineCFG_ENV_SIZE0x20000/*TotalSizeofEnvironmentSector*/
l把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1,默认以字节显示,更直观,并且不会出现地址对齐错(dataabort)。
而在do_mem_mw()及mod_mem()中加入:
if(addr2info(addr)!
=NULL)
{
printf(“can’twirteormodifyinflash!
Usecpinstead.\n”);
return0;
}
以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。
l改board/s3c2410/flash.c中的flash_erase(),把start=get_timer(0)移到for(),以去掉flash_erasetimeout错误。
设置FLASH和SDRAM时序
根据28F128J3A-150,这是一150ns的flash,所以把flash时序设为最慢。
把s3c2410设成202.8MHZ,并且工作在异步模式,修改memsetup.S。
实现网卡功能
本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。
1.把驱动拷到drivers/dm9000.c
2.在drivers/Makefile中加入dm9000.o
3.在lib_arm/board.c中修改CS8900=>DM9000
4.在include/configs/s3c2410中加入以下几句
#defineCONFIG_DRIVER_DM90001/*wehaveaCS8900on-board*/
#defineDM9000_BASE0x08000000
#defineDM9000_BUS161/*theLinuxdriverdoesaccessesasshorts*/
#defineCONFIG_ETHADDR08:
00:
3e:
26:
0a:
5b
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR192.168.2.120
#defineCONFIG_SERVERIP192.168.2.122
实现USB功能
1.在include/configs/s3c2410中的CONFIG_COMMANDS中加入:
lCFG_CMD_USB|\
lCFG_CMD_FAT|\
2.并在文件中加入以下设置:
l#defineCONFIG_USB_OHCI
l#defineCONFIG_USB_STORAGE
l#defineCONFIG_USB_KEYBOARD
l#defineCONFIG_DOS_PARTITION
l#defineCFG_DEVICE_DEREGISTER
l#defineCONFIG_SUPPORT_VFAT
l#defineLITTLEENDIAN
3.这时usbstart和usbinfo等功能正常,而其它一些功能不正常。
4.功能fatls不正常,修改fs/fat/fat.c
l没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。
Uni2ansi(),增加slot2str()的cp936版,增加一个toshort()。
l加入#definecp936
l在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。
l在do_fat_read()中加入两句,以消除列根目录错误。
l在board/cmd_fat.c中加入两句,以消除没有usbstorage设备时的错误:
if(!
dev_desc)
printf(“Notinitstorageusbdevice:
\nusbstart\nusbinfo\nusbscan\n”);
5.修改fs/fat/fat.c
get_cluster()函数中加入if(size/FS_BLOCK_SIZE>0),以防读文件时不能成功读出。
引导LINUX
现在我们可以引导LINUX了。
l要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M
l把编译好的LINUX内存,通过uboot/tools/mkimage转换成uboot格式
1.mkimage-Aarm-Olinux-Tkernel-Cbzip2-a30000000-e30008000-n'linuxkernel'-dvmlinux1.bz2c
2.mkimage-Aarm-Olinux-Tkernel-Cgzip-a30000000-e30008000-n'linuxkernel'-dvmlinux.gzb
3.mkimage-Aarm-Olinux-Tramdisk-Cgzip-a0-e0-n'initramdisk'-dramdisk.image.gzramdisk
l在include/configs/s3c2410.h中加入:
1.#defineCONFIG_BOOTARGS"initrd=0x30800000,0x200000root=/dev/raminit=/linuxrcconsole=ttyS0,115200"
2.#defineCONFIG_BOOTFILE"vmlinux_for_uboot.gz"
3.#defineCONFIG_BOOTCOMMAND"bootm0x800000x1a0000"
0x80000为内核在flash中的位置。
0x1a0000为ramdisk.image.gz在flash中的内容。
4.#defineCFG_LOAD_ADDR0x30800000/*defaultloadaddress*/
l在lib_arm/armlinux.c的do_bootm_linux中加入:
1.memcpy((char*)CFG_LOAD_ADDR,(char*)data,len);
2.data=CFG_LOAD_ADDR;
把ramdisk复制到0x30800000位置的RAM中
3.定义以下配置,把信息传入LINUX核心的TAG区
#defineCONFIG_SETUP_MEMORY_TAGS
#defineCONFIG_INITRD_TAG
#defineCONFIG_CMDLINE_TAG
常用U-BOOT命令介绍
1.?
得到所有命令列表
2.help:
helpusb,列出USB功能的使用说明
3.ping:
注:
只能开发板PING别的机器
4.setenv:
设置互环境变量:
5.setenvserverip192.168.0.1
6.setenvipaddr192.168.0.56
7.setenvbootcmd‘tftp32000000vmlinux;kgo32000000’
8.saveenv:
保存环境变量
9.在设置好环境变量以后,保存变量值
10.tftp:
tftp32000000vmlinux,把server(IP=环境变量中设置的serverip)中/tftpdroot/下的vmlinux通过TFTP读入到物理内存32000000处。
11.kgo:
起动没有压缩的linux内核,kgo32000000
12.bootm:
起动UBOOTTOOLS制作的压缩LINUX内核,bootm3200000
13.protect:
对FLASH进行写保护或取消写保护,protecton1:
0-3(就是对第一块FLASH的0-3扇区进行保护),protectoff1:
0-3取消写保护
14.erase:
删除FLASH的扇区,erase1:
0-2(就是对每一块FLASH的0-2扇区进行删除)
15.cp:
在内存中复制内容,cp32000000040000(把内存中0x32000000开始的0x40000字节复制到0x0处)
16.mw:
对RAM中的内容写操作,mw32000000ff10000(把内存0x32000000开始的0x10000字节设为0xFF)
17.md:
修改RAM中的内容,md32000000(内存的起始地址)
18.usb:
lusbstart:
起动usb功能
lusbinfo:
列出设备
lusbscan:
扫描usbstorage(u盘)设备
19.fatls:
列出DOSFAT文件系统,如:
fatlsusb0列出第一块U盘中的文件
20.fatload:
读入FAT中的一个文件,如:
fatloadusb0:
032000000aa.txt
21.把USB中的aa.txt读到物理内存0x32000000处!
22.flinfo:
列出flash的信息
23.loadb:
准备用KERMIT协议接收来自kermit或超级终端传送的文件。
24.nfs:
nfs32000000192.168.0.2:
aa.txt,把192.168.0.2(LINUX的NFS文件系统)中的NFS文件系统中的aa.txt读入内存0x32000000处。
PostedbyJohnLiuat2:
30AM-NoCommentsAddaComment
U-BOOT
引言:
本文以U-BOOT为例,介绍了如何在ARM9开发板上移植BootLoader的过程。
LH7A400学习板是旋极公司推出的一款高性能嵌入式开发板,其采用的处理器LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片。
该芯片集成了高性能的32位RISC处理器核ARM922T(运算速度200MHz,总线速度100MHz),能使处理速度达到每秒220百万条指令(MIPS),能耗为1.33mW/MIPS,可以在低电压状态下工作(核心1.8V,输入/输出3.3V),片内带有锁相回路(PLL)和低能耗核心。
此外该芯片还包括:
16KB高速缓存(Cache),存储器管理单元(MMU),80KB静态存储器(SRAM),彩色液晶显示控制器(LCD),直接存储控制器(10通道DMA),异步串行口控制器(UART),同步串行口控制器(SSP),PCMCIA控制器,AC97声音控制器,智能卡控制器,多媒体卡控制器,电池控制器,USB控制器和时钟/供电管理器。
值得一提的是,LH7A400是一款宽温芯片,其工作温度范围为-40℃~+85℃(降低时钟频率),可广泛应用于无线手持设备、智能电话、PDA、家庭娱乐控制器、PocketPC及各种工控设备。
该学习板还包括如下硬件:
由2片16位Flash(32MB)和2片16位的SDRAM(64M)构成32位宽的高速存储器结构;10/100M自适应网络芯片DM9000;Sharp3.5’TFTLCD彩屏;触摸屏;USBHost/Device;CF卡插槽;全功能JTAG接口等。
1U-BOOT简介
U-BOOT是由德国的工程师WolfgangDenk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。
目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是:
:
URL:
:
Sourceforge的CVS服务器中匿名获得。
#cvs-dserver:
anonymous@:
/cvsroot/U-BOOTlogin
#cvs-z6-dserver:
anonymous@:
/cvsroot/U-BOOT\co-Pmodulename
1.1U-BOOT源代码目录结构
◆board:
和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆common:
与体系结构无关的文件,实现各种命令的C文件。
◆cpu:
CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。
其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆disk:
disk驱动的分区处理代码。
◆doc:
文档。
◆drivers:
通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
◆fs:
支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆include:
头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。
◆net:
与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
◆lib_arm:
与ARM体系结构相关的代码。
◆tools:
创建S-Record格式文件和U-BOOTimages的工具。
1.2U-BOOT的特点
U-BOOT支持SCC/FEC以太网、OOTP/TFTP引导、IP和MAC的预置功能,这一点和其它BootLoader(如BLOB和RedBoot等)类似。
但U-BOOT还具有一些特有的功能。
◆在线读写Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支持IDE和DOC的在线读写。
◆支持串行口kermit和S-record下载代码,U-BOOT本身的工具可以把ELF32格式的可执行文件转换成为S-record格式,直接从串口下载并执行。
◆识别二进制、ELF32、uImage格式的Image,对Linux引导有特别的支持。
U-BOOT对Linu