在基于TMS320DM6446处理器的数字视频评估模块(DVEVM)开发过程中,我遇到了一个典型的嵌入式系统设计难题——异步外部存储器接口(EMIFA)的引脚复用问题。这个16位宽度的接口需要同时应对NAND闪存、NOR闪存、CF卡、硬盘驱动器(HDD)、MMC/SD卡等多种存储介质的访问需求,但物理引脚却只能服务于一种设备。这就好比一个十字路口的红绿灯,同一时间只能允许一个方向的车辆通行。
默认情况下,DVEVM软件启用了对ATA硬盘的支持,但在视频监控设备开发中,CF卡因其抗震性强、体积小巧的优势成为更理想的存储选择。通过内核重构实现存储介质的灵活切换,是嵌入式开发者必须掌握的技能。下面我将详细记录整个配置过程的关键步骤和注意事项。
在开始内核修改前,需要确保主机环境符合交叉编译要求。我使用的是Ubuntu 16.04 LTS系统,已安装arm_v5t_le-工具链(对应ARMv5架构)。工作目录结构遵循TI官方建议:
code复制/home/user/workdir/
├── lsp/ti-davinci # Linux支持包
├── filesys # NFS根文件系统
└── tftpboot # TFTP服务目录
注意:不同版本的DVEVM开发套件可能使用不同的工具链前缀,务必确认CROSS_COMPILE参数与实际情况一致。我曾因误用arm-linux-前缀导致内核无法正常启动。
进入内核源码目录后,启动图形化配置界面:
bash复制cd /home/user/workdir/lsp/ti-davinci
make ARCH=arm CROSS_COMPILE=arm_v5t_le- xconfig
在配置界面中需要重点关注两个关键路径:
配置完成后保存退出,执行完整的编译流程:
bash复制make clean
make ARCH=arm CROSS_COMPILE=arm_v5t_le- uImage -j4
编译产物位于arch/arm/boot/uImage,将其复制到TFTP目录:
bash复制cp uImage /tftpboot/
chmod a+r /tftpboot/uImage
通过串口终端连接DVEVM开发板,在u-boot启动时打断自动引导流程,设置以下关键参数:
bash复制setenv ethaddr 00:0E:99:02:51:F4 # 使用开发板背面的实际MAC地址
setenv serverip 192.168.1.103 # 主机IP
setenv ipaddr dhcp # 动态获取IP
setenv bootfile uImage # 内核镜像名
setenv bootcmd 'dhcp;bootm' # 启动命令序列
setenv bootargs 'console=ttyS0,115200n8 noinitrd rw ip=dhcp
root=/dev/nfs nfsroot=192.168.1.103:/home/user/workdir/filesys,nolock mem=120M'
saveenv
实测发现,内存分配参数
mem=120M对DM6446的256MB内存系统至关重要。过小的值会导致CF驱动初始化失败,而过大会挤占DSP侧的内存空间。
确保主机端服务正常运行:
/etc/default/tftpd-hpa配置,确认TFTP_DIRECTORY指向/tftpboot/etc/exports中添加:code复制/home/user/workdir/filesys *(rw,sync,no_subtree_check,no_root_squash)
执行exportfs -a刷新配置插入CF卡后启动系统,登录root账户检查设备节点:
bash复制ls /dev/hda*
正常应显示类似/dev/hda(整个设备)和/dev/hda1(第一个分区)的设备文件。如果未出现,可能是以下原因:
创建挂载点并挂载CF卡:
bash复制mkdir /mnt/cf
mount /dev/hda1 /mnt/cf -t vfat # 假设分区为FAT格式
对于ext2/ext3格式的分区,需要先确保内核配置了对应文件系统支持:
bash复制mount /dev/hda1 /mnt/cf -t ext3
在视频采集应用中,建议采用以下挂载参数提升CF卡写入性能:
bash复制mount /dev/hda1 /mnt/cf -t ext3 -o noatime,data=writeback,barrier=0
同时修改/etc/fstab实现开机自动挂载:
code复制/dev/hda1 /mnt/cf ext3 noatime,data=writeback,barrier=0 0 0
现象:uImage下载后无法启动,提示"Bad Magic Number"
arm_v5t_le-gcc -v验证)现象:dmesg显示"CF: no devices present"
现象:频繁出现I/O错误或需要fsck修复
sync命令在完成基础功能后,可以进一步优化系统:
bash复制insmod davinci_cf.ko # 加载CF驱动
rmmod davinci_hdd.ko # 卸载HDD驱动
bash复制iostat -p hda 2 # 每2秒刷新一次统计信息
通过三个月的实际项目验证,这套配置方案在720p视频采集系统中表现稳定,CF卡持续写入速度可达8MB/s,完全满足嵌入式视频存储的需求。对于需要更高性能的场景,可以考虑升级到支持UDMA模式的CF卡,并相应调整EMIFA接口时序参数。