为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

U盘原理

2011-11-11 20页 pdf 493KB 116阅读

用户头像

is_755715

暂无简介

举报
U盘原理 .U 盘原理 4.1 概述 4.1.1 PC 接口简介 PC 中的接口有两类:串行接口和并行接口。计算机内部总线,如 CPU 与存储器之间匀 采用并行接口,这样速度快;但外设却以串行接口比较占优势。 传统的打印机接口为并行接口,它实际上叫 Cetronix 标准,这种接口现在已经没有发展 了。SCSI 标准的全名是小型设备通用接口标准,其传输速率为 10M,早期的扫描仪一般使 用此接口,硬盘与主机的联接也使用这种接口。 串行接口出现最早,使用最广的 RS232 接口,但其速度太慢,现在已经逐渐淘汰。USB ...
U盘原理
.U 盘原理 4.1 概述 4.1.1 PC 接口简介 PC 中的接口有两类:串行接口和并行接口。计算机内部总线,如 CPU 与存储器之间匀 采用并行接口,这样速度快;但外设却以串行接口比较占优势。 传统的打印机接口为并行接口,它实际上叫 Cetronix 标准,这种接口现在已经没有发展 了。SCSI 标准的全名是小型设备通用接口标准,其传输速率为 10M,早期的扫描仪一般使 用此接口,硬盘与主机的联接也使用这种接口。 串行接口出现最早,使用最广的 RS232 接口,但其速度太慢,现在已经逐渐淘汰。USB 接口和 IEEE1394 接口是两种速度比较高的串行接口,还有局域网中的以太网接口,它们具 有较广阔的发展前景和应用潜力。 USB 适用于低档外设与主机之间的高速数据传输,USB1.1(目前 USB1.1 标准已被包含 进 USB2.0 标准之内,其 12Mbps 的传输速度已成为 USB2.0 的全速标准)可以达到 1.5Mbps 或 12Mbps 的传输率,而 1394 更是可达 100/200/400Mbps。USB2.0 将速度定位在 480Mbps(高速),而 IEEE1394 也推出了 1394b1.3.1 版草案,速度从 800Mbps 起步,最高 可达 3.2Gbps。 局域网中用得最多的是以太网接口,速度可达 100Mbps,当使用光纤传输时,速度可达 1000Mbps。 4.1.2 USB 接口分析 通用串行总线(Universal Serial Bus USB),是一种快速、灵活的总线接口。与其它通信 接口比较,USB 接口的最大特点是易于使用,这也是 USB 的主要设计目标。作为一种高速 总线接口,USB 适用于多种设备,比如数码相机、MP3 播放机、高速数据采集设备等。易 于使用还现在 USB 接口支持热插拔,并且所有的配置过程都由系统自动完成,无需用户 干预。 USB 接口支持 1.5Mb/s(低速)、12Mb/s(全速)和高达 480Mb/s(USB2.0 )的数据传输速 率,扣除用于总线状态、控制和错误监测等的数据传输,USB 的最大理论传输速率仍达 1.2Mb/s 或 9.6Mb/s,远高于一般的串行总线接口。 4.1.3 USB 器件的选择 在进行一个 USB 设备开发之前,首先要根据具体使用要求选择合适的 USB 控制器。目 前,市场上供应的 USB 控制器主要有两种:带 USB 接口的单片机(MCU)或纯粹的 USB 接口芯片。 带 USB 接口的单片机从应用上又可以分成两类,一类是从底层设计专用于 USB 控制的 单片机;另一类是增加了 USB 接口的普通单片机,如 Cypress 公司的 EZ-USB(基于 8051),选择这类 USB 控制器的最大好处在于开发者对系统结构和指令集非常熟悉,开发 工具简单,但对于简单或低成本系统。但价格因素也是在实际选择过程中需要考虑的因素。 纯粹的 USB 接口芯片仅处理 USB 通信,必须有一个外部微处理器来进行协议处理和数 据交换。典型产品有 Philips 公司的 PDIUSBD11(I2C 接口)、PDIUSBD12(并行接口)、 isp1581、isp1582,NS 公司的 USBN9603/9604(并行接口),NetChip 公司的 NET2888 等。 USB 接口芯片的主要特点是价格便宜、接口方便、可靠性高,尤其适合于产品的改型设计 (硬件上仅需对并行总线和中断进行改动,软件则需要增加微处理器的 USB 中断处理和数 据交换程序、PC 机的 USB 接口通信程序,无需对原有产品系统结构作很大的改动)。 4.1.4 Mass Storage协议与 FAT16 USB 组织定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个独 立的子类规范,即: 1. USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport 2. USB Mass Storage Class Bulk-Only Transport 3. USB Mass Storage Class ATA Command Block 4. USB Mass Storage Class UFI Command Specification 前两个子规范定义了数据/命令/状态在 USB 上的传输方法。Bulk-Only传输规范仅仅使用 Bulk端点传送数据/命令/状态,CBI 传输规范则使用 Control/Bulk/Interrupt三种类型的端点进 行数据/命令/状态传送。后两个子规范 则定义了存储介质的操作命令。ATA命令规范用于硬 盘,UFI命令规范是针对 USB移动存储。 Microsoft Windows 中提供对 Mass Storage协议的支持,因此 USB移动设备只需要遵循 Mass Storage协议来组织数据和处理命令,即可实现与 PC 机交换数据。而 Flash 的存储单 元 组织形式采用 FAT16文件系统,这样,就可以直接在 Windows 的浏览器中通过可移动磁 盘来交换数据了,Windows 负责对 FAT16文件系统的管理,USB 设备不需要干预 FAT16文 件系统操作的具体细节。 API½Ó¿Ú UFI/ATAÇý¶¯ USB´ « ÊäÇý¶¯ £¨ CBI»òBulk Only£© USB×ÜÏß USB×ÜÏß ½Ó¿Ú USB´ « Êä´ ¦ Àí ´æ´¢ ½éÖÊ½Ó¿Ú UFI/ATAÃüÁî´¦ Àí ´æ´¢ ½éÖÊ £¨ Ó²ÅÌ¡¢ ÉÁ´æµÈ£© Ö÷»ú£¨ USB Host£© ´ó ÈÝÁ¿´ æ´¢ É豸£¨ USB Peripheral) USB 移动存储结构 4.2 USB 与文件系统基本原理 4.2.1 USB 的端点 端点是 USB 中一个独特的概念,它是一个可以与 USB Host交换数据的硬件单元。USB Host 与 USB 设备之间都是通过端点来传输数据的,端点是桥梁和纽带,不同的端点其传输 数据的能力不同,适于不同的应用场合。 4.2.2 Mass Storage协议 USB协议能够在启动或是当设备插入系统时对设备进行备置,这就是 USB 设备为什么 可以执插拨的原因。USB 设备被分成以下几类:显示器(Monitors)、通讯设备 (Communication devices)、音频设备(Audio)、人机输入(Human input)、海量存储 (Mass storage)。特定类(class)的设备又可划分成子类(subclass),划分子类的后软件 就可以搜索总线并选择所有它可以支持的设备。每个设备可以有一个或多个配置 (Configuration),配置 用于定义设备的功能。如果某个设备有几种不同的功能,则每个功 能都需要一个配置。配置(configuration)是接口(interface)的集合。接口指定设备中的哪 些硬件与 USB交换数据。 每一个与 USB 交换数据的硬件就叫做一个端点(endpoint)。因 此,接口是端点的集合。USB 的设备类别定义(USB Device Class Definitions)定义特定类 或子类中的设备需要提供的缺省配置、接口和端点。描述符(descriptor)描述设备、配置、 接口或端点的一般信息,下图为 USB 描述符的层次结构。 USB 描述符的层次结构 USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这 些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是 USB 设备正常工作的先决条件。 USB海量存储设备(USB Mass Storage Class)包括General Mass Storage Subclass、CD -ROM、Tape、Solid State。Mass Storage Class只需要支持一个接口,即数据(Data)接口, 选择缺省配置时此接口即被激活。数据接口允许与设备之间进行数据传输,它提供三个端点: Bulk Input端点、Bulk Output端点和中断端点。 通用海量存储设备(General Mass Storage Device)是随机存取、基于块/扇区存储的设 备。它只能存储和取回来自 CPU 的数据。这种设备的接口遵循 SCSI-2 标准的直接存取存 储设备(Direct Access Storage Device)协议。USB 设置上的介质使用与 SCSI-2 设备相同的 逻辑块(logical blocks)方式寻址。 下面介绍基于 Bulk Only(批量传输)模式的 Mass Storage 设备的描述符:每个 USB 设 备都必须有一个设备描述符。Mass Stroage 设备的设备类型和子类代码均在接口描述符中设 置,这里置 0。其中 iSerialNumber 可为零,即不指定 Serial Number。 设备(Device)描述符 配置描述符如下图,第 4字节处的接口数应为 1。 配置(Configuration)描述符 设置应至少支持一个接口,这里为 Bulk-Only Data 接口,此接口使用三个端点:控制 端点(默认)、Bulk-In 和 Bulk-Out。其中 bInterfaceSubClass 指定所使用的工业标准命令 块,bInterfaceProtocol 为所使用的传输协议,其定义见后。 接口(Interface)描述符 由于控制端点为每个设备都使用的缺省端点,因此不需要定义,只需定义 Bulk-In 和 Bulk-Out 两个端点,其端点描述符如下: Bulk-In端点描述符 Bulk-Out端点描述符 bInterfaceSubClass 处的工业标准命令块代码 Mass Storage 传输协议 2.3 Bulk-Only 传输协议 设备插入到 USB后,USB即对设备进行搜索,并要求设备提供相应的描述符。在 USB Host 得到上述描述符后,即完成了设备的配置,识别出为 Bulk-Only 的 Mass Storage 设备, 然后即进入 Bulk-Only 传输方式。在此方式下,USB 与设备间的所有数据均通过 Bulk-In 和 Bulk-Out来进行传输,不再通过控制端点传输任何数据。在这种传输方式下,有三种类 型的数据在 USB 和设备之间传送,CBW、CSW 和普通数据。CBW(Command Block Wrapper,即命令块包)是从 USB Host 发送到设备的命令,命令格式遵从接口中的 bInterfaceSubClass 所指定的命令块,这里为 SCSI 传输命令集。USB 设备需要将 SCSI命令从 CBW 中提取出来,执行相应的命令,完成以后,向Host 发出反映当前命令执行状态的 CSW(Command Status Wrapper),Host 根据 CSW来决定是否继续发送下一个 CBW 或是 数据。Host 要求 USB 设备执行的命令可能为发送数据,则此时需要将 特定数据传送出去, 完毕后发出 CSW,以使 Host 进行下一步的操作。USB 设备所执行的操作可用下图描述: USB Host按照下面的格式向设备端发送 CBW。 CBW 其中 dCBWSignature 的值为 43425355h(LSB),表示当前发送的是一个 CBW; dCBWTag 的内容需要原样作为 dCSWTag再发送给Host;dCBWDataTransferLength 为本次 CBW 需要传输的数据,bmCBWFlags反映数据传输的方向,0 表示来自 Host,1 表示发至 Host;bCBWLUN 一般为零,但当设备有多个逻辑单元时,用此位指定本次命令是发给谁的; bCBWCBLength 为本次命令字的长度;CBWCB即为真正的传输命令集的命令。 得到一个 CBW后,解析出 CBWCD 中所代表的命令,然后按照 SCSI命令集中的定义 来执行相应的操作,或是需要接收下一个 Bulk-Out 发来的数据,或是需要向Host 传送数据, 完成以后需要向USB Host 发送 CSW,反映命令执行的状态。USB 也是通过此来了解设备的 工作情况的。下面是 CSW 的格式和定义: CSW dCSWSignature 的内容为 53425355h,dCSWTag即为 dCBWTag 的内容, dCSWDataResidue 还需要传送的数据,此数据根据 dCBWDataTransferLength-本次已经传送 的数据得到。Host端根据此值决定下一次 CBW 的内容,如果没有完成则继续;如果命令正 确执行,bCSWStatus返回 0即可。按这个规则组装好 CSW后,通过 Bulk-In端点将其发出 即可。 4.2.4 SCSI 指令集 Bulk-Only 的 CBW 中的 CBWCB 中的内容即为如下格式的命令块描述符(Command Block Descriptor)。SCSI-2 有三种字长的命令,6 位、10 位和 12 位,Microsoft Windows环 境下支持 12 位字长的命令。 12 位字长的 SCSI命令 Operation Code 是操作代码,表示特定的命令。高 3 位为 Group Code,共有 8 种组合, 即 8 个组,低 5五位为 Command Code,可以有 32 种命令。 Logicol unit Number 是为了兼容 SCSI-1 而设的,此处可以不必关心。 Logical block address 为高位在前,低位在后的逻辑块地址,即扇区地址。第 2 位为高位, 第 3、4、5依次为低位。 Transfer length 为需要从逻辑块地址处开始传输的扇区数(比如在 Write命令中); Parameter list length 为需要传输的数据长度(比如在 Mode Sense命令中);Allocation length 为初始程序为返回数据所分配的最大字节数,此值可以为零,表示不需要传送数据。 SCSI 指令集的 Direct Accesss 类型存储介质的传输命令有许多,所幸运的是 Mass Storage协议只用到了其中的一些。下面黑体部分即为需要 USB 设备作出响应的请求,一般 是要求向Host 发送一些有关设备的数据: SCSI – Direct Access Opcode INQUIRY 12h TEST UNIT READY 00h FORMAT UNIT 04h LOCK-UNLOCK CACHE 36h MODE SELECT(6) MODE 15h 1Ah PRE-FETCH 34h PREVENT-ALLOW MEDIUM REMOVAL 1Eh READ(6) READ(10 08h 28h READ CAPACITY 25h READ DEFECT DATA 37h READ LONG WRITE LONG 3Eh 3Fh REASSIGN BLOCKS 07h RECEIVE DIAGNOSTIC RESULTS SEND DIAGNOSTIC 1Ch 1Dh RELEASE 17h RESERVE 16h REZERO UNIT 01h SEEK(10) 2Bh SET LIMITS 33h START STOP UNIT 1Bh SYNCHRONIZE CACHE 35h VERIFY 2Fh WRITE(6) WRITE(10 0Ah 2Ah WRITE AND VERIFY 2Eh WRITE SAME 41h 对于不同的命令,其命令块描述符略有不同,其要求的返回内容也有所不同,根据相应 的文档,可以对每种请求作出适当的回应。比如,下面是 INQUIRY请求的命令块描述符和 其返回内容的数据格式: 命令块描述符: 返回数据格式:查看数据 Host会依次发出 INQUIRY、Read Capacity、UFI Mode Sense请求,如果上述请求的返 回结果都正确,则Host会发出 READ命令,读取文件系统 0簇 0扇区的 MBR 数据,进入文 件系统识别阶段。 对于 PREVENT-ALLOW MEDIUM REMOVAL 和 TEST UNIT READY命令,只需直接 返回 CSW即可,对于后者,由于 Flash 盘总是处于 READY 状态,故可直接返回 CSW。 4.2.5 FAT16文件系统 1. FAT文件系统结构 一个 FAT(FAT12/FAT16/FAT32)文件系统卷(卷可以理解为是一张软盘、一个硬盘 或是一个 Flash电子盘)由四个部分组成: 1)保留区(Reserved Region) 分区的保留区(Reserved Region)中的第一个扇区必须是 BPB(BIOS Parameter Block), 此扇区有时也称作“引导扇区”、“保留扇区”或是“零扇区”,因为它含有对文件系统进 行识别的关键信息,因此十分重要。 2)FAT区 FAT即 File Allocation Table,文件分配表。操作系统分配磁盘空间按簇来分配的。因此, 文件占用磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也 会给他分配一个最小单元——即一个簇。为了可以将磁盘空间有序地分配给相应的文件,而 读取文件的时候又可以从相应的地址读出文件,我们把整个磁盘空间分成 32K字节长的簇来 管理,每个簇在 FAT 表中占据着一个 16 位的位置,称为一个表项。 对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘的一个连 续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存 储。为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每 个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本 簇无后继簇。这些都是由 FAT 表来保存的,FAT 表的对应表项中记录着它所代表的簇的有关 信息:诸如是否空,是否是坏簇,是否已经是某个文件的尾簇等。FAT区的结构如下: FAT区结构 FAT 的项数与硬盘上的总簇数相关(因为每一个项要代表一个簇,簇越多当然需要的 FAT 表项越多),每一项占用的字节数也与总簇数有关(因为其中需要存放簇号,簇号越大 当然每项占用的字节数就大)。FAT 的格式有多种,最为常见是 FAT16 和 FAT32,其中 FAT16 是指文件分配表使用 16 位,由于 16 位分配表最多能管理 65536(即 2 的 16次方)个 簇,又由于每个簇的存储空间最大只有 32KB,所以在使用 FAT16管理硬盘时,每个分区的 最大存储容量只有(65536×32KB)即 2048MB,也就是我们常说的 2G。现在的硬盘容量是 越来越大,由于 FAT16 对硬盘分区的容量限制,所以当硬盘容量超过 2G 之后,用户只能将 硬盘划分成多个 2G 的分区后才能正常使用。 由于 FAT 对于文件管理的重要性,所以 FAT 有一个备份,即在原 FAT 的后面再建一个 同样的 FAT。 3)根目录区(Root Directory Region) 紧接着第二个 FAT 表的后面一个扇区,就是根目录区了。根目录区中存放目录项,每个 目录项为 32 个字节,记录一个文件或目录的信息(长文件名例外)。以下是目录项的结构: 目录项结构 目录项所占的扇区数与有多少个目录项有关,它将占用(目录项*32/512)个扇区。 4)文件和目录数据区 目录项的所占的最后一个扇区之后,便是真正存放文件数据或是目录的位置了。 2.NAND Flash 盘的 FAT 结构 NAND Flash 与普通的磁头、柱面式介质不一样。在开发 U 盘的过程中,使用 NAND Flash 作为存储介质。它有其特定的结构特点。 以 32M 的东芝 TC58DVM82A1FT 为例,它有 2048 个 Block,每个 Block 有 32 个 Page, 每个 Page 有 512+16=528 个字节。 NAND Flash 的结构 NAND Flash 的读写有其自身特点: 1)必须以 Page 为单位进行读写; 2)写之前必须先擦除原 有内容; 3)擦除操作必须对 Block 进行,即一次至少擦除一个 Block 的内容。 针对这种情况,将 NAND Flash 的一个 Page 定为 1 个扇区,将其 2 个 Block,64 个扇区 定为一个簇,这样,簇的容量刚好为 512×64=32K,满足 FAT16 对簇大小的要求。 FAT 分配空间的时候,是按簇来分配的,但是其给出的地址却是 LBA(Logical Block Address),即它只给出一个扇区号,比如对此 NAND Flash 而言,若给出 LBA 为 0x40,实 代表簇 1 的扇区 1。因此需要将 Logical Block Address转换为物理地址,这样,才可以对数 据进行存取操作。根据我们定义的结构,转换公式为: NAND Flash 的 Block=Logical Block Address/0x20 NAND Flash 的 Page=Logical Block Address %0x20 实际上,如果定义每个簇为 32 个扇区是最好的,因为这样物理结构和逻辑结构刚好一 致。但是这也无防,因为不管 Logical Block Address给出什么值,只要按上述公式,总可以 得到物理上正确的 Block 和 Page,再使用 NAND Flash 的读写命令读取对应的 Block 和 Page 就可以了,读的问题复杂一些,在后面介绍。 因此簇和扇区的概念只是在 BPB 中给出存储介质信息的时候告之系统就可以了,我们 只要做好 LBA 与物理地址间的转换就可以了。 由于做为 U 盘的 NAND Flash 不要求启动,因此可以没有 MBR 区,只包含 DBR、FAT、DIR 和 DATA四个区。 因此,Flash 的前两个 Block 的内容如下: LBA Block/Page 长度 内容说明 0 0,0 512字节 MBR=BPB+Excutable Code+55AA(查看内 容)1~2 0,1~0,2 1024字节 FAT 区(第一份FAT) 3~4 0,3~0,4 1024字节 FAT 区备份(第二份FAT) 5~39H 目录区(在 BPB 中调整目录项数,使其刚好占尽 本簇)40H~ 数据区(因目录区占尽一个簇,故数据区始于新 簇首扇)当 Host 发出 READ命令后,NAND Flash读写操作即告开始,Host 首先读取MBR,得 到有关存储介质的有关信息,诸如扇区长度、每簇扇区数以及总扇区数等内容,以便知道此 盘有多大。如果读取正确,会接着读取文件分配表,借以在 PC 机上的可移动盘符中显示文 件目录,并可以复制、删除或是创建文件。系统自动将这些命令都转换成 Read 或 Write 两种 命令,通过 USB 的 READ 或 WRITE命令块描述符来从 NAND Flash 中相应扇区读取数据, 或是将特定长度的数据写入 Flash 相应簇中。 4.2.6 NAND Flash 的读写 针对 NAND Flash读写的特点,特别是其可随机读,但无法随机写的问题,需要通过设 置缓冲区来解决。在与 USB Host 进行数据交换的过程中,最小的单位是扇区:512字节。 由于 NAND Flash 在写之前必须先擦除,而一擦又必须擦一个 Block,因此在擦除某 Block 之 前必须保存同一个 Block 中有关扇区的数据。因此,如果每收到一个扇区的内容就进行一次 擦、保存、写的操作,系统任务将十分繁重,无法及时响应 USB Host端的请求。 因此,在系统中设置 32K 的缓冲区,每完成一次数据传输后,记下本次要写的开始扇区 和总扇区数,将本次要写的数据所涉及的扇区以外的数据从 NAND Flash 中读出来,存放在 缓冲区中对应位置,然后擦除一个 Block,再将缓冲区中内容一次全部重新写入NAND Flash。 4.3 USB 开发调试过程 在进行 USB 开发过程中,比较难的是对设备端的程序(称为固件,Firmware)进行调 试。由于 USB协议有严格的时间要求,这就使得程序必须在有效时间内对某些请求或状态 进行处理,否则,USB 将无法正常工作。因此,在调试过程中,较多借助串口输出程序输出 的一些信息来辅助调试,定位问题所在。比如,在某个函数中加入输出语句,程序运行时看 有否特定的输出内容,借此来判断此函数是否得到了执行,并通过输出一些量来查看状态。 调试工作基本分三步进行:首先对外部设备(单片机部分)借助 PC调试软件(芯片生产商提 供或从网上下载 Bus Hound,WINRT-USB 等调试软件)将设备端的 USB协议(主要 有描 述符请求、端口配置、地址设置以及基本数据交换)调通。然后,用调试好的 USB 设备接 口来开发、调试 PC软件,这一步相对比较容易。最后,加上 USB 设备端的其它用户程序, 对整个完整的系统进行系统调试。 4.3.1 U 盘调试的主要步骤和内容 USB 设备端的固件分以下几个层次: 文件模块名称 主要功能 Main.c 进行各种初始化操作、寄存器设置、中断设 置Fat16.c flash.c 负责按照Fat16文件系统的组织向Flash中写入 数 据或是从Flash中读出数据Chap9.c bulk- only.c 完成不同的中断请求,Chap9完成来自端点0 的USB标准设备请求,Bulk-Only完成来自批 量模式端点的Mass Storage Bulk-Only传输中 断请求Isr.c 中断服务程序,负责将不同类型的中断转向 一同的 地方Isp1582.c 函数化的 Isp1582 的命令集合,可以直接 调用这些函 在调试的时候,从现象上来看,分成以下几个阶段性的步骤: 1、USB 芯片正常工作,可以实现软连接,此时 PC 机上会出现“未知设备类型”的 USB 设备; 2、使用他人已经高度成功的 USB 通用接口,按普通 USB 设备提供描述符,提供正确 的 VID 和 PID后,PC能 够识别设备,但要求提供设备的驱动程序; 3、安装驱动程序后,调试几个端点,使其均可传输数据,用 PC端的测试程序对其进行 测试,验证硬件及固件的正确性; 4、按 Mass Storage Bulk-Only模式提供描述符,PC 机上设备类型变成 Mass Storage Device; 5、响应了 Bulk-Only 的 Inquiry命令,可以出现盘符了,但尚无法访问磁盘; 6、提供了其他所有的 UFI命令(SCSI子集),开始读取磁盘 0扇区(BPB区)的内容, 按照 FAT16 的格式格式化 Flash,可以正确读取信息,可以访问盘符,列目录为空; 7、创建文件时,向设备发出 Write命令,调整NAND Flash 的读写问题,解决写某几个 扇区要先保存整个簇的内容,然后擦除整簇,再回写,可以正常创建文件; 8、完成最后的调试,U 盘调试完毕。 在此基础上,还需要提供支持 FAT16 的文件系统接口函数,比如,可以从 FAT16 中读 取文件,可以创建文件并将其保存到 FAT16 中去。 4.3.2 提供描述符 USB 设备的调试过程其实就是根据主机的请求,不断地向主机提供各种信息的过程。因 此,了解主机按照什么样的顺序向设备发出请求,即Windows 对 USB 设备的枚举顺序是非 常有必要的: ①GetDeviceDescriptor。主机主要对 Length 域感兴趣,发送内容一定要正确,特别是第 2字节 type 一定为 0x01,即Device;否则,主机将不响应,或者再重复 2次后放弃。这时由 于主机对 Device 的描述符将有多长实际上都不知道,所以这个步骤只是试探性的,目的是 得到真正长度,第三步中才正而巴经地读取DeviceDescriptor。查看 DeviceDescriptor ② SetAddress。一般为 02 或 03。 ③连续 3 次 GetDeviceDescriptor,读取全部设备描述符,一般为 18 B,分为多次传输。 如果不正确,主机将不响应或重复 2 次后放弃。 ④GetConfigDescriptor。注意第 2字节一定为 0x02,即 config。这部分内容包括 Configuration Descriptor、Interface Descriptor 和所有要用到的端点的 EndPooint Descriptor。 ⑤GetStringDescriptor(可能没有),根据在设备描述符中是否有 String索引而定。一般 先读取 LanguageID,再读取 product string。 ⑥读取全部 ConfigDescriptor,次数根据描述符的大小决定(端点个数不同,描述符大 小不同),如果不正确,主机将不响应或再重复 2次后放弃。 ⑦如果以上步骤都正确,主机将找到新设备,提示安装驱动程序;否则找到未知设备, 不可用。 安装驱动程序后,以后的每次 PlugIn,枚举次序与以上步骤略有不同,之后会有 SetConfiguration、GetConfiguration 和 GetInterface 等调用。 需要说明的是,USB 协议中所有字数据均定义为低字节在前传输(LSB),因此如果所 使用 MCU 对字的处理方式与之不同时,就需要进行转换。比如在 8051平台上,是 MSB, 因此 Phlips 的 VID 为 0471H,但在 Device Descriptor 中的 iDVendor 应定义成 71H、04H。 正确安装驱动程序以后,还可以通过一些工具来查看USB 设备的描述符情况,以确定 自己所提供的描述符信息是否都正确。 在调试过程中,指望得到一个绝对正确的提供描述符的顺序是没有什么用处的,最好的 办法就是掌握调试的方法,因为一旦掌握这个方法,那么在后续的调试过程中就更加得心 应手了。下面就介绍如何使用 Bus Hound 软件来辅助调试。 下图所示即为 Bus Hound获取USB 总线上的数据的情形,有三个部分的数据对调试来 讲比较有用,Phase 可以让调试者知道当前处于什么阶段,是控制命令发出,数据发出还是 接收到数据。Data则可以让我们清楚地知道主机向Device 发了些什么,或是 Device向主机 发了些什么,将此数据与 Device 从主机收到的数据或是发向主机的数据进行对比,可以确 保数据是否传输正确。Info 阶段则可以让我们知道当前处于 USB协议的什么阶段,它可以 清晰地表示出是在 GET DESCRIPTOR阶段还是 SET CONFIG阶段⋯⋯ 在此工具的最上面一行中,还可以通过 Save 将所得到的数据作为文件保存下来再进行 分析;从 Devices 中可以选择要对哪些设备的数据进行捕获;Settings 中可以设置缓冲区的总 长度和每个 Phase 数据长度的限制。总之,Bus Hound 是进行 USB 开发的利器,是调试过程 中的必备工具。 Bus Hound调试工具 4.3.3 有关Mass Storage协议的相关操作 如果是按照Mass Storage Bulk-Only 传输协议提供的描述符,则当 Bus Hound 中 DI阶 段中的数据出现 55 53 42 53字样,说明已经开始开始发送 Bulk-Only 协议的 CBW 了。这 时可以将前面的工作告一段落,即不用太多考虑USB 中断啦、端点啦之类的问题,到此阶 段后只有两个端点工作,即 Bulk-In 和 Bulk-Out,In 或 Out 都是从主机的角度来讲的, 前者用于 Device向Host 发送数据,后者用于 Host向Device 发送数据。Bulk-In端点的处理 比较简单,在需要的时候,Device 将要发往Host 的数据通过此端点送出即可,如果数据一 次不能发完,则设置标志位,通过发送中断的产生可以实现连续发送。Bulk-Out端点的情 况比较复杂一些,要判断收到的是协议内容还是数据,如果是协议内容,要对协议包进行解 析,根据协议中的内容得到 UFI(SCSI)命令,然后再根据这些命令处理处理相应的请求。 对 Bulk-In端点的处理见下列图: 对 Bulk-Out端点的处理见下列流程图: 4.3.4 有关 SCSI命令集的相关操作 在 SCSI命令集的处理中,比较难处理的是 WRITE 和 READ 比较难处理。因为 Host 传 送数据至少一次为 512 个字节,不管是读还是写,都需要一次传送 512 个字节,但是批量传 输端点一次只能传输 64 个字节,即要传 8次才可以传完。因此,在向Host 传送数据时,设 置传输标志,当 Device 的发送中断出现后,判断此传输标志,如果正处于传输状态,则继 续传输,直至需要的数据传输完毕,再传输 CSW。在从 Host 接收数据时,也设置接收标 志,当收到 WRITE命令后,即进入此状态,直至从 Host端接收数据完毕,再将数据存入 NAND Flash 中。 4.3.5 有关NAND Flash 的读写的相关操作 NAND Flash 的读写直接调用两个函数 ReadPage()和 WritePage()即可,他们可以一 次写入 528 个字节(512+16)的内容。但是注意必须在写数据之前首先将相应的簇擦除, 擦除之前又需要先将不覆盖的数据保存。
/
本文档为【U盘原理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索