Davinci DM6446開發攻略——linux-2.6.18移植 分類: DSP 2013-07-22 16:29 335人閱讀 評論(0) 收藏

  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) 支持,提供比舊版產品更優異的效能、安全和管理功能);等等,這些優勢不得不讓人心動。
 
第一步:簡化 linux-2.6.18
若是你已經安裝好 TI mvl_5_0_0_demo_lsp_setuplinux_02_00_00_140.bin ,先在你的工做目錄下創建 linux-2.6.18_pro500 的目錄,進入改目錄,好比 /home/<useraccount>\ dm6446/linux-2.6.18_pro500/ COPY 內核源代碼到本目錄下,命令以下:
cp –r /opt/mv_pro_5.0.0/montavista\pro/devkit/lsp/ti-davinci/linux-2.6.18_pro500/* .
(注意 * 」 」 . 之間的空格)
UBOOT 移植同樣,咱們先把一些不相關的平臺給刪除掉,進入 arch 目錄,保留 arm 目錄,其餘所有刪除掉。
進入 linux-2.6.18_pro500/arch/arm/ 保留 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 所有刪除掉,其餘就不用刪了,不然出問題。
 
第二步:創建交叉編譯環境
 
    進行下面工做以前,確保你的 GCC 已經按《 DAVINCI DM6446 開發攻略——環境搭建篇》創建好。
一、  頂層 Makefile 修改:
172 行,即 # make CROSS_COMPILE=ia64-linux- 下面,加入:
ARCH = arm
  CROSS_COMPILE = arm_v5t_le-
把下面: 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)
所有註釋掉;
二、  COPY UBOOT mkimage 工具
從編譯好的 UBOOT tool 目錄下的 mkimage 工具 COPY linux-2.6.18_pro500 目錄如下,
三、  添加 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 起來;
四、  修改 arch/arm/boot/Makefile
57 行下面加入:
@cp -f arch/arm/boot/zImage zImage
這樣每次編譯 zImage ,生成的 zImage 能夠自動 COPY linux-2.6.18_pro500 目錄下。
五、  修改 fs/hostfs/Makefile
   由於刪除 um asm-um ,當使用 make distclean 操做的時候會出現問題,因此把:
include arch/um/scripts/Makefile.rules 註釋掉。
六、  修改 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"
#      help
#        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"
 
第三步:內核移植裁減
 
一、  linux-2.6.18_pro500 目錄下,使用如下命令開始配置內核:
cp arch/arm/configs/ davinci_dm644x_defconfig .config
make menuconfig
進入熟悉的 kernel 配置界面:
 
二、  去掉 ATA DRIVER
因爲本人的開發板沒有 NOR FLASH ,也沒有 ATA 硬盤之類的東西,這一點和 TI EVM 板不同,因此咱們先把設備驅動裏的 ATA 選項去掉。
而後保存配置退出,使用
Make zImage
編譯完後,運行 ./mkzImage.sh ,能夠 COPY 生成的 bin 文件到 /tftpboot 目錄下,參照上篇有關 uboot 的帖子,使板子把 uboot 運行起來,使用進入 UBOOT 命令行:
U-Boot >tftp 80008000 davinci_kernel.bin
U-Boot >bootm 80008000
以後能夠在串口終端看到內核的運行信息。
三、  修改 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 = {
&serial_device,
#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)
//&davinci_evm_flash_device,
#endif
#if defined(CONFIG_MTD_NAND_DAVINCI) || defined(CONFIG_MTD_NAND_DAVINCI_MODULE)
&davinci_nand_device,
#endif
&rtc_dev,
&davinci_fb_device,
#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
&davinci_ide_device,
#endif
#if defined(CONFIG_MMC_DAVINCI) || defined(CONFIG_MMC_DAVINCI_MODULE)
&mmc0_device,
#endif
};
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),
        .mask_flags    = 0, /* force read-only */
},
( 這裏註明一下: 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
static struct platform_device rtc_dev = {
.name            = "pcf8563",
.id          = -1,
};
#else
static struct platform_device rtc_dev = {
.name             = "rtc_davinci_evm",
.id          = -1,
};
#endif
以上的代碼修改,表示板子採用 pcf8563 時鐘芯片做爲 RTC 設備,本人的板子不採用 TI-EVM 的電路,因此要修改這裏,同時在 drivers/rtc 目錄下,修改 rtc-pcf8563.c 的一個 BUG ,就是:
static unsigned short normal_i2c[] = { 0x51, 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;
#endif
同時在 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)
#else
MUX_CFG("HDIREN",        0,   16,    1,      1, 1)
MUX_CFG("ATAEN",          0,   17,    1,      1, 1)
#endif
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)
#if 0
MUX_CFG("VLINQEN",             0,   15,    1,      1, 0)
MUX_CFG("VLINQWD",            0,   12,    3,      3, 0)
#endif
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)
};
四、  內核進一步配置
對內核進一步配置以前,若是對 linux-2.6.18 很陌生,這裏給出一個連接:
一個網友對 Linux 2.6.19.x 內核編譯配置 「進行詳細的描述,不妨去看一下。
使用 cp arch/arm/configs/ davinci_dm644x_defconfig .config
make menuconfig
進入內核配置界面,在這裏,本人只對要修改的地方進行分析,其餘設置,保留 davinci_dm644x_defconfig 。上面已經介紹有關去掉 ATA TI-EVM RTC 設備,接着咱們對文件系統進行裁減,以下圖。圖下半部沒有顯示,保留 davinci_dm644x_defconfig 就能夠了,通常不要修改。NFS文件系統的配置也用默認的,直接編譯就能夠了。
其餘功能和驅動,建議保留默認配置。對於本身板子新的設備(和 TI-EVM 板差異很大),則要作更復雜的移植工做,包括相應目錄的 makefile Kconfig 文件的修改等,這裏再也不累贅。
 
第四步:保存備份修改後的配置
 
內核移植配置,必定要養成備份配置文件的良好習慣,一步一個腳印,防止作重複工做。幸虧 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/<useraccount>/nfs/tirootfs,nolock
測試內核和NFS文件系統。
以上工做已經經過本人的板子驗證,有不足的地方,你們能夠博客留言共同討論。

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。html

相關文章
相關標籤/搜索