硬件平台基于应用处理器pxa310,软件平台基于嵌入式linux的android操作系统。首先介绍了tf卡与应用处理器的连接电路设计。然后介绍tf卡驱动程序的设计和android对tf卡的挂载方法。在tf卡驱动程序设计中采用了spi工作模式和fat32文件系统,描述了fat32文件系统的移植。最后介绍了系统调试,并展示了tf卡在视频数据采集单元中应用的设计结果。
嵌入式系统调试一般使用串口、jtag、usb或网卡来下载系统镜像到目标机中。使用串口下载镜像,协议简单,接口通用,但传输速率太慢。使用jtag下载镜像,传输速率较高,但需要专用的jtag调试器,价格较高,限制了调试环境。使用usb或网卡下载镜像速度快、接口通用,但一般做成产品后的嵌入式设备不需要留出通用的usb或以太网接口,从而增加了设计的复杂性和开发成本。在移动嵌入式产品开发过程中,如果使用transflash(tf)卡代替usb或以太网口,由于tf卡一般又都是移动嵌入式产品的必要构成部分,这样做一般可以减小嵌入式系统调试的复杂性和成本。本文提出使用tf卡更新镜像的方法,并在实际的嵌入式系统调试中成功应用。使用tf卡下载系统镜像,速度与通用性都很好,既省去了调试中对其他下载设备的设计需求,又解决了最终产品大容量存储器的设计问题。
1 transfiash卡与应用处理器的连接电路设计
本文调试的嵌入式系统,是一种视频数据采集与传输单元,以pxa310为中央处理器,采集到的视频数据由pxa310进行压缩编码处理,之后发送到网络中去,供用户查看。系统调试过程中,视频数据可以存储到tf卡中。
tf卡模块在系统中主要有两个方面的作用:
一是在嵌入式系统开发调试过程中用于将系统镜像到目标版;二是作为最终嵌入式系统产品的大容量存储器。
sd卡有两个可选的通信协议:sd模式和spi模式。sd模式是sd卡标准的读写方式,但要求主控制器带有sd卡控制器。pxa310本身没有tf卡控制器接口,选用sd模式通信就无形中增加了产品的硬件成本,选择spi模式可以说是一种最佳的解决方案,相对于sd模式,spi模式接口与协议简单、易于操作。这时tf卡在pxa3 10 mmc/sd/sdio主控制器控制下工作。
2 blob中tf卡的驱动设计以及fat32文件系统移植
2.1 设计tf卡spi模式驱动
tf卡操作遵循sd卡协议,tf卡的操作完全与sd卡相同。相对于sd模式,spi模式接口与协议简单、易于操作。pxa310带有mmc/sd/sdio主控制器,但由于blob中没有提供sd卡与主控制器的具体驱动,实现完整驱动的难度较大,故本文采用gpio口模拟的spi模式读写tf卡,运行到linux内核后再加载主控制器驱动运行sd模式的方式,性能与实现难度都可兼顾。
spi模式tf卡总线采用主从问答式协议。主机发送命令command,tf卡应答回复response。sd卡命令有两种,cmdx和acmdx。acmd是应用指令集,属于扩展指令集,在发送任何的acmd之前,必须先发送cmd55激活,才可以使用acmd指令集。发送完一个acmd,并且卡响应了此指令之后,cmd55的作用就消失了,所以要发送多个或多次发送一个acmd,需要循环发送cmd55+acmd。
2.2 spi模式初始化tf卡流程
tf卡默认的通信模式是sd模式,本文要在spi模式下设计tf卡驱动,需要从sd模式切换到spi。为此,先将tf卡上电,延时74个时钟周期后发送复位命令cmd0,同时将sd卡的cs片选信号置低,若此时接收到应答信号为0x01,说明tf卡进入了spi模式。
tf卡与mmc卡都可用spi模式驱动,故在初始化时可考虑与mmc卡的兼容性。在发送cmd0成功接收到应答信号后,连续发送cmd55+acmd41,若cmd55回复0x01而acmd41回复0x00,则tf卡初始化成功。若没有完整的应答,则改发cmd1,若cmd1成功回复0x00,则mmc卡初始化成功。
在spi模式下,tf卡的初始化时钟频率不能超过400 khz。初始化成功后,就可以配置高速时钟下tf卡的读写操作了。图2为tf卡初始化流程图。
在blob中完成tf卡初始化,还需要初始化pxa310的gpio口,并根据对应tf卡的引脚配置其输入输出关系。
在blob中,pxa3 10的pxa_sd_d2、pxa_sd_d3、pxa_sd_cmd、pxa_sd_clk、pxa_sd_d0、pxa_sd_d1这几个i/o口并没设置为gpio口,不能在软件上进行读写操作,要使用spi模式,必须将这几个io口设置为gpio。通过在mfp寄存器中配置io口的功能号,再配置相应参数即可实现。
2.3 通过spi读写tf卡的程序设计
tf卡的读写以块为单位,初始化完成后,使用cmd16设置sd卡读写块长度(512 b),发送cmd17和cmd24读单块写单块,发送cmd18和cmd25读多块和写多块。实现tf驱动层中读写函数的逻辑流程如图3所示。
2.4 fat32文件系统移植
在文中,fat32文件系统移植主要包括系统初始化和文件管理程序修改(主要是文件读取)。fat32的初始化就是找到各个部分的起始扇区位置。首先查找mbr的分区表,获取分区信息,然后找到每个分区的dbr,再根据dbr中的bpb得到分区的起始扇区、结束扇区、文件系统类型、fat表个数、每簇占用扇区数等信息。最后根据下面的算法得到文件分配表fat、文件目录表fdt和数据区data的起始扇区。fat32读取文件流程如图4所示。
2.5 设计blob命令下载系统镜像
blob启动之后,首先初始化一些基本的硬件设备如串口等,然后检测系统内存映射,设置cpu运行频率等一些参数,接着就进入了命令行模式。
在blob中提供tfdownload命令,主函数的形参就是接收到的命令内容和参数。若参数为“init”,则调用tf卡驱动的初始化,否则将此参数作为文件名传给fat32文件系统打开并读取文件内容。最终实现“tfdownloadinit”调用tf卡驱动初始化tf卡。使用“tfdownload”+文件名可以调用fat32文件系统和tf卡的驱动下载该文件名的镜像到内存中。
2.6 makefile文件修改与交叉编译
(1)tf卡驱动与fat32文件系统编译
按照blob中驱动程序的结构,tf卡驱动与fat32文件系统源文件保存在/src/blob/platform/common/source目录下,而fat32文件系统头文件在/src/blob/platform/common/include目录下,要在编译blob的时候将添加的驱动一起编译,需要更改相应的makefile。
在/src/blob/platform/source下有三个makefile文件,分别是makefile.am,makefile和makefile.in,修改makefile.am即可,makefile和makefile.in会自动修改。主要增加makefile的头文件寻找目录和编译文件。
(2)blob命令编译
src/commands下的命令编译由同目录的makefile确定,同样需要修改makefile使添加的命令编译到blob中去。另外,要使该命令在blob中生效,还需要修改blob的configure.in文件,在configure.in中添加:blob_commands=“$blob_commands,tfdownload”;。
(3)编译blob
linux-2.6.25中集成了blob,用linux-2.6.25的工具链编译好之后,在…/pxalinux/mhn-linux-platform/rel/target/bin中,boot_nontrust.bin就是生成的blob镜像。
2.7 系统镜像下载的实现
先用tfdownload init命令初始化tf卡驱动,然后使用tfdownload下载系统镜像到内存中,再使用nandwrite命令写入nandflash中。
3 android下挂载tf卡实现数据存储
在android系统中使用tf卡做储存器,必须先将tf卡挂载到android上。要启用void,需要在android启动配置文件init.rc中关闭mountd并开启void服务。通过对配置文件init.rc进行下面的修改完成此项功能。
service void/system/bin/void //vold服务开启socket void stream 0660 root mount
……
#service mountd/system/bin/mountd//mountd服务关闭(被注释了)#socket mountd stream 0660 root mount
void.conf文件是void程序挂载设备的配置文件,里面记载了挂载设备的设备路径、设备类型以及挂载的目标位置(挂载点)。需要在该文件中加入tf卡的挂载信息,然后,将void.conf加入到system/etc目录下,void程序就可以直接读取该配置文件了。
fat32属于windows分区,因为windows分区里面的文件是没有权限这个概念的,所以在linux系统中使用此分区时要手动指定默认权限。挂载tf卡之后android的/sdcard目录不能直接通过chmod命令来修改对于system组的读写权限,在system下是无法直接访问tf卡的,需要在挂载的时候添加权限。在void中,真实挂载tf卡的操作如下:
rc=mount(devpath,vol->mount_point,“vfat”,flags,“utf8,uid=1000,gid=1000,fmask=711,dmask=700,shortname=mix ed”);其中uid代表属主,uid=1 000代表system用户,fmask和dmask分别对应文件和目录的权限8进制码的反码。
4 设计结果展示
本文调试的数据采集与传输单元实物如图5所示,tf卡位于pcb板右上角。使用该单元录制视频并保存在tf卡中,设定录制时间为30 s,30 s后关闭,取出tf卡,将tf卡与pc连接,录像文件效果如图6所示。
使用tf卡下载系统镜像操作步骤如下:
(1)用“tfdownload init”命令初始化tf卡驱动,返回“tf card init success!”即表示tf卡初始化成功。
(2)然后使用“tfdownload”+文件名的方式下载系统镜像到内存中,显示“tfcard download done!”即表示tf卡下载镜像成功。
(3)最后使用nandwrite命令将内存中的镜像写入nandflash中,返回“done!”即表示写入成功。
使用vold挂载tf卡的操作结果如图7所示。其中“logcat—s void”用来显示void运行的输出信息。“new mmc card‘0000’added”表示成功加载tf卡,“disk…。.new blkdev 179.0”表示tf卡作为一个块设备被成功加载,“partition…。.new blkdev 179.1”表示tf卡第一个分区被成功加载,“successfully mounted vfat filesystem179:1”表示成功挂载fat32分区。到这一步,android系统就已经成功挂载了fat32系统的tf卡。
5 结语
本文结合嵌入式开发调试和嵌入式大容量存储的背景,提出并实现了一个使用tf卡进行嵌入式系统开发调试及存储应用的方案。在嵌入式系统调试中使用tf卡下载系统镜像,速度与通用性都很好,还可以很方便的和pc机交换数据。作为嵌入式产品的一个构成部分,使用tf卡调试既省去了其他下载设备的设计,又可以在系统中作为大容量存储器使用。本文具体完成的工作包括tf卡同应用处理器的连接电路设计、tf卡的驱动程序设计和fat32文件系统移植、在android平台下实现了tf卡的自动挂载。
物联网和畜牧业结合是怎样的场景
DREAMS实验将成为一个自主气象站,目的是研究尘埃对尘埃的影响
基于ZCU106单板的功耗优化
疯狂!紫光集团负债2000亿!
电流检测传感器的安装方式
Blob中TF卡驱动程序的设计 Android对TF卡的挂载方法
小米11 Pro概念图曝光:采用曲面全面屏
拳打iPhone8、脚踢三星Note8,华为Mate10称霸全球?iPhone8、三星Note8、华为Mate10最新消息汇总
荣耀X30i新视频:7.45mm超薄设计搭配175g轻盈机身
小米12怎么样值得买吗
泰凌微电子正式推出开源模组Mars-B91
强强联手 罗德与施瓦茨公司参与中国移动“5G终端先行者计划”
英特尔六大技术支柱推动全方位计算创新,引领“超异构计算”时代
3000W舞台音响功放MOS管应用方案介绍
一个简单的晶体管测试仪电路图
高通推出的手机芯片将使用人工智能来阻止恶意软件感染您的手机
麦当劳也开始搞AI了吗
新型汽车技术的汽车透明车窗显示有望实现人车沟通和广告
华为P10闪存门最新消息:华为P10“闪存门”只是华为冰山一角 高端之路艰难且漫长
惠普是全球最大Win10 PC厂商,占据了24.3的份额,联想排第三