⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u-boot.txt

📁 利用linux把 u-boot成功移植到 s3c44b0x上 的一点心得
💻 TXT
字号:

 1.准备:
          说是容易,做起来却挺难。因为编译u-boot要在linux环境下,而不能在我们平时所熟悉的ads下那么直观。首先要建立好交叉编译环境 我是下载人家编译好的工具。 
1)在网上下载一个u-boot源代码,我用的是1.2.0版本的,最新的版本。把源文件解压,这个应该不用说了吧,学过linux的人应该会。
这里提几个注意点:
1.不可用winRAR解压u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz这种文件 。
2.可能下载的文件有一些中间文件会阻碍编译的运行,所以在编译前最好来个彻底清除,在u-boot.1.1.2目录下运行命令:make distclean  
3,有些人为了方便想在cygwin下编译,但是经常在网上看到在这个虚拟平台下编译有很多的问题,要配置的东西也多,而且好像我用过那个vi没有linux环境下的好用,所以最好还是不要用这个软件了吧,如果你真的离不开windows的话可以像我这样装个虚拟机,在虚拟机下再装linux的系统,具体参考这个网站):http://fedora.linuxsir.org/doc/vmware/
3)现在开始测试你的交叉编译器搞好没有。在u-boot.1.1.2目录下执行如下命令:
1)Make distclean (再次强调)
2)Make B2_config(随便再个现成的试试^_^)
3)Make (没错的话应该会生成u-boot.bin文件)
如果以上步骤都无误的话那么恭喜你,你的交叉编译环境可以用来编译你的u-boot源代码了,可以开始以下阶段。
3.移植:
我以B2板子的程序做为模板来做. 
#cd u-boot-1.1.2
#cd board 
#cp -R dave myboard (这是我取的板子名字,可以换上你的,但是后面的也要跟着来换哦^_^) 
#cd myboard
#mv B2 myboards3c44b0 (自己取个板子名) 
#cd myboards3c44b0 
# mv B2.c myboards3c44b0.c 
修改myboards3c44b0里面的Makefile, 把B2改成myboards3c44b0,编译时如果报的其它类似找不到B2的错误也是把相应的B2改成myboards3c44b0来处理。 
u-boot-1.1.2里面已经加入了对s3c44b0的支持,让我们来看一下cpu/s3c44b0里面的部分吧。
看到start.S这个文件了吗?要修改的其实并不多,按照你的板设置一下中断跳转矢量就行了,或者上网查一下吧,应该很容易看明的。其中cpu.c这个文件简直不用修改,再来看一下serial.c这个文件吧,改一下波特率的设置就行,就是你用多少M的CPU频率的话对应的波特率参数设置问题,其实B2已经做得不错的了,很多子程序都不用自己写的了^_^,在我的板上是这样设置的,参考一下吧:
#if CONFIG_S3C44B0_CLOCK_SPEED==66  我的实验板上用的频率是66(44B0最高频率为66M)。然后其它分频系数,寄存器初始化设置,可以参考一下44blib.c,在这里我给出我的设置出来吧,可以参考一下。
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==66
divisor = 32;
UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;
我在这方面算术不好,所以都是参考人家的。
3)好,再加上个头文件:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
再回到u-boot.1.1.2目录,
4)在Makefile里面加上这部分,不会的话就模仿B2来写吧^_^
在B2的这部分文件
B2_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上这部分:
myboards3c44b0_config:unconfig
@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
切记在@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard前面的是Tab来的,万万不能用空格代替,因为它是靠这个来识别命令的!
   
5)好,现在可以在u-boot-1.1.2目录下执行如下命令:
Make distclean(还是用这个吧,比较彻底)
Make myboards3c44b0_config
Make
看看有没有错,有错的话按着提示来改,如果没错的话应该就能生成u-boot.bin这个文件,现在还不能用哦,因为这几是B2的一个仿制品而已 。
6)好,现在继续修改u-boot-1.1.2/include/configs/myboards3c44b0.h这个文件
找到 #define CONFIG_B2          1        把B2改成myboards3c44b0吧(不然就不会编译你的板了)
找到Size of malloc() pool这部分设置 , 我是照着人家来做的 。
#define CFG_MONITOR_LEN(256 * 1024)/* Reserve 256 kB for Monitor*/
#define CFG_ENV_SIZE   (64*1024)/* 1024 bytes may be used for env vars*/
#define CFG_MALLOC_LEN(CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE128/* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH  1  这个必不可少,如果你想把你的参数保存到flash的话(有些板是保存到EEPRAM中去的 )
#define CFG_ENV_ADDR(PHYS_FLASH_1+0x40000)  这个就是你的参数保存在flash里的起始地址了
#define CFG_ENV_OFFSET0x40000      这个我后来看它源程序发现如果你上一步没有设置它的起始地址的话就会用它来作默认地址的了
#define CONFIG_AUTO_COMPLETE
找到Hardware drivers部分,这应该是网络芯片设置吧,参考一下这个吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019        这个就要看你的板上用的是什么网卡了(这个是台湾出的,有10M)
#define RTL8019_BASE0x06000000   这个是网卡相就寄存器的起始地址
把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,虽然不改也是可以的,具体没考究。
以下是板上env参数设置,看一下吧,其实我觉得了解一下就行的了,只是一些初始设置值,以后可以用命令setenv  saveenv来修改的。
#define CONFIG_BOOTDELAY  -1              这个就是运行bootcmd之前的等待时间,我们没有网卡,所以不用等待。
#define CONFIG_BOOTFILE"u-boot.bin"        这个就是你要下载文件的默认名字
#define CONFIG_BOOTCOMMAND"bootm 0x50000"   这是bootdelay后运行的命令

Miscellaneous configurable options部分,参考一下吧:
#defineCFG_LONGHELP/* undef to save memory*/
#defineCFG_CBSIZE256/* Console I/O Buffer Size*/
#defineCFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#defineCFG_MAXARGS 100/* max number of command args*/
#define CFG_BARGSIZECFG_CBSIZE/* Boot Argument Buffer Size*/

#define CFG_MEMTEST_START    0x0C400000/* memtest works on*/
#define CFG_MEMTEST_END 0x0C800000/* 4 ... 8 MB in DRAM*/
#undef  CFG_CLKS_IN_HZ/* everything, incl board info, in Hz */
#defineCFG_LOAD_ADDR0x0c008000默认的下载地址
#defineCFG_HZ1000/* 1 kHz */
#define CFG_BAUDRATE_TABLE  { 9600, 19200, 38400, 57600, 115200 } 可供选择的波特率(我用的是115200,对应的波特率为21,第一次四舍五入取了20,无法使硬件正常工作,计算公式:波特率=int(工作频率)/(115200*16)-1)


Physical Memory Map部分,比较重要,修改你的sdram和flash的地址和容量。
#define CONFIG_NR_DRAM_BANKS 1   我们只占用了一个Bank用来映射sdram
#define PHYS_SDRAM_1 0x0c000000     sdram的起始地址
#define PHYS_SDRAM_1_SIZE 0x00800000     sdram的容量(8M)
#define PHYS_FLASH_1 0x00000000     flash的起始地址
#define PHYS_FLASH_SIZE flash的容量(2M)
#define CFG_FLASH_BASEPHYS_FLASH_1   定义多个名字而已,其它地方会用到


FLASH organization部分,看注释应该知道了吧,参考一下:
#define CFG_FLASH_ERASE_TOUT4120000/* Timeout for Flash Erase (in ms)*/
#define CFG_FLASH_WRITE_TOUT4000/* Timeout for Flash Write (in ms)*/
做到这个时候,你可以再编译一下,看有没有错, 不过我觉得应该不会有问题吧,下载到ram中运行,看看效果。


7)终于到了flash的设置部分了,这完全是我个人悟出来的,网上资料好像讲得不是先清楚。
 首先介绍一下flash的识别吧,每块flash都有一个id,前部分用来说明生产厂家,后部分用来说明它的容量,类型,位数等。它们的定义是在u-boot-1.1.2/include/flash.h中,就以我的ssts9vf1601为例:
#define SST_MANUFACT0x00BF00BF  这是生产厂家id
#define SST_ID_xF16010x234B234B  这是它的型号,容量,位数等id
#define FLASH_SST160A0x0046   这个我还说不清楚,有个要注意的问题是像sst160是不能用奇地址的,我做的过程中是帮它创一个SST1601的
好了,相信你已经找到你的板上所用的flash对应的id号了吧?现在就来谈谈怎么改。
先进入u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它里面已经帮SST160A设置好了,我的做法是把SST公司的160A都改成1601,是不是很简单,当然你也可以帮1601再写一分,我是自己写的。

到这里还有个问题没提到的,就是如果你重新用setenv saveenv 设置了参数,但是复位后会发现怎么没有保存到的(不信你试试看)。其实我是故意留到这里讲的,应该它不会报错,可以说是比较隐秘的问题,所以我故意放到这里来说,以引起你的重视。
解决方法:vi u-boot-1.1.2/board/myboard/common/flash.c
找到这个函数:write_buff
里面有这句话:#ifdef CONFIG_B2
要把B2改了,因为我们的板不叫B2,那叫什么呢?原来是在这里定义的:u-boot-1.1.2/include/configs/myboards3c44b0.h
里面有这句话:#define CONFIG_HFRK 你不喜欢HFRK这个名字也行,可以改成别的名字,只不过相应地前面的B2也要改成这个名字而已。
8)
最主要的是修改内存:
9)在烧入硬件时发现还是出错,最后在产品手册里发现原因,原来我所用的bank上的总线宽度为16位,不是32位。而我所用的程序默认为32位
   修改如下:在board/myboard/myboardsc344b0/lowlevelinit.s下把 .long  ox12111900   改为.long  ox1111900

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -