UBoot移植.docx

上传人:b****7 文档编号:9729422 上传时间:2023-02-06 格式:DOCX 页数:20 大小:27.52KB
下载 相关 举报
UBoot移植.docx_第1页
第1页 / 共20页
UBoot移植.docx_第2页
第2页 / 共20页
UBoot移植.docx_第3页
第3页 / 共20页
UBoot移植.docx_第4页
第4页 / 共20页
UBoot移植.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

UBoot移植.docx

《UBoot移植.docx》由会员分享,可在线阅读,更多相关《UBoot移植.docx(20页珍藏版)》请在冰豆网上搜索。

UBoot移植.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1