黑金动力社区:http://www.heijin.org
一、准备工作
1. U-BOOT使用官方提供: u-boot-1.1.6-2008R1.tar.bz2
2. uClinux使用官方提供: uClinux-dist-2008R1-RC8.tar.bz2
3. 交叉编译工具: blackfin-toolchain-elf-gcc-4.1-08r1.5-14.i386.tar.bz2
blackfin-toolchain-uclibc-full-08r1.5-14.i386.tar.bz2
blackfin-toolchain-08r1.5-14.i386.tar.bz2
4. 编译环境: Fedora 9.0
二、U-BOOT的移植
U-Boot的移植分成两个部分:首先,在目录/board/下建立一个新目录,将类似的开发板源码拷贝到该目录,并针对我们的新开发板修改相应的配置,编译通过。然后,针对我们新开发板的特点修改相关源码文件,使其能在我们的开发板上运行。
下面分别对这两部分进行介绍:
1. 创建文件
我们的开发板采用的是BF531,与U-Boot中提供的官方BF533-stamp开发板类似,也可以由串行FLASH启动。因此,我们以该开发板为模板,通过修改得到我们新开发板的移植代码。所有操作都以root用户登陆,其它问题在此不再说明。接下来详细阐述U-Boot移植的第一部分,它主要包括以下几个步骤:
(1) 进入U -BOOT的board目录,针对我们的开发板建立文件目录,命名为ms531。
(2) 拷贝bf533-stamp整个目录内的文件到ms531,并更改里面所有bf533-stamp为ms531。目前为此,我们新开发板的文件目录和文件都有了,但 现在还不能在我们开发板上运行。
(3) 修改ms531目录下的Makefile和u-boot.lds,将其中的bf533-stamp全部修改为ms531。注意在spi-flash.c中要对串行flash进行修改,在旧版本 中,都要在这个文件中对flash的大小进行设置。新版本则已经做了对所有支持的flash描述,不需要人为修改。具体支持的flash类型请参考官方 文档或自己查看该文件。
(4) 进入./include/configs目录内,复制一份bf533-stamp.h并命名为ms531.h。这个头文件中有很多内容要修改,我们将在第二部分中进行说明。
(5) 修改顶层目录下的Makefile,在”BFIN_BOARDS=”添加”ms531”。注意不同版本的Makefile有点偏差,需根据实际情况添加。
(6) 最后编译u-boot:
#make clean
#makems531_config(就是在Makefile里添加的config)
#make
(7) 编译正确,生成u-boot.ldr文件,其它编译文件先不用管,这一部分就算完成了。下面我们尝试修改相应的源代码。以适合我们的MS531板。
2. 修改文件
这一部分主要是修改开发板配置文件以及flash驱动。我们先来修改开发板配置文件,让u-boot能运行起来。修改的主要内容包括:启动模式、串口设置、时钟设置、flash设置和SDRAM设置。注意,不同版本的设置会有不同,尤其是启动模式的设置,一定要参考官方的文档进行。下面分别进行介绍:
(1) 首先设置启动模式
#defineBFIN_CPU bf531
#defineBFIN_BOOT_MODE BFIN_BOOT_SPI_MASTER
(2) 串口设置,将波特率设置为115200
#defineCONFIG_BAUDRATE 115200
(3) 时钟设置
根据开发板晶振频率和系统需要的工作频率进行设置,我们开发板的晶振为20MHz,内核时钟为输入时钟的20倍频,系统时钟为内核时钟的5分频,所以如下设置。根据开发板上具体配制及需求进行更改。
#defineCONFIG_CLKIN_HZ 20000000
/*CONFIG_CLKIN_HALF controls what is passed to PLL 0=CLKIN */
/* 1=CLKIN/2 */
#define CONFIG_CLKIN_HALF 0
/*CONFIG_PLL_BYPASS controls if the PLL is used 0=don't bypass */
/* 1=bypass PLL */
#defineCONFIG_PLL_BYPASS 0
/*CONFIG_VCO_MULT controls what the multiplier of the PLL is. */
/* Values canrange from 1-64 */
#defineCONFIG_VCO_MULT 20
/*CONFIG_CCLK_DIV controls what the core clock divider is */
/* Values can be1, 2, 4, or 8 ONLY */
#defineCONFIG_CCLK_DIV 5
/*CONFIG_SPI_BAUD controls the SPI peripheral clock divider */
/* Values canrange from 2-65535 */
/* SCK Frequency= SCLK / (2 * CONFIG_SPI_BAUD) */
#defineCONFIG_SPI_BAUD 2
/*CONFIG_SCLK_DIV controls what the peripheral clock divider is */
/* Values canrange from 1-15 */
#defineCONFIG_SCLK_DIV 4
(4) SDRAM设置
根据你的开发板SDRAM容量和起始地址定制,我们的开发板SDRAM容量为32MB,列地址宽度为9,起始地址为0x00000000。最大SDRAM在本版本中已经按下面的设计计算好了,不需要再作更改,在其它版本中需要注意,对应地方的更改。
#defineCFG_LARGE_IMAGE_LEN 0x1000000 /* LargeImage Length */
#defineCONFIG_MEM_SIZE 32 /*128, 64, 32, 16 */
#define CONFIG_MEM_ADD_WDTH 9 /* 8, 9, 10, 11 */
(5) 网络,实时时钟,I2C等不需要的部分可关闭,只要对应的值设置为0就行。不关闭也不会出错的。
(6) 最后重新配置编译生成的u-boot.ldr,并下载到开发板即可以运行了,应该能看到串口返回的u-boot成功运行的信息。然后可自行用u-boot命令测试是否移植成功。
三、uClinux的移植
同样使用官方的BF533-stamp当模块进行移植。如果只是更改对应的CPU时钟,SDRAM,波特率等设置就可以使用u-boot下载到SDRAM里面运行uClinux。但是生成的uImage文件占3.5M空间,而ms531 只有2M的flash。由于官方支持声音与图像的驱动是完全没有必要的,所以有必要进行裁减。具体操作包括以下几步:
(1) 进入uClinux-dist目录,输入如下命令:#make menuconfig;也可以用make xconfig进入图形化设置。注意如果之前编译过,应先makeclean。
第一次编译会出现几个是否支持USB OTG的选项,可以不用管,反正也不用。然后会进入如下界面,开始对uClinux的裁减。
在vendor/Product Selection内选择产商及模板,也可自行在vendor文件夹内建立模板,这里直接使用ADI公司带的BF531-stamp模板。也可以在vendor文件夹内自己立一个MS531文件夹,然后下面所以设置就会被保存在该文件夹内。
在Kernel/library/Defaults Selection内要将Customize kernelsetting和CustomizeVendor/User setting 选择上。因为这是我们需要裁减的两部分,如果不选择上,则使用BF533-stamp的默认配置。
然后退出选择保存,编译会自动进行,下一步就会进入Customize kernelsetting 界面,如下图所示。
(2) BlackfinProcessor Options 里面是一定要做修改的地方,CPU更改BF531,时钟20M,波特默认改为115200,SRAM Size 32,Address Width为9,其它可默认。要注意的就是如果RE-programclocks while Kernel boots?那一项选上话,就表示启动uClinux后PLL设置会重新按这里的设置更改,如果不选上的话,PLL设置则会按原理u-boot上的设置。
退到原来界面,剩下就开始裁减不需要的东西了。各位可以根据自己的实际来裁判,现在主要是内核内的裁减,如果搞不清楚什么意思的就不要取消掉。我们现在把busoptions里所有选项取消了,把Networking取消了。还有就是Device Drivers 里面不需要驱动的取消掉,把File system里面不需要支持YAFF2文件系统取消掉。安全性能不需要支持也全取消掉,然后退出保存。
(3) 接下来对CustomerVendor/user进行裁减,这一块很容易明白。基本都是些应用程序,不需要直接取消掉,需要的就加上。不要取消掉CoreApplication 内init选项。另外如果网络取消掉了,要将Busybox内的syslog支持去掉,并取消掉下面syslog的应用程序选项,否则后面编译好的内核将会一直出现syslog错误。建议将MiscellaneousApplication 内的Zmodenutils选上,默认是不选择的,因为默认的开发板是带网口的,传输文件可以用tftp,而这里就只能用经典的串口传输协议zmodem。可以直接在超级终端内将编译好的文件传输到系统内进行调试。另外Blackfin还提供很多测试用的程序及应用程序,可根据具体情况或具体大小去选择,这里就不一一阐述。
(4) 注意后面编译系统时如果显示user文件夹内出错,则是没有对应的库,或是在内核选项中取消了对应支持导致,或是没打对应的补丁,可自行打PACKAGE内的补丁,如果还不行又搞不清,那就不要加这个应用程序,就可以编译过去了。如果还是不明白是对应的哪个选项,那就直接打开user文件夹内的Makefile屏蔽掉对应错误的运用程序。
(5) 保存退出后,输入make命令,编译整个系统。在 image 文件夹内会得到我们所需要的uImage文件。跟u-boot一样也会得到其它类型的文件,各位就自己研究吧。
(6) 其它常用到的编译命令如下:
#make linux ; 编译内核文件
#make romfs ; 编译根文件系统
#make image ;生成uImage镜像文件
四、HELLO,CHINA!
编写史上最经典的程序“HELLO,CHINA!“,这个不会请百度去。然后用下面命令编译:
#bfin-uclinux-gcc-Wl,-elf2flt hello.c -o hello;
生成uclinux下FLT可执行文件,注意不能直接bfin-uclinux-gcc编译,那样生成可执行文件运行时会提示”ELF:not found”。
其它还可用的编译工具有bfin-linux-uclibc-gcc和bfin-linux-uclibc-strip它们之间所用的库是不一样,具体请参考官方文档。
生成可执行文件通过终端下载到系统中,这次就用到上面添加的Zmodem协议。如下图所示:
选择发送文件,协议选择“Zmodem与崩溃恢复”,然后直接点发送,会自动调用lsz命令去发送文件,这里不需要管它。文件会直接发送到当前你所进入的目录下。然后运行命令:
#chmod777 hello;
更改文件属性后,就可以直接运行该程序了。注意这里的系统已经复制到SDRAM内运行,所以掉电后,该程序是不会保存的。好,到这里一个系统才算建立起来。
五、uClinux加入应用程序
编译好的系统在当前目录下会生成根文件系统,直接make是已经执行了make romf命令,所以直接将编译生成程序加入到该文件系统内,并更改/etc/rc文件就可以实现,用户程序上电后自动运行。
编译写led.c文件程序见附录所示,当然内核裁减不要把GPIO驱动给减没了。可以查看系统的/dev文件内是否有pf0—pf15。用bfin-uclinux-gcc命令编译后生成可执行文件。复制到romf文件夹内的/home文件夹。然后更改/etc内的rc文件,加入如下代码:
Sleep3 ; 如果前面带有网络,并且下面的程序是基于网络的,则需要一定的等待时间,不是则可以不加。
/hom/led&
然后回到主目录重新执行make image命令,生成uImage文件,烧到flash内复位运行即可。
这里提供给大家的只是个人的并已经成功运行的方法,只是适用于较少的代码量,而且实现方便。官方或网络上也提供其它方法去实现。如下所示,这里就不做多余说明了。
附录1
MS531 体验板靓照