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/<useraccount>\ 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 >tftp 80008000 davinci_kernel.bin
U-Boot >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 = {
&serial_device,
#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)
<b>//&davinci_evm_flash_device,</b>
#endif
#if defined(CONFIG_MTD_NAND_DAVINCI) || defined(CONFIG_MTD_NAND_DAVINCI_MODULE)
&davinci_nand_device,
&rtc_dev,
&davinci_fb_device,
#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
&davinci_ide_device,
#if defined(CONFIG_MMC_DAVINCI) || defined(CONFIG_MMC_DAVINCI_MODULE)
&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/<useraccount>/nfs/tirootfs,nolock
測試核心和NFS檔案系統。
以上工作已經通過本人的闆子驗證,有不足的地方,大家可以部落格留言共同讨論。
本文轉自 zjb_integrated 51CTO部落格,原文連結:http://blog.51cto.com/zjbintsystem/284468,如需轉載請自行聯系原作者