维普资讯 http://www.cqvip.com 第34卷 第3期 计算机工程 2008年2月 VeL34 No3 Computer Engineering February 2008 ・工程应用技术与实现・ 文章■号t 1000 ̄3428(2008)03---0269---03 文献标识码。A 中啊分类号。TP311.5 一种USB从设备访问主设备的方法 张志,余橙煜 <上海交通大学通信工程系,上海200030) 擅要:介绍了一种USB从设备访问主设备的方法。该方法利用USB从设备端存储器中建立的交换缓存区,无须拔插flash存储卡即可实 现USB从设备端对主设备端文件的直接访问,从而使USB从设备可访问远大于自身存储空间的文件。通过该方法可实现手持播放器以低 成本和省电的方式扩展外接硬盘。 关健词:USB总线;USB从设备;USB主设备;直接访问;存储器 File Access Method from USB Device to USB Host ZHANG Zhi,YU Song-yu (Communication Engineering Department,Shanghai Jiaotong University,Shanghai 20023o) |Abstract|A ifle access method from USB device to USB host is introduced.By using switch buffer built in memory of USB device,this methdo realizes the direct access to the file in USB host from USB device,which makes USB device access much larger external file than its storage capability.This method makes it possible htat a portable player extends external harddisk with low cost nad power saving. [Key wordsI USB bus;USB device;USB host;direct access;storage device 随着集成电路技术的发展,基于手持设备的视频播放器 一识别为一个UMS(USB Mass Storage Class)存储设备…,然 日益普及,由于内部Flash存储颗粒成本较高,因此外扩硬 后交换硬盘中的文件与USB从设备中的文件。本方法基于该 盘成为一种迫切的需求。但基于成本考虑,这些手持播放器 硬件架构,通过软件使USB从设备端的主功能芯片成为主控 普遍只带USB从设备端El…,需要拔插flash存储卡到专用 者、USB主设备由主要控制者变为从控制者。 硬盘上复制文件,并且要求存储卡容量足够容纳整个视频文 2软件框架 件。本文提出一种USB从设备访问USB主设备的方法,使 USB从设备访问USB主设备的方法基于常用的USB硬 用支持USB主设备的大容量存储器(硬盘),在从设备存储器 件架构,完全通过软件实现。其软件系统框架与数据流图如 中建立交换缓存区,让操作者在从设备端操作;从设备端上 图2所示。 层软件把其对于主设备存储器文件的访问“请求”按一定的 USB从设备端 协议写在自身存储器的一个“请求”缓存区里(文件或特殊存 usB从设备端上层软件 . 储扇区)。然后把存储器的控制权交给主设备端,主设备端读 硬盘文件缓存系统层 ‘ 。 取从设备存储器中的这个“请求”缓存区,并执行“请求”; _ 文件管理“请求”进行文件的复制、移动、删除等操作;对 于文件“读请求”则把主设备端的文件块复制到从设备端交 垂L 缓-●一 —存块 文件 I lI 端普USB通文件 ̄- l J I 换缓存区中的缓存块,对于文件“写请求”则把从设备端交 垦 换缓存区中的缓存块复制到主设备端的文件中;当从设备再 / ‘一 /l < / 文 \\> 次获得其存储器控制权时,要访问的文件已经全部或部分在 写 读 文 件 UMS从设备 操 操 件 = 复 驱动程序 存储器中,从而实现对其的读写访问【2】。 作 的 制 USB总线 作 复 、 1 USB主从设备硬件架构 削 = 删 USB主从设备硬件架构如图1所示(虚线代表逻辑连接)。 J 除 驱/ 除 UMS动主程设序备 \/ \/ USB从设备请求读写的USB USB主设备 USB主设备 主设备端目标文件 端普通文件 端存储器 !竺 堡鱼堡口 f 奇1 7 - USBDevice I Control—— 一Mr IC/1P I I usB主设备端程序 . .1主功能芯片l . 硬盘 ■不■—一 l存储卡接I:1 圈2软件框架与数据漉圈 —— _, 存储卡 l 作者倚介:张志(1976--),男,高级工程师,主研方向:视频通信, 圈1硬件框架 电子系统设计,手持多媒体产品设计;余松煜,教授 主设备将手机、PDA、PMP、数码相机等USB从设备统 收稿日期:2007—03—20 E.mail:zhi_zhang@witchain.conr —_269_~ 维普资讯 http://www.cqvip.com 软件的核心是USB从设备存储器中建立的交换缓存区, 的流程进行仔细分析,然后将读取文件的提前量写入播放器 程序的每一个过程。但这种方法必须熟知各种视频编码格式 的规范,而编码格式种类繁多、差异较大,其实现的工作量 很大,因此,本文提出一种智能判断各文件读取速度的预读 算法,该算法基于所建立的“硬盘文件缓存系统”层,把所 有文件操作函数重定向到该层,然后调用对应的文件操作函 由配制文件、请求文件、硬盘索引文件、缓存块文件等组成, USB主从设备均可访问该交换缓存区,USB从设备把操作请 求写在请求文件中,USB主设备对其读取并执行,而大文件 的传输依赖于缓存块文件的交换。 3 USB从设备靖软件 USB从设备端软件顺序读的流程如图3所示。由于手持 播放器上的视频播放器、MP3音乐播放器、照片浏览器、文 字阅读器等软件主要的操作都是顺序读,或者以顺序读为主 要方式、随机读为次要方式,没有写操作,因此,本文仅对 数即可对硬盘文件进行预读、传输、从缓存中读取数据块等 操作。以C语言视频播放器为例,在所有源文件的头文件最 前面插入以下重定向宏定义: #define fopen bufferSystemfopen 顺序读进行详细描述。 开始 (1)应用程序的读操作请求被“硬盘文件缓存系统”层截取 2)有预读传输完成而未处理的缓存区数据? 否 是 (3)检查并处理缓存区和“请求”文件中的执行完成状态位 (14)检查并处理缓存区和 “请求”文件中的执行完成 (4)需要立即读 状态位 取(缓存区中不存 在或不够本次要读 取的数据)? 是 (13)等待上次预读传输完 成的关闭USB连接事件 预读正在传输? / 是L/ (5)有未完成的预读 ,. \正在传输 — T_ (6)计算缓存文件块的长度(立 即读取长度+预读长度),写“请 坚前读数取据更? 多的 —/ —一 求”文件,打开USB连接,将存储 是 器访问权限交给数码伴侣端 (12)计算需要预读 (7)等待数码伴侣关闭USB连接 的精确长度,写“请 求”文件,打开USB 连接,将存储器访问 权限交给数码伴侣端 (8)检查并处理缓存区和“请 求”文件中的执行完成状态位 (9)将缓存区中本次要读取的数据读入内存中对应的变量 返回上层应用程序,标记缓存区该数据块为已读 田3 USB从设备靖应用程序曩序读漉程 USB2.0高速(480 Mb/s)从设备控制器由于成本低而普遍 应用于各种手持播放器设备,相对于在手持播放器上使用较 贵但却只支持全速(12 Mb/s)的USB1.1主设备控制器[2-3]来扩 展外接硬盘的方式而言,以USB从设备直接访问USB主设 备的方式更优,除成本低以外,其传输速率也更高,避免了 硬盘一直工作,而是以高速传输文件块之后即让硬盘停转, 达到省电的目的。 缓存区数据交换将不可避免地带来传输延迟,因此,要 实现连续播放,需要用比较好的算法来进行大缓存预读。以 视频播放为例,一种实现预读的方法是对每一个视频播放器 #define fclose bufferSystemfclose #define fread bufferSystemfread #define fwrite bufferSystemfwrite #define fget bufferSystemfget #define fput bufferSystemfput #define fseek bufferSystemfseek 然后重写各文件操作函数,如果是本地文件操作,则调 用本地文件操作函数,如果是硬盘文件操作,则采用预读的 算法提前从硬盘传输到本地存储器缓存区,从缓存中读取数 据块返回上层应用程序,以下是其中2个函数的例子: FILE bufferSystemfopen(const char file,const char flags) if(isFilePathLocal(file)==TRUE) return fopen(file,flags); else{ return hardiskfopen(file,flags); //在这里返回一个内部管理 ,/文件句柄,并记下该文件句柄,以后凡是使用该句柄的文件读操作 //都要受预读算法管理 l】 int bufferSystemfread(unsigned char buf,int size,int count, FILE*fd) {… if(isTheFileLocal(fJ)==TRUE) return fread(buf,size,count,fd); else{ return hardiskfread(buf,size,count,fd);,/采用预读的算法 //提前从硬盘传输到本地存储器缓存区,从缓存中读取数据块返回上 ,/层应用程序】 1 其他函数结构类似,这里不再赘述。 预读是算法的核心,其难点在于预读时间提前量的计算, 下面就各相关因素进行分析。 (1)总缓存区大小 缓存区设置得越大,就能缓存越多的数据、提高缓存命 中率(当某一次读取文件数据时,数据已预读到缓存区,则 称“缓存命中”,如果文件还在硬盘,需要立即读取,造成应 用程序的等待,则称“缓存未命中”)、减少传输次数、减少 硬盘启动次数、让系统省电。但是,缓存区也不能无开 大,因为直接访问的优点之一,就是要在“USB从设备端” 存储器空间有限的情况下访问大文件。缓存区占用空间越小, 供其他应用使用的空间就越多。而且很多数码相机、手机、 MP4随机赠送的卡只有16 MB或32 MB,想要在这些卡上直 接使用,就更要控制缓存区大小,因此,缓存区的大小尽量 不要超过16MB。 (2)单个缓存块大小/缓存块个数 在缓存区总大小确定的情况下,单个缓存块个数越少, 维普资讯 http://www.cqvip.com 即单个缓存块越大,传输次数就越少,优点是硬盘启动次数 减少、系统省电,但缺点是不够灵活,当同时有多个通道分 别在文件不同位置顺序读写时(例如一个视频通道从文件头 开始读,2个音频通道从文件中部开始读),就会造成缓存频 4 USB主设备靖软件 USB主设备端软件流程图如图4所示,由于本方法在实 际应用中使用USB OTG设备,它既可以作为USB主设备与 USB从设备相连,也可以作为USB从设备与PC相连,因此 需要在软件中对接入USB端口类型进行判断。作为直接访问 方式工作时,该USB主设备端的任务是执行USB从设备端 繁切换的抖动,因此,必须有足够多的缓存区。一个折中的 方法是将单个缓存块开小一些,根据一个通道读取的速度来 决定单次传输缓存块的个数,即读得快的通道一次多传几个 缓存块,而读得慢的通道一次少传几个。一般来说,如果视 频码率是1 Mbls,1 rain的数据量为60 s×1 Mb/s=60 Mb= 8 MB,音频码率如果是64 Kb/s的话,双通道1 rain数据量 为2×60s×64 Kb/s=7.5 Mb=l MB,如果以1MB为单个缓存 块大小,音频占一个,视频占8个,1 rain启动一次传输,传 输时间大约要10 s。这样,设置1个15MB的总缓存区,将 其分为l5个1 MB的缓存块。实际上还可以根据各手持播放 器所支持的视频码率进行调整。 (3)预读的时机 预读的时机是根据实际读取的速度来计算提前量的,比 如要1 min进行一次传输,已知1 Mb/s的视频通道与2个 64 Kb/s的音频通道,1 rain的数据量分别是8 MB和1 MB, 传输时间10 s,则提前30 s开始传输应该来得及,30 s时剩 余的未播放数据为4.5 MB,总缓存区为15 MB,正好可以留 出10 MB给后1 min存放缓存数据。也可以根据各手持播放 器所支持视频码率的实际情况进行调整。 (4)初次传输与启动时间 预读的一个问题是最初播放时的第1次传输,没有读取 历史速度的依据,甚至没有文件头,只有文件名和文件大小 可供参考,所以难以选择初始传输的大小。要想尽快开始播 放,就要尽可能少地传输,但传输过少,万一遇上大码流的 视频文件,则播放之后没多久就会出现停顿,必须等待第2 次传输的完成。所幸一般手持多媒体播放器所能支持的最高 码流都是一定的,不会经常变化,而本文的直接访问技术需 要针对播放器单独开发和调试,并非支持所有机型,因此, 可以根据实际硬件性能来调试定制初始的2次传输的大小, 而且只要对最高码率的视频调试出一个不会造成播放后停顿 的最短启动时间即可。一般对于1 MB的缓存块、1 Mb/s的 码率,第1次传输一个缓存块,第2次预读5个~8个缓存块, 以后根据实际读取的速度来计算。 图3主要步骤在各种情况下的走向如下: (1)第1次读/立即读/遇突然读取速度变快而读取未命中: 1 2 4 5 6 7 等待 8 9 1 (2)第2次读/正常预读: 132->-43103l】 l2 9 l (3)大部分情况下读取命中(数据已在缓存区): 1 2 4 103113931或1 2 4 1031 (4)正常预读完成: 1 2 3 4 l0 1l 9 l (5)预读传输过程中遇突然读取速度变快而读取未命中: l 2 4 5 153等待 16+4+1131231331431031 或发生更糟的情况(上次预读的还不够本次读取,等待2次): 1 23435 15 等待 l6 4 5 6 7 8 等待 9 10 1 写在“请求”文件中的各项命令。 田4 USB主设备靖软件漉程 5结束语 本文提出了通过在USB从设备端的存储器中建立交换 缓存区来实现USB从设备对主设备直接访问的方法,对该方 法的USB主从设备软硬件实现进行了描述,其关键是USB 从设备端顺序读的“硬盘文件缓存系统”层的实现、缓存区 大小的计算以及预读的提前量预估算法。该方法的优点在于: (1)兼容性好,不用修改传统的硬件架构和底层驱动 程序; (2)手持播放器无须拔插flash存储卡,即可直接访问外 扩硬盘中大干自身存储器剩余空间的文件; (3)可实现手持播放器以低成本和省电的方式扩展外接 硬盘。 参考文献 [1l1 Anderson D.USB系统体系[M].精英科技,译.北京:中国电力 出版社,2001. [2]上海怀瑾计算机科技有限公司.直读专利介绍[z] (2006—10—12). httl:I://WWW.witchain.com/sps 2.htm. [3]Compaq公司,Hewlett—Packard公司,Intel公司,等.Universal Serial Bus Specification[Z].2版.(2000—04—27).http://www.usb.org. 一27l一