×
嵌入式 > 技术百科 > 详情

在嵌入式系统中实现对U盘的操作

发布时间:2021-06-07 发布时间:
|

摘要:主要介绍在嵌入式系统中利用sl811hs对u盘操作的实现方法;简要介绍usb设备中的海量存储类、sl811hs的芯片特点及fat文件系统。

关键词:usb u盘 fat sl811hs

引 言usb(通用串行总线)用于将适用usb的外围设备(device)连接到主机(host),实现二者之间数据传输的外部总线结构;是一种快速、灵活的总线接口。它最大的特点是易于使用,主要是用在中速和低速的外设。随着usb规范的完善和成熟,usb外设的种类不断丰富,应用领域也不断扩大。在传统的应用中,主要是pc扮演着主机的角色。根据usb的规范,可以看到在usb的拓朴结构中居于核心地位的是主机,每一次的数据传输都必须由主机发起和控制。但是随着嵌入式产品应用领域的日益增长,usb外设的应用范围也随之扩大,为此在嵌入式系统中实现对usb外设控制也变得日益迫切。本文针对usb外设中的u盘,说明如何在嵌入式系统中利用sl811hs实现对其的操作。1 海量存储类usb设备分为五个大类,即显示器(monitors)、通信设备(communications devices)、音频设备(audio)、人机输入(human input)和海量存储(mass storage)。通常所用的u盘、移动硬盘均属于海量存储类。海量存储类的规范中包括四个独立的子规范,即cbi transprot、bulk-only transport、ata command block、ufi command specification。前两个协议定义了数据/命令/状态在usb总线上的传输方法,bulk-only传输协议仅仅使用bulk端点传送数据/命令/状态,cbi传输协议则使用control/bulk/interrupt三种类型的端点进行数据/命令/状态的传送。后两个协议定义了存储介质的操作命令,ata协议用于硬盘,ufi协议则针对usb移动存储。本设计中所使用的u盘遵循bulk-only传输协议和ufi命令规范。2 实现方法2.1 硬件设计本设计采用sl811hs芯片完成对u盘的操作。sl811hs是cypress公司推出的具有主/从两种工作模式的usb控制器,遵循usb1.1规范;可自动检测总线速率,支持全速12mbps和低速1.5mbps设备;具有8位双向的数据总线,易与单片机连接;片内256字节的sram(其中16字节用于工作寄存器),用于数据传输;可自动产生sof和crc5/16,简化软件工作量;片内具有根hub;支持挂起/唤醒工作模式,减少功耗;支持自动加1功能,减少数据读写周期;3.3v工作电源,接口可承受5v的工作电压,可与多种规格的单片机连接。单片机与sl811hs接口的原理如图1所示。 2.2 软件设计通过usb主控芯片对u盘操作的主要工作是在软件方面,它需要对众多规范、协议透彻的理解。下面主要通过软件的工作流程来说明设计过程。2.2.1 sl811hs初始化sl811hs共有15个配置寄存器,其中0~4、8~c是usb-a、usb-b的工作配置寄存器,5、f是控制寄存器,6是中断使能寄存器,d为状态寄存器,e、f为sof计数寄存器。各个寄存器的具体功能如表1所列。在sl811hs上电开始工作后,首先对usb总线复位(置寄存器5的位3为1,延时30ms后清零),然后使能设备检测中断(置寄存器6为0x61)。2.2.2 设备检测(1)软件协议在设备检测阶段,主要通过setup结构的数据包(8字节长)向usb设备的控制端点0(默认端点)发送命令。数据包结构如表2所列。(2)实现过程当u盘插入usb插座时,sl811hs产生中断,通过读取中断状态寄存器可判断中断类型。当中断类型表示为检测到设备插入时,就可对usb设备即u盘进行配置了。此时还需使能sl811hs的1ms sof(配置sl811hs的寄存器e=0xe0、f=0xae,然后置位寄存器5的位0和寄存器0的位5),以便进行数据帧的同步。在u盘未配置之前,其默认地址和默认控制端点均为0。利用setup数据包对u盘进行配置时,须将u盘的地址写入sl811hs的寄存器4,将数据包的类型和u盘的控制端点写入sl811hs的寄存器3。以下为对u盘配置过程的主要步骤。① 设备描述符(getdevicedescriptor)。请求设备描述符的setup数据包为通过读取设备描述符,可获得设备的子类(通用海量存储类)、端点0的最大包长(一般为8字节)。② 读取配置描述符(getconfigdescriptor)。对于请求配置描述符,可以先进行首次请求,要求数据包长为9(一个配置描述符的长度)。数据包内容为 接收到设备返回的数据,获得此描述符的总长,然后再发二次请求,获得全部描述符数据。数据包内容为 此时返回的数据包括了设备配置、接口、端点的全部描述信息。此部分的内容包括configuration descriptor、interface descriptor和所有端点的endpoint descriptor。在配置描述符中,可获得设备的属性(总线供电)以及最大功耗;在接口描述符,可获得设备的接口数量(只有一个数据接口)、接口类型(海量存储类)、接口子类代码(ufi)、接口通信协议(bulk-only);在端点描述符,可获得设备的in和out端点号及此端点的最大数据包长。③ 设置设备地址(setaddress)。设置设备地址的setup数据包为 设备地址为02或03(01一般用来表示设备为hub)。到此,u盘的配置过程完成。此后的主机与usb设备之间的通信必须使用设置的地址,默认地址0不再有效,传输端点则为读取的配置描述符中所定义的端点号。在配置过程中各类数据内容的正确性,可借助bushound软件工具捕捉pc机与u盘之间的活动数据,然后将自己获得的数据包内容与之相比较。2.2.3 u盘文件系统识别(1)软件协议在与u盘之间进行大量数据传输时,需要利用描述符提供的in、out端点进行数据传送,并遵循bulk-only传输协议。根据usb的协议规范,所有的传输都须由主机启动。即主机首先向设备的out端点发送一命令(cbw数据包),请求传输,格式如表3所列。在数据包中规定了下一步的数据传输方向。若为设备到主机,则当cbw发送成功后,从设备的in端点读取cbw中规定长度的数据;若为主机到设备,则当cbw发送成功后,向设备的out端点发送cbw中规定长度的数据。当主机与设备之间的数据传送完毕后,主机还需从设备的in端点读取传送状态,主机根据接收的csw数据包即可判断出通信是否正常。若返回的结果有错误,还须进行相应的出错处理。csw数据包结构如表4所列。(2)实现过程cpu向u盘发送cbw数据包,其中的命令块为ufi规范所定义的read(10)命令。读取0柱0道1扇区共512字节的mbr数据,前446字节为主引导记录,接着的64字节为dpt(disk partition table盘分区表),最后的2字节“55 aa”为有效结束标志。其中的dpt部分包含4个分区的数据结构,每个结构占16字节,具体定义如下:typedef struct{uchar bootflag; //活动标志,80h为活动分区,0为非活动//分区chs startchs; //分区开始的柱面、磁头、扇区uchar systemid; //分区类型chs endchs; //分区结束的柱面、磁头、扇区ulong relativesectors; //分区起始扇区数ulong totalsectors; //分区总扇区数}partitiontable;从第一个分区数据结构的分区起始扇区数(relative sectors)的位置读取512字节,为dbr(系统引导记录),包括一个引导程序和bpb(本分区的参数记录表)。bpb参数块记录本分区的起始扇区、结束扇区、文件存储格式、介质描述符、根目录项数、fat个数、保留扇区数、分配单元的大小等重要参数。根据保留扇区的数目可知fat表的位置(relativesectors+保留扇区数)。fat表是文件组织结构的主要组成部分,反映了磁盘上所有簇的使用情况。在给一个文件分配空间时,总先扫描fat,找到第一个可用簇,将该空间分配给文件,并将该簇的簇号填到目录的相应段内;若文件大于一个簇,则在fat表中此文件的首簇号位置填入下一个可用簇号,直到最后一个簇填入“ffff”,即形成了簇号链。对于fat12文件系统,簇号用12位表示;fat16文件系统的簇号用16位表示;fat32文件系统的簇号用32位表示。根据fat的个数以及每个fat表占用的扇区数,即可推算出文件目录表(fdt)的位置(fat表位置+fat表个数fat表所占扇区数)。fdt是文件组织结构的又一重要组成部分。目录可看作是一种特殊的文件,数据结构为32字节,包括文件名、扩展名、文件属性、时间、日期、开始簇号、文件长度等。根据根目录中的目录项数即可计算出数据区的起始扇区位置。这一部分占用了磁盘上的大部分空间,用于存储各类文件的数据。对于fat32文件系统来说,它的根目录位置不单独列出,而是等同于文件结构,保存在数据区中。这样就没有了目录项的限制,不够用的时候增加簇链,分配空簇即可。对于以上各类数据读取内容的正确判断,可将u盘插入pc机,借助winhex工具,读取磁盘上相应位置的数据内容,与之相比较。fat16文件格式的u盘空间分配如图2所示。 2.2.4 文件操作因为u盘的容量不是特别大,所以基本上都使用fat16文件系统。可以根据fat16系统的磁盘特性进行各种操作。① 创建目录。在根目录区或指定的子目录区中填加新目录的数据结构。② 删除目录。在根目录区或指定的子目录区中找到所需删除的目录,并置相应标志。③ 写文件。当写一新文件时,需在fat表中查找未使用的簇,并将该簇号写入文件对应目录数据结构中的起始簇号位置。当此文件长度大于一簇时,还需在fat表中对应的起始簇号位置填入下一可用簇的簇号,直到文件的最后一簇(fat表中的相应位置填ffff)。若磁盘有备份fat,还需在备份fat表的相应位置填入正确的内容。④ 删文件。删除文件时,除了将该文件对应的目录数据结构置相应标志外,还要修改fat表及备份fat表。将此文件使用的簇号位置清0,表示此簇当前未被使用。2.2.5 bulk传输流程使用u盘的bulk端点进行数据传送,bulk传输分为bulk-in和bulk-out。其中bulk-in指的是主机向外围设备请求数据,由外围设备向主机发送数据。bulk-out的传输方向与bulk-in相反,由主机向外围设备发送数据。根据ufi规范的定义,每次读写操作都以逻辑块(扇区)为单位。一般u盘的一个扇区为512字节,而bulk端点的最大包长为64字节,即一个扇区的读写操作需要8个循环才能完成。(1)bulk-in流程bulk-in流程如图3所示。在接收设备数据的循环中,因为一个扇区的操作需要8次才能完成,因此要注意每接收一个数据包,都要将sl811hs寄存器0中的数据位(位6)变换一次。data1和data0交替使用。(2)bulk-out流程与bulk-in流程差不多,只是在cbw数据包中,注明了下一阶段的传输方向为主机到外围设备。在cbw发送ack之后,向设备的out端点发送pid-out数据包,使得设备接收所要传送的数据。在数据传输完毕后,仍要向设备的in端点发送pid-in数据包,读取设备的csw数据包,判断传输结果,并进行相应处理。在发送数据的循环中,同样要注意data0和data1的交替使用问题。结 语目前开发的在嵌入式系统中利用usb主控芯片实现与u盘的操作技术,已应用在我们自主开发研制的消防产品中。实现了消防控制器与u盘之间的各类信息的传输,为数据分析提供了有利的手段。在越来越多的消费类市场,这一技术必将有更为广阔的应用前景。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?