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文件系統。
以上工做已經經過本人的板子驗證,有不足的地方,你們能夠博客留言共同討論。