zoukankan      html  css  js  c++  java
  • 【黑金动力社区】【BF531体验板教程】 基于BF531 DSP 的 uClinux 移植指南(四)

    黑金动力社区

    黑金动力社区: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 体验板靓照

  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/kingst/p/1789019.html
Copyright © 2011-2022 走看看