天天看點

Davinci DM6446開發攻略——linux-2.6.18移植

    TI DAVINCI 使用最新的核心是montavista linux-2.6.18,之前說過,國内很多公司,包括開發闆的軟體包,一直在使用montavista linux-2.6.10,這個版本準确來說是比較低的,實時性肯定沒2.6.18好(MontaVista Linux Professional Edition 5.0以linux-2.6.18為基礎,打破了Linux不适用于實時和嵌入式應用的迷思);使用devfs,沒有使用udev;對DM365等新出的DAVINCI晶片支援限度很小;ucLibc支援(減少75%應用程式資源需求);IPv6(增加更多Internet Protocol version 6 (IPv6)支援,提供比舊版産品更優異的效能、安全和管理功能);等等,這些優點不得不讓人心動。

<b>第一步:簡化</b><b>linux-2.6.18</b><b></b>

如果你已經安裝好TI mvl_5_0_0_demo_lsp_setuplinux_02_00_00_140.bin,先在你的工作目錄下建立linux-2.6.18_pro500的目錄,進入改目錄,比如/home/&lt;useraccount&gt;\ dm6446/linux-2.6.18_pro500/,COPY核心源代碼到本目錄下,指令如下:

<b>cp –r /opt/mv_pro_5.0.0/montavista\pro/devkit/lsp/ti-davinci/linux-2.6.18_pro500/* </b><b>.</b>

(注意”<b>*</b>” ”<b>.</b>”之間的空格)

和UBOOT移植一樣,我們先把一些不相關的平台給删除掉,進入arch目錄,保留arm目錄,其他全部删除掉。

進入linux-2.6.18_pro500/arch/arm/,<b>保留</b>boot,common,configs,kernel,lib,mach-davinci,mm,nwfpe,oprofile,plat-mxc,plat-omap,tools,vfp和其他4個檔案Kconfig,Makefile, Kconfig-nommu, Kconfig.debug,其他有關mach-xxxx的全部删除掉。

删除include下不相關平台的檔案夾:asm-alpha,asm-arm26,asm-cris,asm-frv,asm-h8300,asm-i386,asm-ia64,asm-m32r,asm-m68k,asm-m68knommu,asm-mips,asm-parisc,asm-powerpc,asm-ppc,asm-ppc64,asm-s390,asm-sh,asm-sh64,asm-sparc,asm-sparc64,asm-um,asm-v850,asm-x86_64,asm-xtensa全部删除掉,其他就不用删了,否則出問題。

<b>第二步:建立交叉編譯環境</b><b></b>

    進行下面工作之前,確定你的GCC已經按《DAVINCI DM6446開發攻略——環境搭建篇》建立好。

1、  頂層Makefile修改:

在172行,即# make CROSS_COMPILE=ia64-linux-下面,加入:

<b>ARCH = arm</b>

<b>  CROSS_COMPILE = arm_v5t_le-</b>

把下面:ARCH := $(shell if [ -f .mvl_target_cpu ]; then \

               cat .mvl_target_cpu; \

        else \

               echo $(SUBARCH); \

        fi)

CROSS_COMPILE   = $(shell if [ -f .mvl_cross_compile ]; then \

                         cat .mvl_cross_compile; \

                 fi)

全部注釋掉;

2、  COPY UBOOT 的mkimage工具

從編譯好的UBOOT裡tool目錄下的mkimage工具COPY到linux-2.6.18_pro500目錄以下,

3、  添加mkzImage.sh

使用vi生成mkzImage.sh,把以下内容加入檔案:

    #!/bin/sh

./mkimage -n 'linux-2.6.18' -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008040 -d zImage davinci_kernel.bin

chmod 777 davinci_kernel.bin

cp -f davinci_kernel.bin /tftpboot

儲存在linux-2.6.18_pro500/目錄下,配合mkimage,友善把zImage轉換成davinci_kernel.bin,這樣UBOOT才能把linux kernel給BOOT起來;

4、  修改arch/arm/boot/Makefile:

在57行下面加入:

@cp -f arch/arm/boot/zImage zImage

這樣每次編譯zImage,生成的zImage可以自動COPY到linux-2.6.18_pro500目錄下。

5、  修改fs/hostfs/Makefile

   因為删除um和asm-um,當使用make distclean操作的時候會出現問題,是以把:

include arch/um/scripts/Makefile.rules注釋掉。

6、  修改arch/arm/Kconfig

因為删除其他不相關的平台的檔案夾,是以Kconfig也把這些平台給注釋掉:

從135行開始一直到343行

#config ARCH_AAEC2000

#      bool "Agilent AAEC-2000 based"

#      select ARM_AMBA

#      help

#        This enables support for systems based on the Agilent AAEC-2000

。。。。。。。。。。。。。。。。。。。

#config ARCH_OMAP

#      bool "TI OMAP"

#        Support for TI's OMAP platform (OMAP1 and OMAP2).

以上全部注釋掉。

從第355行開始到399行,全部注釋掉:

#source "arch/arm/mach-clps711x/Kconfig"

#source "arch/arm/mach-ep93xx/Kconfig"

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

#source "arch/arm/mach-netx/Kconfig"

<b>第三步:核心移植裁減</b><b></b>

1、  在linux-2.6.18_pro500目錄下,使用以下指令開始配置核心:

cp arch/arm/configs/ davinci_dm644x_defconfig .config

make menuconfig

進入熟悉的kernel配置界面:

2、  去掉ATA DRIVER

由于本人的開發闆沒有NOR FLASH,也沒有ATA硬碟之類的東西,這一點和TI EVM闆不一樣,是以我們先把裝置驅動裡的ATA選項去掉。

然後儲存配置退出,使用

Make zImage

編譯完後,運作./mkzImage.sh,可以COPY生成的bin檔案到/tftpboot目錄下,參照上篇有關uboot的文章,使闆子把uboot運作起來,使用進入UBOOT指令行:

U-Boot &gt;tftp 80008000 davinci_kernel.bin

U-Boot &gt;bootm 80008000

之後可以在序列槽終端看到核心的運作資訊。

3、  修改arch/arm/mach-davinc/board-evm.c

有關dm644x的平台資訊就在board-evm.c裡,包括nand flash 分區配置,管腳複用配置,psc初始化等等。

在74行,把有關nor flash的代碼全部注釋掉,在

static struct platform_device *davinci_evm_devices[] __initdata = {

&amp;serial_device,

#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)

<b>//&amp;davinci_evm_flash_device,</b>

#endif

#if defined(CONFIG_MTD_NAND_DAVINCI) || defined(CONFIG_MTD_NAND_DAVINCI_MODULE)

&amp;davinci_nand_device,

&amp;rtc_dev,

&amp;davinci_fb_device,

#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \

    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)

&amp;davinci_ide_device,

#if defined(CONFIG_MMC_DAVINCI) || defined(CONFIG_MMC_DAVINCI_MODULE)

&amp;mmc0_device,

};

把nor flash的裝置驅動注釋掉;

對nand flash進行分區,這個要和UBOOT燒寫UBOOT KERNEL ROOTFS等燒寫的位址一一對應;

static struct mtd_partition davinci_nand_partitions[] = {

/* bootloader (U-Boot, etc) in first sector */ /*Mtdblock0*/

{

        .name             = "bootloader",

        .offset            = 0,

        .size        = SZ_1M+SZ_512K,

        .mask_flags    = 0, /* force read-only */

},

/* bootloader params in the next sector */   /*Mtdblock1*/

        .name             = "dspcore",

        .offset            = SZ_1M+SZ_512K,

        .size        = (SZ_8M-SZ_2M-SZ_512K),

(這裡注明一下:mtdblock1源代碼被定義為128K參數,但是在UBOOT裡,我們把參數放在0x0000開始的位址,這裡可以保留該分區,也可以不要。本人定義成DSP BIN檔案存放的地方,有種調試方式可以不用KERNEL就可以在UBOOT把DSP BOOT起來,雙核并行運作嘛。這個分區在本人這裡是拿來測試DSP程式,一般不建議使用UBOOT方式把DSP給BOOT起來。這個DSP BIN就是通過HEX64工具生成的,這和DM642、DM6437的BIN檔案完全一樣。具體說,把DSP程式運作起來常用有四種方法,一是硬體BOOT方式選擇DSP BOOT,二是通過UBOOT把BIN啟動起來,三是通過核心把BIN啟動起來,四是DSP SERVER方式,即*.x64P,就是最常用的Codec Engine機制。第三種方式也有很多公司在用,然後通過共享記憶體方式、中斷等實作雙核通信。)

/* kernel */  /*Mtdblock2*/

        .name             = "kernel",

        .offset            = (SZ_8M-SZ_1M),

        .size        = SZ_4M+SZ_1M,

       .mask_flags    = 0,

/* file system */  /*Mtdblock3*/

        .name             = "rootfs",

        .offset            = (SZ_8M+SZ_4M),

        .size        = SZ_64M,

        .mask_flags    = 0,

/* data */    /*Mtdblock4*/ 這個可以儲存一些備份資料,一可以不用定義

        .name             = "data",

        .offset    = (SZ_64M+SZ_8M+SZ_4M),

        .size        = (SZ_128M-(SZ_64M+SZ_8M+SZ_4M)),

        .mask_flags = MTD_WRITEABLE,

}

以上是NAND 分區資訊,針對各自闆子不同大小的NAND FLASH,合理配置設定空間。

#if 1

<b>static struct platform_device rtc_dev = {</b>

<b>.name            = "pcf8563",</b>

<b>.id          = -1,</b>

<b>};</b>

#else

static struct platform_device rtc_dev = {

.name             = "rtc_davinci_evm",

.id          = -1,

以上的代碼修改,表示闆子采用pcf8563 時鐘晶片作為RTC裝置,本人的闆子不采用TI-EVM的電路,是以要修改這裡,同時在drivers/rtc目錄下,修改rtc-pcf8563.c的一個BUG,就是:

static unsigned short normal_i2c[] = { <b>0x51, </b>I2C_CLIENT_END };

一定要加0x51位址,否則核心運作時,無法注冊pcf8563的驅動,會出現RTC錯誤資訊,很多網友都碰都過這個問題。改完後,make menuconfig要選上pcf8563的驅動。

在static void dm644x_setup_pinmux(unsigned int id)裡,把有關FPGA接口的管腳複用功能去掉,因為很多中低端DM6446産品都沒有接FPGA晶片。這樣我們可以把這些引腳定義成SPI核UART接口。

#if 0

case DAVINCI_LPSC_VLYNQ:

        davinci_cfg_reg(DM644X_VLINQEN);

        davinci_cfg_reg(DM644X_VLINQWD);

        break;

同時在arch/arm/mach-davinci/mux_cfg.c裡

struct pin_config __initdata_or_module davinci_dm644x_pins[] = {

/*

 *     description           mux  mode   mode  mux  dbg

 *                          reg  offset mask  mode

 */

#if 1  //ATA功能不用

MUX_CFG("HDIREN",        0,   16,    1,      0, 1)

MUX_CFG("ATAEN",          0,   17,    1,      0, 1)

MUX_CFG("HDIREN",        0,   16,    1,      1, 1)

MUX_CFG("ATAEN",          0,   17,    1,      1, 1)

MUX_CFG("MSTK",                   1,   9,     1,      0, 0)

MUX_CFG("I2C",                1,   7,     1,      1, 0)

MUX_CFG("MCBSP",          1,   10,    1,      1, 0)

MUX_CFG("PWM0",                  1,   4,     1,      1, 0)

MUX_CFG("PWM1",                  1,   5,     1,      1, 0)

MUX_CFG("PWM2",                  1,   6,     1,      1, 0)

MUX_CFG("VLINQEN",             0,   15,    1,      1, 0)

MUX_CFG("VLINQWD",            0,   12,    3,      3, 0)

MUX_CFG("EMACEN",              0,   31,    1,      1, 1)

MUX_CFG("GPIO3V",         0,   31,    1,      0, 1)

MUX_CFG("GPIO0",           0,   24,    1,      0, 1)

MUX_CFG("GPIO3",           0,   25,    1,      0, 0)

MUX_CFG("GPIO43_44",           1,   7,     1,      0, 0)

MUX_CFG("GPIO46_47",           0,   22,    1,      0, 1)

MUX_CFG("RGB666",         0,   22,    1,      1, 1)

/*MUX_CFG("RGB888",             0,   23,       1,   1,  1)*/ /* for vpbe rgb888*/

MUX_CFG("LOEEN",          0,   24,    1,      1, 1)

MUX_CFG("LFLDEN",        0,   25,    1,      1, 0)

4、  核心進一步配置

對核心進一步配置之前,如果對linux-2.6.18很陌生,這裡給出一個連結:

<a href="http://blog.chinaunix.net/u2/71415/showart_1018029.html">http://blog.chinaunix.net/u2/71415/showart_1018029.html</a>

一個網友對 “<b>Linux 2.6.19.x </b><b>核心編譯配置</b>“進行詳細的描述,不妨去看一下。

使用cp arch/arm/configs/ davinci_dm644x_defconfig .config

進入核心配置界面,在這裡,本人隻對要修改的地方進行分析,其他設定,保留davinci_dm644x_defconfig。上面已經介紹有關去掉ATA和TI-EVM RTC裝置,接着我們對檔案系統進行裁減,如下圖。圖下半部沒有顯示,保留davinci_dm644x_defconfig就可以了,一般不要修改。NFS檔案系統的配置也用預設的,直接編譯就可以了。

其他功能和驅動,建議保留預設配置。對于自己闆子新的裝置(和TI-EVM闆差别很大),則要做更複雜的移植工作,包括相應目錄的makefile和Kconfig檔案的修改等,這裡不再累贅。

<b> </b>

<b>第四步:儲存備份修改後的配置</b><b></b>

核心移植配置,一定要養成備份配置檔案的良好習慣,一步一個腳印,防止做重複工作。幸好davinci_dm644x_defconfig給大家提供一個很好的參考,否則更加麻煩。直接從核心網站下載下傳最新核心來移植,那是非常大的挑戰,不是一般人為的。Linux-2.6.18也許有很多裝置沒有支援,但在較新的linux核心上有,這也可以把新的驅動移植下來,這個工作量也不小,當然也有簡單的patch,那是後話。

按照上篇UBOOT的介紹,設定好參數,比如使用NFS:

mem=120M console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=192.168.1.251:/home/&lt;useraccount&gt;/nfs/tirootfs,nolock

測試核心和NFS檔案系統。

以上工作已經通過本人的闆子驗證,有不足的地方,大家可以部落格留言共同讨論。

本文轉自 zjb_integrated 51CTO部落格,原文連結:http://blog.51cto.com/zjbintsystem/284468,如需轉載請自行聯系原作者

繼續閱讀