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) 支持,提供比旧版产品更优异的效能、安全和管理功能);等等,这些优点不得不让人心动。
 
第一步:简化 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文件系统。
以上工作已经通过本人的板子验证,有不足的地方,大家可以博客留言共同讨论。
 









本文转自 zjb_integrated 51CTO博客,原文链接:http://blog.51cto.com/zjbintsystem/284468,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
106 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
51 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
55 5
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
126 3
|
5月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
5月前
|
Ubuntu Linux Docker
Java演进问题之Alpine Linux创建更小的Docker镜像如何解决
Java演进问题之Alpine Linux创建更小的Docker镜像如何解决
|
24天前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
55 8
|
24天前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
152 6
|
25天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
66 3