锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

uboot 移植

时间:2022-11-21 01:00:00 rm7a传感器

转载:http://blog.sina.com.cn/s/blog_9340c4f901010n48.html

1.来由:

在我搞完ucos(本来想学uclinux然而,如果你对系统一无所知,你最好先学习ucos比较实际^_^,也可以对系统有一个清晰的概念),我意识到如果要搞系统,一个功能强大。bootloader这是必不可少的,我的板上有自己的东西armboot(其实我个人认为应用是应用的ARM上的话armboot毕竟已经够了u-boot也是从armboot发展起来的纯粹是个人意见),如果我的板上有自己的光盘移植了armboot源代码供我参考的话,我想我也不会花这么多时间去搞u-boot,可恨的是我的光盘上只有armboot.bin这个二进制文件,没有源文件,没办法。我下定决心自己做一个。经过考虑,我选择了u-boot,毕竟参考资料比较多,然后我就完成了u-boot后再回头看armboot,这是炉子里的一个蛋糕,这是后话。

2.准备:

说起来容易,很难做到。因为编译u-boot要在linux在我们平时熟悉的环境中,我们不能熟悉环境ads如此直观。首先,我们应该建立一个交叉编译环境。这个交叉编译环境可以自己做,但完全没有必要,而且非常困难。一般来说,它是下载人们编译的工具。一开始,我在这里很长时间都很沮丧。现在我觉得以后很简单。在一些情况下,我把方法说清楚,希望没有人会对这个问题感到沮丧^_^

1)在网上下载一个u-boot我用的是源代码1.1.2版本的,最新的应该是1.1.4的吧,其实差不多,那就像我那样下载一个1.1.2版本的吧。把源文件解压,这个应该不用说了吧,学过linux的人应该会,不会的话我想你继续做下去也困难,那就先装个linux用下吧(我用的是RedHat的,哦对了,编译程序是需要gcc编译器的,所以安装方式一定要选择工作站哦^_^)。好了,解压后你发现在u-boot.1.1.2目录下有Makefile这个文件吧?让我们看看它里面的内容,最简单的方法就是vi Makefile了。我们要看的是它选择的是哪一个交叉编译器。可以看到这一项:

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

看到吧,也就是说这里所用的交叉编译器是arm-linux-gcc了,(u-boot默认是用这个的,也有用arm-elf-gcc的,网上有个工具包arm-elf-tools-20030314.sh,我试过用它来编译,没有问题,顺便提一下,arm-elf-gcc是用来编译uClinux内核的工具来的)那你就下载一个arm-linux-的交叉编译器吧,我是在网上下载EABI-4.3.3.tar.bz2这个文件,然后解压得到4.3.3版本的交叉编译工具的(具体设置参考网上)

这里提几个注意点:

1.不可用winRAR解压u-boot-1.1.2.tar.bz2u-boot-1.1.2.tar.gz这种文件(就个可能新手会犯,一般熟悉linux命令的人应该都不会这样做吧,在此还是要提一下)

2.可能下载的文件有一些中间文件会阻碍编译的运行,所以在编译前最好来个彻底清除,在u-boot.1.1.2目录下运行命令:make distclean (其实这个命令在Makefile文件下就有)我当时为这个问题郁闷了很久,希望你们不会像我这样^_^;

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文件,发生错误的话也不怕,只要细心看一下哪里错就行了,gcc碰到错误后会退出编译,所以可以一个个错误来改,一般的问题都是没找到编译器(可能你没装或者装的不对,例如人家用的是arm-linux-而你装的是arm-elf-,如果你装了的话看看你的环境变量设好了没有,前面有讲,如果不关编译器的事的话那就再看看,一般是文件的后缀不对,有些文件后缀是大写的,例如start.S但是如果你的是start.s小写的话那当然找不到(解决方法很,把它改成大写就行了)。细心看吧,不用怕,它都有注明路径,很容易可以找到的))

如果以上步骤都无误的话那么恭喜你,你的交叉编译环境可以用来编译你的u-boot源代码了,可以开始以下阶段。

u-boot移植日记2(新手必读)

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来处理。

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这个文件吧,改一下波特率的设置就行,就是你用多少MCPU频率的话对应的波特率参数设置问题,其实B2已经做得不错的了,很多子程序都不用自己写的了^_^,在我的板上是这样设置的,参考一下吧:

#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的这些66改成60,原因,我的实验板上用的频率是6044B0最高频率为64M)。然后其它分频系数,寄存器初始化设置,可以参考一下44blib.c,在这里我给出我的设置出来吧,可以参考一下。

case 115200:

#if CONFIG_S3C44B0_CLOCK_SPEED==60

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

      (TAB键 )@./mkconfig $(@:_config=) arm arm920t TQ2440 NULL s3c2440我修改了

各项含义如下:

arm :    CPU的架构(ARCH)

arm920t:  CPU的类型(cpu),其对应于 cpu/arm920t子目录

TQ2440: 开发板的型号(board),其对应于board/TQ2440的目录

NULL 开发者/经销商

s3c2440 片上系统/(SOC)

  • 切记在@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard前面的是Tab来的,万万不能用空格代替,因为它是靠这个来识别命令的!

5)好,现在可以在u-boot-1.1.2目录下执行如下命令:

Make distclean(还是用这个吧,比较彻底)

Make myboards3c44b0_config

Make

看看有没有错,有错的话按着提示来改,如果没错的话应该就能生成u-boot.bin这个文件,现在还不能用哦,因为这只是B2的一个仿制品而已(注:在我的机上到这一步可没有报错哦,你一步步按着来做的话应该也不会有什么错误吧^_^)

u-boot移植日记3(新手必读)

6)好,现在继续修改u-boot-1.1.2/include/configs/myboards3c44b0.h这个文件。

#define CONFIG_INIT_CRITICAL     1         这个在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中调试而是固化到flash中运行的话,这个必不可少。

找到 #define CONFIG_B2                 B2改成myboards3c44b0吧(不然就不会编译你的板了)

找到 #define CONFIG_S3C44B0_CLOCK_SPEED   75   你的44b0x应该没有75M吧 我的是改成60

找到Size of malloc() pool这部分设置,改成这样吧,反正我是照着人家来做的,你自己研究下吧^_^

 

#define CFG_MONITOR_LEN            (256 * 1024)  

#define CFG_ENV_SIZE                 (64*1024)        

#define CFG_MALLOC_LEN              (CFG_ENV_SIZE + 128*1024 )

#define CFG_GBL_DATA_SIZE    128  

#define CFG_ENV_IS_IN_FLASH         1  这个必不可少,如果你想把你的参数保存到flash的话(有些板是保存到EEPRAM中去的,但是s3c44b0的话还是保存到flash吧)

#define CFG_ENV_ADDR    (PHYS_FLASH_1+0x40000)  这个就是你的参数保存在flash里的起始地址了

#define CFG_ENV_OFFSET 0x40000      这个我后来看它源程序发现如果你上一步没有设置它的起始地址的话就会用它来作默认地址的了

#define CONFIG_AUTO_COMPLETE

其它地方没有深究哦,有些好像不要也行,你就试试吧。

找到Hardware drivers部分,这应该是网络芯片设置吧,参考一下这个吧(要看芯片的):

#define CONFIG_DRIVER_RTL8019        这个就要看你的板上用的是什么网卡了(这个是台湾出的,有10M

#define RTL8019_BASE        0x06000000   这个是网卡寄存器的起始地址

以下部分我试过不要也行,你试下吧

#define RTL8019_BUS32             0

#define CONFIG_SMC_USE_16_BIT

#undef  CONFIG_SHOW_ACTIVITY

#define CONFIG_NET_RETRY_COUNT           10       应该是重试的次数吧

#define CONFIG_BAUDRATE             115200  设置波特率

#define CONFIG_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来修改的。

#define CONFIG_BOOTDELAY   3                这个就是运行bootcmd之前的等待时间

#define CONFIG_BOOTARGS  "devfs=mount root=ramfs console=ttyS0,115200" 引导uClinux的时候传递的参数,不会就先不用管它也行。

#define CONFIG_ETHADDR       00:50:c2:1e:af:fb    网卡的物理地址MAC

#define CONFIG_NETMASK  255.255.255.0       掩码地址,设置过ip的人都应该知道吧

#define CONFIG_IPADDR   192.168.0.30          这是你板上网卡8019ip地址

元器件数据手册、IC替代型号,打造电子元器件IC百科大全!

相关文章