DSP

基于BF531 DSP的uClinux 移植指南

2019-07-13 18:13发布

原文地址::http://www.analogcn.com/Article/wz3/201101/20110110083314.html    

一、准备工作 

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内复位运行即可。         这里提供给大家的只是个人的并已经成功运行的方法,只是适用于较少的代码量,而且实现方便。官方或网络上也提供其它方法去实现。如下所示,这里就不做多余说明了。