uboot移植步骤Word文档格式.docx
《uboot移植步骤Word文档格式.docx》由会员分享,可在线阅读,更多相关《uboot移植步骤Word文档格式.docx(10页珍藏版)》请在冰点文库上搜索。
或
把PATH=/usr/local/arm/2.95.3/bin
PATH添加到/ETC/bash_profile文件中
或者
在/etc/bashrc文件中添加一项:
exportPATH=/usr/local/arm/2.95.3/bin
测试:
把终端关闭,重新打开后执行如下命令:
#arm-linux-gcc–v
好了,建立好交叉编译环境后可以试着编译u-boot了
这里提几个注意点:
1.不可用winRAR解压u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz这种文件(就个可能新手会犯,一般熟悉linux命令的人应该都不会这样做吧,在此还是要提一下)
2.可能下载的文件有一些中间文件会阻碍编译的运行,所以在编译前最好来个彻底清除,在u-boot.1.1.2目录下运行命令:
makedistclean(其实这个命令在Makefile文件下就有)我当时为这个问题郁闷了很久,希望你们不会像我这样^_^);
3,有些人为了方便想在cygwin下编译,但是经常在网上看到在这个虚拟平台下编译有很多的问题,要配置的东西也多,而且好像我用过那个vi没有linux环境下的好用,所以最好还是不要用这个软件了吧,如果你真的离不开windows的话可以像我这样装个虚拟机,在虚拟机下再装linux的系统,具体参考这个网站):
http:
//fedora.linuxsir.org/doc/vmware/
3)好了,现在开始测试你的交叉编译器搞好没有。
在u-boot.1.1.2目录下执行如下命令:
1)
Makedistclean(再次强调)
2)
MakeB2_config(随便再个现成的试试^_^)
3)
Make(没错的话应该会生成u-boot.bin文件,发生错误的话也不怕,只要细心看一下哪里错就行了,gcc碰到错误后会退出编译,所以可以一个个错误来改,一般的问题都是没找到编译器(可能你没装或者装的不对,例如人家用的是arm-linux-而你装的是arm-elf-,如果你装了的话看看你的环境变量设好了没有,前面有讲,如果不关编译器的事的话那就再看看,一般是文件的后缀不对,有些文件后缀是大写的,例如start.S但是如果你的是start.s小写的话那当然找不到(解决方法很,把它改成大写就行了)。
细心看吧,不用怕,它都有注明路径,很容易可以找到的))
如果以上步骤都无误的话那么恭喜你,你的交叉编译环境可以用来编译你的u-boot源代码了,可以开始以下阶段。
3.移植:
说时迟那时快,现在开始移植工作(以下是我一步步重新做一遍,力求说得详细点,感谢我吧^_^)
我以B2板子的程序做为模板来做.
#cdu-boot-1.1.2
#cdboard
#cp-Rdavemyboard(这是我取的板子名字,可以换上你的,但是后面的也要跟着来换哦^_^)
#cdmyboard
#mvB2myboards3c44b0(自己取个板子名)
#cdmyboards3c44b0
#mvB2.cmyboards3c44b0.c
修改myboards3c44b0里面的Makefile,把B2改成myboards3c44b0,编译时如果报的其它类似找不到B2的错误也是把相应的B2改成myboards3c44b0来处理。
1)其中的myboards3c44b0.c文件是板的初始化代码,看一下就知道,根据你的板上自带的44binit.s来修改吧。
memsetup.S文件主要是存储器的初始化设置,其实也是44binit.s里面的一部分。
2)其实board这里要修改的不多,先跳过flash部分吧,我们来看一下cpu设置部分吧。
u-boot-1.1.2里面已经加入了对s3c44b0的支持,让我们来看一下cpu/s3c44b0里面的部分吧。
看到start.S这个文件了吗?
要修改的其实并不多,按照你的板设置一下中断跳转矢量就行了,或者上网查一下吧,应该很容易看明的。
其中cpu.c这个文件简直不用修改,再来看一下serial.c这个文件吧,改一下波特率的设置就行,就是你用多少M的CPU频率的话对应的波特率参数设置问题,其实B2已经做得不错的了,很多子程序都不用自己写的了^_^,在我的板上是这样设置的,参考一下吧:
#ifCONFIG_S3C44B0_CLOCK_SPEED==66,把所有的这些66改成60,原因,我的实验板上用的频率是60(44B0最高频率为64M)。
然后其它分频系数,寄存器初始化设置,可以参考一下44blib.c,在这里我给出我的设置出来吧,可以参考一下。
case115200:
#ifCONFIG_S3C44B0_CLOCK_SPEED==60
divisor=32;
UFCON0=0x0;
ULCON0=0x03;
UCON0=0x245;
UBRDIV0=divisor;
我在这方面算术不好,所以都是参考人家的。
3)好,再加上个头文件:
cdu-boot-1.1.2/include/configs
cpB2.hmyboards3c44b0.h
这个头文件其实要改的地方还挺多的,我等下再说怎样修改。
先回到u-boot.1.1.2目录,
4)在Makefile里面加上这部分,不会的话就模仿B2来写吧^_^
在B2的这部分文件
B2_config
:
unconfig
@./mkconfig$(@:
_config=)arms3c44b0B2dave
后面加上这部分:
myboards3c44b0_config
_config=)arms3c44b0myboard3c44b0myboard
切记在@./mkconfig$(@:
_config=)arms3c44b0myboard3c44b0myboard前面的是Tab来的,万万不能用空格代替,因为它是靠这个来识别命令的!
5)好,现在可以在u-boot-1.1.2目录下执行如下命令:
Makedistclean(还是用这个吧,比较彻底)
Makemyboards3c44b0_config
Make
看看有没有错,有错的话按着提示来改,如果没错的话应该就能生成u-boot.bin这个文件,现在还不能用哦,因为这几是B2的一个仿制品而已(注:
在我的机上到这一步可没有报错哦,你一步步按着来做的话应该也不会有什么错误吧^_^)
6)好,现在继续修改u-boot-1.1.2/include/configs/myboards3c44b0.h这个文件。
#defineCONFIG_INIT_CRITICAL
1
这个在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中调试而是固化到flash中运行的话,这个必不可少。
找到#defineCONFIG_B2
把B2改成myboards3c44b0吧(不然就不会编译你的板了)
找到#defineCONFIG_S3C44B0_CLOCK_SPEED
75
你的44b0x应该没有75M吧我的是改成60的
找到Sizeofmalloc()pool这部分设置,改成这样吧,反正我是照着人家来做的,你自己研究下吧^_^。
#defineCFG_MONITOR_LEN
(256*1024)
/*Reserve256kBforMonitor
*/
#defineCFG_ENV_SIZE
(64*1024)
/*1024bytesmaybeusedforenvvars*/
#defineCFG_MALLOC_LEN
(CFG_ENV_SIZE+128*1024)
#defineCFG_GBL_DATA_SIZE
128
/*sizeinbytesreservedforinitialdata*/
#defineCFG_ENV_IS_IN_FLASH
这个必不可少,如果你想把你的参数保存到flash的话(有些板是保存到EEPRAM中去的,但是s3c44b0的话还是保存到flash吧)
#defineCFG_ENV_ADDR
(PHYS_FLASH_1+0x40000)
这个就是你的参数保存在flash里的起始地址了
#defineCFG_ENV_OFFSET0x40000
这个我后来看它源程序发现如果你上一步没有设置它的起始地址的话就会用它来作默认地址的了
#defineCONFIG_AUTO_COMPLETE
其它地方没有深究哦,有些好像不要也行,你就试试吧。
找到Hardwaredrivers部分,这应该是网络芯片设置吧,参考一下这个吧(要看芯片的):
#defineCONFIG_DRIVER_RTL8019
这个就要看你的板上用的是什么网卡了(这个是台湾出的,有10M)
#defineRTL8019_BASE
0x06000000
这个是网卡相就寄存器的起始地址
以下部分我试过不要也行,你试下吧
#defineRTL8019_BUS32
0
#defineCONFIG_SMC_USE_16_BIT
#undef
CONFIG_SHOW_ACTIVITY
#defineCONFIG_NET_RETRY_COUNT
10
应该是重试的次数吧
#defineCONFIG_BAUDRATE
115200
设置波特率
#defineCONFIG_COMMANDS
(CONFIG_CMD_DFL|\
CFG_CMD_DATE|\
CFG_CMD_ELF
|\
CFG_CMD_NET
CFG_CMD_EEPROM
CFG_CMD_I2C
CFG_CMD_FAT|\
CFG_CMD_JFFS2)
把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,虽然不改也是可以的,具体没考究。
以下是板上env参数设置,看一下吧,其实我觉得了解一下就行的了,只是一些初始设置值,以后可以用命令setenv
saveenv来修改的。
#defineCONFIG_BOOTDELAY
3
这个就是运行bootcmd之前的等待时间
#defineCONFIG_BOOTARGS
"
devfs=mountroot=ramfsconsole=ttyS0,115200"
引导uClinux的时候传递的参数,不会就先不用管它也行。
#defineCONFIG_ETHADDR
00:
50:
c2:
1e:
af:
fb
网卡的物理地址MAC
#defineCONFIG_NETMASK
255.255.255.0
掩码地址,设置过ip的人都应该知道吧
#defineCONFIG_IPADDR
192.168.0.30
这是你板上网卡8019的ip地址
#defineCONFIG_SERVERIP
192.168.0.10
这是你宿主机的ip地址,以后用tftp下载的时候用到,一定要跟你的宿主机一致才行。
#defineCONFIG_BOOTFILE
u-boot.bin"
这个就是你要下载文件的默认名字
#defineCONFIG_BOOTCOMMAND
bootm0x50000"
这是bootdelay后运行的命令
Miscellaneousconfigurableoptions部分,参考一下吧:
#define
CFG_LONGHELP
/*undeftosavememory
CFG_PROMPT
s3c44b0=>
"
这是进入命令模式下的提示符,改个帅一点的吧
CFG_CBSIZE
256
/*ConsoleI/OBufferSize
CFG_PBSIZE(CFG_CBSIZE+sizeof(CFG_PROMPT)+16)/*PrintBufferSize*/
CFG_MAXARGS
100
/*maxnumberofcommandargs
#defineCFG_BARGSIZE
CFG_CBSIZE/*BootArgumentBufferSize
#defineCFG_MEMTEST_START
0x0C400000
/*memtestworkson
#defineCFG_MEMTEST_END
0x0C800000
/*4...8MBinDRAM
CFG_CLKS_IN_HZ
/*everything,inclboardinfo,inHz*/
CFG_LOAD_ADDR
0x0c008000
默认的下载地址
CFG_HZ
1000
/*1kHz*/
#defineCFG_BAUDRATE_TABLE
{9600,19200,38400,57600,115200}可供选择的波特率
PhysicalMemoryMap部分,比较重要,修改你的sdram和flash的地址和容量。
#defineCONFIG_NR_DRAM_BANKS1
我们只占用了一个Bank用来映射sdram
#definePHYS_SDRAM_1
0x0c000000
sdram的起始地址
#definePHYS_SDRAM_1_SIZE
0x00800000
sdram的容量(8M)
#definePHYS_FLASH_1
0x00000000
flash的起始地址
#definePHYS_FLASH_SIZE
flash的容量(2M)
#defineCFG_FLASH_BASE
PHYS_FLASH_1
定义多个名字而已,其它地方会用到
FLASHorganization部分,看注释应该知道了吧,参考一下:
#defineCFG_FLASH_ERASE_TOUT
4120000
/*TimeoutforFlashErase(inms)
#defineCFG_FLASH_WRITE_TOUT
4000
/*TimeoutforFlashWrite(inms)
按着来一步步的做应该不难,这里提一下vi程序的用法,其实在google一搜就找到了,不过为了方便大家,还是说一声吧,
在命令模式下:
按/xxx再回车即可搜索到你所需要的内容(xxx),再按n搜索下一个,按shift+n搜索上一个
按:
xxx即可跟到你想要的行
setnu显示行号
其它查书都可以找到就不说了。
做到这个时候,你可以再编译一下,看有没有错,这一步我就没有帮你们做了,不过我觉得应该不会有问题吧,下载到ram中运行,看看效果。
7)终于到了flash的设置部分了,这完全是我个人悟出来的,网上资料好像讲得不是先清楚。
首先介绍一下flash的识别吧,每块flash都有一个id,前部分用来说明生产厂家,后部分用来说明它的容量,类型,位数等。
它们的定义是在u-boot-1.1.2/include/flash.h中,就以我的ssts9vf1601为例:
#defineSST_MANUFACT
0x00BF00BF
这是生产厂家id
#defineSST_ID_xF1601
0x234B234B
这是它的型号,容量,位数等id
#defineFLASH_SST160A
0x0046
这个我还说不清楚,有个要注意的问题是像sst160是不能用奇地址的,我做的过程中是把SST160A改成SST1601的,懒得帮它创一个
好了,相信你已经找到你的板上所用的flash对应的id号了吧?
现在就来谈谈怎么改。
先进入u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它里面已经帮SST160A设置好了,我的做法是把SST公司的160A都改成1601,是不是很简单,当然你也可以帮1601再写一分,但是我是个懒人,所以我就样做了^_^
到这里还有个问题没提到的,就是如果你重新用setenvsaveenv设置了参数,但是复位后会发现怎么没有保存到的(不信你试试看)。
其实我是故意留到这里讲的,应该它不会报错,可以说是比较隐秘的问题,所以我故意放到这里来说,以引起你的重视。
解决方法:
viu-boot-1.1.2/board/myboard/common/flash.c
找到这个函数:
write_buff
里面有这句话:
#ifdefCONFIG_B2
要把B2改了,因为我们的板不叫B2,那叫什么呢?
原来是在这里定义的:
u-boot-1.1.2/include/configs/myboards3c44b0.h
#defineCONFIG_HFRK你不喜欢HFRK这个名字也行,可以改成别的名字,只不过相应地前面的B2也要改成这个名字而已。
4.后记:
本来是想刚做好的时候写的,但是后来发现有些功能实现不了,所以就停住了笔,等我搞好了以后,又急着去学习uClinux的移植,真的很忙,现在终于抽空把它写完。
虽然有些地方还没说清楚(毕竟我对它的了解还不是很深,但我相信在我以后移植系统的过程中会逐步加深对它的了解),我还是希