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开发攻略——环境搭建篇》建立好。
1、  顶层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)
全部注释掉;
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"
#      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"
 
第三步:内核移植裁减
 
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)
//&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)
};
4、  内核进一步配置
对内核进一步配置之前,如果对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文件系统。
以上工作已经通过本人的板子验证,有不足的地方,大家可以博客留言共同讨论。

Davinci DM6446开发攻略——linux-2.6.18移植的更多相关文章

  1. Davinci DM6446开发攻略——LINUX GPIO驱动源码移植

    一.             DM6446 GPIO的介绍      说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...

  2. Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和 ...

  3. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

  4. TI Davinci DM6446开发攻略——根文件系统的裁剪和移植

    一.补充文件系统知识 Linux根文件系统是存放tool软件.lib文件.script(脚本).配置文件.其他特殊文件.自己开发的应用程序的地方.嵌入式linux的根文件系统rootfs就像windo ...

  5. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...

  6. Davinci DM6446开发攻略——DSP开发工程建立

    前段时间一直忙一个项目,同时在生活上时时提防和抵抗中国地沟油.国外核心转基因调和油.大豆油.色拉油.大米玉米.可怕的喂药鱼.药水泡农药喷无虫咬的青菜,所以没时间打理自己的博客,让开发攻略停顿了一段时间 ...

  7. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析

     针对DAVINCI DM6446平台,网络上也有很多网友写了V4L2的驱动,但只是解析Montavista linux-2.6.10 V4L2的原理.结构和函数,深度不够.本文决定把Montavis ...

  8. TI Davinci DM6446开发攻略——UBL移植

     UBL的程序设计,相对UBOOT.KERNEL.ROOTFS.设备驱动.DSP开发来说,还是比较简单.我们先从DAVINCI的启动说起,了解UBL在DAVIN系统中的位置和作用.对于固件程序烧写在N ...

  9. DM6446开发攻略——u-boot-1.3.4移植(1)

    http://zjbintsystem.blog.51cto.com/964211/282387转载   UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2 ...

随机推荐

  1. Git 生成 SSH 公钥

    2018-01-05 11:24:04 许多 Git 服务器都使用 SSH 公钥进行认证. 为了向 Git 服务器提供 SSH 公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份. 这个过程在所有 ...

  2. Func常用模块及API

    Func常用模块及API Func提供了非常丰富的功能模块,包括: CommandModule(执行命令) CopyFileModule(拷贝文件) CpuModule(CPU信息) DiskModu ...

  3. HTTP就是这么简单

    为什么要学HTTP? 我们绝大多数的Web应用都是基于HTTP来进行开发的.我们对Web的操作都是通过HTTP协议来进行传输数据的. 简单来说,HTTP协议就是客户端和服务器交互的一种通迅的格式. H ...

  4. Chrome中xpath表达式巧妙获取

    对于xpath语法不熟悉,或者要快速匹配出xpath的小伙伴来说这种方式是最快捷的了. 步骤如下: 1.打开chrome 2.ctrl + shift + c 个人比较喜欢用快捷键,不喜欢用快捷键的就 ...

  5. 06_Linux系统常用命令

    一.命令使用方法 Linux命令格式 command [-option] [parameter1] [parameter2]... command:相应功能的英文单词或者单词的缩写 option:可用 ...

  6. 史上最全的JFinal源码分析(不间断更新)

    打算 开始 写 这么 一个系列,希望 大家 喜欢,学习 本来就是 一个查漏补缺的过程,希望大家能提出建议.本篇 文章 是整个目录的向导,希望 大家 喜欢.本文 将以 包的形式跟大家做向导. Handl ...

  7. web框架之Django基础

    1. Django的简介 Django是一个由python写成的开放源代码的Web应用框架. Django的目的是使常见的Web开发任务,快速和容易. 2. Django框架的特点 1. 遵循MVC开 ...

  8. python学习交流 - 匿名函数

    匿名函数 匿名函数是一个很有特色的定义函数的功能.在实际使用的过程,用户有时不得不为一些一行代码即可实现的功能来定义一个函数,例如像map, max, filter等内置函数的key参数只能接收可调用 ...

  9. 自兴人工智能------Python语言的变量认识及操作

    今天我给大家介绍的是python中的Number变量,与c++,java有些不同,下面让来为大家介绍: 在python中是不用声明变量类型的,不过在使用变量前需要对其赋值,没有值得变量是没有意义的,编 ...

  10. Apache优化配置:修改最大并发连接数

    此文摘自: http://www.365mini.com/page/apache-concurrency-configuration.htm Apache查看连接数和限制当前的连接数 : http:/ ...