U盘驱动七篇

2024-06-03

U盘驱动 篇1

一、制度上约束

宜黄县支行根据计算机保密管理规定的要求, 结合工作实际, 完善了移动存储设备管理实施细则, 确保制度操作可行、监督措施合理有效。实施细则全面禁止在宜黄县支行内联网计算机设备上使用U盘等移动存储设备, 所有跨网信息和数据传递必须采取刻录光盘的方式进行, 对光盘的使用管理必须按照保密要求进行登记备案和分级管理。

二、责任上落实

宜黄县支行积极开展计算机信息安全宣传教育活动, 及时将总行“十个不得”和“八项禁令”等计算机信息安全规定传达至全行干部职工, 同时按照计算机安全管理的要求, 层层签订了责任书, 明确了干部职工在U盘等USB移动存储设备管理中的职责, 使干部职工转变了观念, 在思想上筑牢防线, 提高责任意识, 在行为上增强执行力, 杜绝使用U盘等USB移动存储设备, 提高了规范管理效率。

三、技术上保障

人民银行抚州市中心支行科技科在LANDesk Management中对县支行全面禁用了USB移动存储设备, 在注册表中将[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesUSBSTOR]的Start的DWORD值由“3”改为“4”;宜黄县支行也采取了必要的技术手段防止使用USB移动存储设备, 即在设备管理器中对除连接USB打印机或光驱等设备外的USB Root Hub进行了停用;在服务中将Removable Storage启动类型设置为“禁用”。通过上述措施彻底为宜黄县支行内联网计算机构建起一道安全网, 成为U盘等USB移动存储设备的绝缘体。

四、服务上创新

为了保证业务正常运行, 信息和数据的传递快捷有效, 宜黄县支行新配置了一台中转计算机、外置刻录机和可读写DVD (CD) 盘。中转计算机既不与内网、也不与外网连接, 而是一个“孤岛”, 作为信息和数据的中转站, 安装好Symantec 10版杀毒软件以及其他的辅助软件后, 定期由科技人员对病毒库和系统补丁进行手动升级。所有需要传入内网的外部信息和数据必须先通过中转计算机进行防杀毒检测, 然后才能刻录到光盘中, 最后再拷贝到内联网计算机上使用, 从而防止外部病毒、木马等在内联网的传播, 增强了内联网数据的安全性、准确性和有效性。此外, 内联网数据内部传递可以通过Notes邮箱、FTP服务器来完成, 外部传递则统一采用刻录光盘的方法来完成。

五、监督上从严

安全U盘能否替代传统U盘? 篇2

张力介绍,除了安全U盘外,国民技术还推出了一系列安全存储芯片,用于开发安全硬盘等设备。

为什么要设计安全U盘?

开发安全U盘的思路,源于越来越多的信息正在通过小小的U盘丢失。U盘很小,很多人经常在不经意间就忘记把盘放在什么地方了,如果被人捡到,很轻易就能读取秘密信息,对U盘持有人的个人信息安全造成很大的困扰。

2008年,日本陆上自卫队失去了一个存有联合美日军事演习部署信息的U盘, 这个U盘是被偷去还是不慎丢失目前尚不清楚,但这些资料包括对美国海军来说极为重要的宙斯盾导弹系统数据,给日本军方带来了严重损失。2009年6月底,深圳某著名妇幼保健医院发生了产妇和婴儿资料信息泄露的严重事件,据知情人透露,是有人利用职务之便,在上班时间仅仅用了5分钟时间,通过U盘拷贝了相关的重要数据后,被不法分子随即以1.2万元的价格对外出售——诸如此类的信息泄漏事件在我们身边越来越多,已经不再算是新闻。这一切,都对U盘的安全性提出了新要求。

国民技术公司是我国安全芯片及密码技术领域的翘楚,因此,2007年,公司确定了将安全存储芯片作为公司的四大战略重点进行技术研究和开发。

2009年年初,国民技术与国内移动存储龙头企业爱国者合作,打造了国密U盘商务型、精英型、卡片存储王三款产品。此三款产品都采用了国民技术的Z8HM2安全主控芯片。2010年,aigo、旅之星、世纪飞扬、鼎普科技及国外许多著名厂商将会有多达几十款安全U盘面世。这些盘均采用Z8HM2安全主控芯片,在数据存入U盘的同时,进行全盘数据加密,硬件加密芯片提供了高速加密存储技术,和普通U盘使用起来一样快速简单。

能否替代传统存储设备?

安全U盘的概念虽然很好,但每次用起来要敲密码,会给使用者增加难度;此外,如果使用者自己都忘记密码了,怎么办?很多人会发出这样的疑问.

张力介绍,安全U盘针对的并非普通用户市场,而是针对那些对信息的内容非常敏感的使用者,比如政府、军队、软件开发者等。“因为,重要的不是盘本身,而是盘中的信息。”他介绍。

目前,一些对信息保密要求很严格的企业和个人,对安全存储都有需求。例如,在军工以及航空航天等关系到国家安全的领域,信息关系到国家安全,必须用最高级别的安全措施保护。Aigo在2009年4月17日发布了安全U盘的系列产品,推广带国密算法的安全U盘,更好地保护消费者、政府和行业客户的隐私,防止信息泄露。在软件开发领域,软件的授权和版权保护,关系到软件企业的生死,采用安全存储技术将会给企业带来利益的最大化。比如金蝶公司,其全国的几十万家企业用户中,也都部分采用了安全存储技术,用于对软件的保护。

在对信息安全重视程度高的领域,每个人都得为自己的行为负责,如果密码能够通过别人找回来,那么证明这种模式是存在缺陷的,是不能保证绝对安全的。

没有U盘驱动怎么修复 篇3

1、开机按F8进入安全模式后在退出,选重启或关机在开机,就可以进入正常模式(修复注册表)。

2、如果故障依旧,请你用系统自带的系统还原,还原到你没有出现这次故障的时候修复(如果正常模式恢复失败,请开机按F8进入到安全模式中使用系统还原),

3、如果故障依旧,使用系统盘修复,打开命令提示符输入SFC /SCANNOW 回车(SFC和/之间有一个空格),插入原装系统盘修复系统,系统会自动对比修复的。

4、如果故障依旧,在BIOS中设置光驱为第一启动设备插入系统安装盘按R键选择“修复安装”即可。

创新U盘 篇4

自由旋转U盘

(一)实用新型名称

自由旋转U盘

(二)摘要

本实用新型公开了一种自由旋转U盘,其特殊之处在于:U盘插头与U盘主体之间可以360度旋转,而在使用过程中不影响数据的传输,这样做的好处是:主要解决了在u 盘的使用过程中,由于不小心绊掉U盘或者是使U盘插头与U盘主体发生断裂,以至于数据的传输被中断,影响到工作;本实用新型结构简单,使用灵活,变化自如,占用空间小,且有经济实用性。

1.一种自由旋转U盘,其特征在于:U盘插头与U盘主体之间可以360度自由旋转,在使用过程中不会影响到数据的传输。

2.一种自由旋转U盘,其特征在于:由于U盘主体与U盘插头之间是由凹面与球面连接在一起的,所以在使用过程中可以因USB插口周围的空间限制,而随意将U盘主体旋转到其他方位。

说明书

自由旋转U盘

(一)技术领域

1.本实用新型涉及一种数据储存与数据连接装置,特别涉及一种自由旋转U盘。

(二)背景技术

说明书

2.U盘已是人们工作中使用较为广泛的数据存储产品,尤其是随着电脑办公自动化的进程加快,工作信息量的加大,U盘的使用更加频繁与广泛。由于办公自动化工作信息量大,工作紧张,工作压力大,不可避免的就会使得U盘在使用过程中绊到U或是使U盘插头与主体发生断裂。

3.现有的自由旋转U盘由于形状所限,U盘连接USB插头的过程中,由于占用空间较大,使得无论是左右旋转还是体积小的都不能避免U盘被绊到的尴尬。

(三)发明内容

4.本实用新型为弥补现有技术的不足,提供了一种结构简单,使用方便的自由旋转U盘

5.本实用新型是通过如下技术方案实现的:

6.一种自由旋转U盘,包括自由旋转的U盘插头以及U盘主体(带有凹型沟槽),两者之间的联系采用凸球型与凹球型相连,由于U盘的数据传输是双线制,所以在凸与凹两球型都是由橡胶圈分开的,凹型沟槽的作用主要解决插头左右旋转时,左右壳体的阻挡,总之就算旋转也不会阻断数据的传输,具体模型见附录图。

7. 本实用新型结构简单,使用方便,使用灵活自如,占用空间小,适用范围广泛,且有经济实用

(四)附图说明

为了方便观察因此把主体与插头分离绘图实用新型两者是一体的。图1

图中箭头方向表示橡胶圈用于分割两线制。图2

(五)附录图

图1

说明书

U盘枚举(自己总结) 篇5

直接拔出

安全拔出

A9枚举

Linux USB gadget设备驱动解析(2)---驱动调试 作者:刘洪涛, 华清远见嵌入式学院金牌讲师。

这一节主要把在实现“linuxU盘功能”过程中的一些调试过程记录下来,并加以解析。

一、背景知识

1、USB Mass Storage类规范概述

USB 组织在universal Serial Bus Mass Storage Class Spaceification 1.1版本中定义了海量存储设备类(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 文件系统操作的具体细节。

USB(Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这 些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是USB 设备正常工作的先决条件。

Linux-2.6.26内核中在利用USB gadget驱动实现模拟U盘时主要涉及到file_storage.c、s3c2410_udc.c等驱动文件(这些文件的具体结构,将在下一篇文章中 描述)。此时我们想先从这些代码中找到USB描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:

其中,bInteaceClass、bInterfaceSubClass、bInterfaceProtocol可以判断出设备是否是存储类,以及属于哪种存储子类和存储介质的操作命令。在file_storage.c文件中,/* USB protocol value = the transport method */ #define USB_PR_CBI 0x00 // Control/Bulk/Interrupt #define USB_PR_CB 0x01 // Control/Bulk w/o interrupt #define USB_PR_BULK 0x50 // Bulk-only /* USB subclass value = the protocol encapsulation */ #define USB_SC_RBC 0x01 // Reduced Block Commands(flash)#define USB_SC_8020 0x02 // SFF-8020i, MMC-2, ATAPI(CD-ROM)#define USB_SC_QIC 0x03 // QIC-157(tape)#define USB_SC_UFI 0x04 // UFI(floppy)#define USB_SC_8070 0x05 // SFF-8070i(removable)#define USB_SC_SCSI 0x06 // Transparent SCSI 默认的情况是:

mod_data = { // Default values.transport_parm = “BBB”,.protocol_parm = “SCSI”, „„

默认的赋值如下:

bInterfaceClass=08 表示:存储类

bInterfaceSubClass=0x06 表示:透明的SCSI指令 bInterfaceProtocol=0x50 表示:bulk-only 传输

2、Bulk-Only 传输协议

下面看看Bulk-Only 传输协议:(详细的规范请阅读《Universal Serial BusMass Storage ClassBulk-Only Transport》)

设 备插入到USB 后,USB 即对设备进行搜索,并要求设备提供相应的描述符。在USBHost 得到上述描述符后,即完成了设备的配置,识别出为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 设备所执行的操

作可用下图描述:

CBW的格式如下:

dCBWSignature:

CBW的标识,固定值:43425355h(little endian)。dCBWTag:

主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关联CSW到对应的CBW。dCBWDataTransferLength:

本次CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。bmCBWFlags:

反映数据传输的方向,0 表示来自Host,1 表示发至Host; bCBWLUN:

对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写0。

bCBWCBLength:

命令的长度,范围在0~16.CBWCB:

传输的具体命令,符合bInterfaceSubClass.中定义的命令规范,此处是SCSI CSW命令格式如下:

dCSWSignature:

CSW的标识,固定值:53425355h(little endian)dCSWTag:

设置这个标识和CBW中的dCBWTag一致,参照上面关于dCBWTag的解释 dCSWDataResidue:

还需要传送的数据,此数据根据dCBWDataTransferLength-本次已经传送的数据得到

bCSWStatus:

指示命令的执行状态。如果命令正确执行,bCSWStatus 返回0 即可。

3、SCSI指令集

Bulk-Only 的CBW 中的CBWCB 中的内容即为如下格式的命令块描述符(Command Block Descriptor)。SCSI-2 有三种字长的命令,6 字节、10字节和12字节,Microsoft Windows 环境下支持12 字节长的命令。

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协议只用到了其中的一些。更多的SCSI指令参见:http://en.wikipedia.org/wiki/SCSI_command 指令代码 指令名称 说明

04h Format Unit 格式化存储单元 12h Inquiry 索取器件信息 1Bh Start/Stop load/unload 55h Mode select 允许Host对外部设备设置参数。5Ah Mode Sense 向host传输参数 Eh Prevent/Allow Medium Removal 写保护

>28h Read(10)Host读存储介质中的二进制数据 A8h Read(12)同上,不过比较详细一点 25h Read Capacity 要求设备返回当前容量

23h Read Format Capacity 查询当前容量及可用空间 03h Request Sense 请求设备向主机返回执行结果,及状态数据

01h Rexero Unit 返回零轨道 2Bh Seek(10)为设备分配到特定地址 1Dh Send Diagnostic 执行固件复位并执行诊断

00h Test Unit Ready 请求设备报告是否处于Ready状态 2Fh Verify 在存储中验证数据

2Ah Write(10)从主机向介质写二进制数据 AAh Write(12)同上,不过比较详细 2Eh Write and Verify 写二进制数据并验证

对于不同的命令,其命令块描述符略有不同,其要求的返回内容也有所不同,根据相 应的文档,可以对每种请求作出适当的回应。比如,下面是INQUIRY 请求的命令块描述符和其返回内容的数据格式:如:INQUIRY 命令描述符:

返回数据格式

Host 会依次发出INQUIRY、Read Capacity、UFI Mode Sense 请求,如果上述请求的返回结果都正确,则Host 会发出READ 命令,读取文件系统0 簇0 扇区的MBR 数据,进入文件系统识别阶段。

4、利用USB View观察结果

可通过USB View软件查看到USB设置阶段获取到的信息。

二、出现的主要问题

在调试过程中遇到了一个问题。现象是:在目标板加载完驱动后,即执行完: # insmod g_file_storage.ko file=“/dev/mtdblock2” stall=“0” removable=“1” 后,接好USB线。此时在windows端设备出有usb storage设备加入,但出现不了盘符。

下面记录下调试过程。

三、调试过程

根据规范,当完成SCSI指令集中Inquiry 命令时,可以出现盘符。所以可以通过bushound软件查看通讯过程,找出原因。下面是利用bushound工具在出现问题时采集到的数据。

Dev Phase Data Info Time Cmd.Phase.Ofs------------------------------------26 CTL 80 06 00 0100 00 00 1012 03 01 02........%.......4.8ms 1.2.0 03 01..1.2.16 26 CTL 80 06 00 0201 01 04 c000 00 20 00 GET DESCRIPTR 16us 3.1.0 26 DI 09 02 20 0001 09 04 0081 02 40 0002 40 00 00 P.....@......@..3.2.16 26 CTL 80 06 00 0301 01 04 c000 00 04 00 GET DESCRIPTR 15us 5.1.0 26 DI 04 03 09 04....3.9ms 6.1.0 26 CTL 80 06 03 0309 04 1a 00 GET DESCRIPTR 18us 7.1.0 26 DI 1a 03 33 0030 00 34 0037 00 37 0000 00 00 00 SET CONFIG 16us 8.1.0 26 CTL 01 0b 00 0000 00 01 00 CLASS 62ms 10.1.0 26 DI 00.3.9ms 10.2.0 26 DO 55 53 42 4324 00 00 0000 00 00 0000 00 00...$...........11.1.16 26 DI 00 80 02 024c 69 6e 752d 53 74 6f64 67 65 74 File-Stor Gadget 12.1.16 30 33 31 32 0312 12.1.32 26 CTL 80 06 00 0201 01 04 c000 02 08 06...............4.1ms 13.2.0 50 05 07 0500 07 05 0200 00 20 00 GET DESCRIPTR 2.7sc 14.1.0 26 DI 09 02 20 0001 09 04 0081 02 40 0002 40 00 00 P.....@......@..14.2.16 26 USTS 05 00 00 c0 no response 2.8sc 15.1.0 注意上面红色部分的代码,DO发出了55 53 42 43开 始的CBW命令块,命令码是12,即Inquiry命令。要求目标返回Inquiry命令要求的数据,长度是0x24。接下来设备端通过DI返回了设备信 息。按照规范,在返回完了数据后,设备端还应该通过DI向系统返回CSW的值。但实际的捕获内容并没有。所以导致不能正确出现盘符。

在file_storage.c中,发送数据时都会调用到start_transfer()函数。在此函数中加入printk调试语句,观察现象。发现只要加入的调试语句,windows端就能够正常设别设备了。于是,可以猜测是因为需要在连续 两次发送之间加上一些延时。在函数中加入udelay(800)后,windows系统可以正常发现设备了。具体的代码架构,将在下一遍文章中解析。下面是程序正常后,用bushound捕获到的数据。

红色部分,可以看出设备正确的按照规范在发送完数据后,返回CSW信息。

四、总结做好USB gadget驱动、或者USB host驱动调试需要: ·掌握一定的知识基础

包括:USB协议、具体的类设备规范、USB驱动程序架构、USB设备端控制器操作等。·合理利用调试工具。

包括:USB view、bushound、及一些硬件USB信号分析仪。

一、追踪USB大容量设备的实现流程

1、从main.c开始

(1)main函数的执行流程

Set_System();//设置时钟、端口等。

Set_USBClock();//设置usb的时钟

USB_Interrupts_Config();//设置中断

Led_Config();//设置所使用的到的灯。

MSD_Init();//SD卡初始化

Get_Medium_Characteristics();//获取SD块总数、每块字节数。

USB_Init();//USB_init.c提供的初始化函数。从这里开始USB设备被主机检测到。

while(1)

{ //USB的工作都是在中断中完成的,主执行流程什么也没做。

}

(2)与鼠标例程不同的地方

在中断配置中,使能了USB高优先级中断。

NVIC_InitStructure.NVIC_IRQChannel= USB_HP_CAN_TX_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

用到了几个灯指示,这个我的开发板上用不到,就不详细看了。

MSD_Init(),是对SD卡进行初始化。该函数在msd.c中,我看了一下它的SD卡实现的代码,比我的SD函数代码齐整多了。以后有时间要把我的USB驱动好好的整理一下。不过现在就先不管了。

接下来这个函数获取SD卡的容量,这样的函数我在SD卡驱动中也实现了,改变一下调用方式就行了。

USB_Init()函数在usb_init.c库函数中,但它最终会调用user_prop.c宏的用户初始化例程。下面就追踪进去看一看。

(3)大容量存储设备的初始化

void MASS_init()

{ pInformation->Current_Configuration = 0;

PowerOn();连接电缆主机很快发总线复位。

_SetISTR(0);

wInterrupt_Mask = IMR_MSK;

_SetCNTR(wInterrupt_Mask);开启复位和传输中断。

pInformation->Current_Feature = MASS_ConfigDescriptor[7];

while(pInformation->Current_Configuration == 0)

{

NOP_Process();

}

bDeviceState = CONFIGURED;//这句执行完成后,设备处于已配置状态。我先在这里加一句调试语句。

#if usb_debug

Uart_PutString(“设备已配置”);

#endif

}

2、进入复位中断

(1)先列出中断处理代码

发生总线复位中断以后,处理是在usb_prop.c的Mass_Reset()函数中完成的。

void MASS_Reset(){

Device_Info.Current_Configuration = 0;

SetBTABLE(BTABLE_ADDRESS);

SetEPType(ENDP0, EP_CONTROL);//端点0控制端点

SetEPTxStatus(ENDP0, EP_TX_NAK);//不响应IN

SetEPRxAddr(ENDP0, ENDP0_RXADDR);//设置接收缓冲区(OUT)

SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);接收长度。

SetEPTxAddr(ENDP0, ENDP0_TXADDR);//发送缓冲区(IN)

Clear_Status_Out(ENDP0);

SetEPRxValid(ENDP0);//使能端点0的接收。

SetEPType(ENDP1, EP_BULK);//端点1批量模式

SetEPTxAddr(ENDP1, ENDP1_TXADDR);//设置发送缓冲区(IN)

SetEPTxStatus(ENDP1, EP_TX_NAK);发送不响应。

SetEPRxStatus(ENDP1, EP_RX_DIS);//接收无效。对OUT无效

SetEPType(ENDP2, EP_BULK);//端点2批量模式

SetEPRxAddr(ENDP2, ENDP2_RXADDR);//设置接收缓冲区OUT

SetEPRxCount(ENDP2, Device_Property.MaxPacketSize);

SetEPRxStatus(ENDP2, EP_RX_VALID);

SetEPTxStatus(ENDP2, EP_TX_DIS);//发送无效,对IN无效

SetDeviceAddress(0);//使能USB接口模块。

CBW.dSignature = BOT_CBW_SIGNATURE;

Bot_State = BOT_IDLE;//命令状态机初始化为空闲状态

}

在这里没有我没有看到将批量端点设置为双缓冲模式的迹象,难道这个例程没有用它?

3、进入枚举过程

因为在鼠标例程中已经详细分析过枚举过程,这里主要是大容量设备枚举过程中不同的地方做一下分析。

(1)获取设备描述符、设置地址。

(2)获取配置描述符

(3)获取配置描述符集合,这里主要讲接口描述符分析一下。

0x09, /* bLength: Interface Descriptor size */

0x04, /* bDescriptorType: */

0x00, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x02, /* bNumEndpoints*/ 使用两个端点

0x08, /* bInterfaceClass: MASS STORAGE Class,大容量存储类 */

0x06, /* bInterfaceSubClass : SCSI transparent,SCSI传输*/

0x50, /* nInterfaceProtocol,仅批量传输*/ 4, /* iInterface: */

(4)获取字符串描述符

(5)类请求实现:

类获取逻辑盘:

一般返回0

类请求复位:

ClearDTOG_TX(ENDP1);

ClearDTOG_RX(ENDP2);

CBW.dSignature = BOT_CBW_SIGNATURE;

Bot_State = BOT_IDLE;

(6)设置配置

在用户设置的回调函数中,又调用

void Mass_Storage_SetConfiguration(void)

{

if(pInformation->Current_Configuration)

{

ClearDTOG_TX(ENDP1);

ClearDTOG_RX(ENDP2);

Bot_State = BOT_IDLE;}

} 这个工作前面已经做过了。

4、主机发命令INQUIRY

(1)首先进入批量输出中断

该中断的回调函数调用Mass_Storage_Out()进行处理。

(2)追踪进入Mass_Storage_Out()

void Mass_Storage_Out(void)

{

u8 CMD;

CMD = CBW.CB[0];//

Data_Len = GetEPRxCount(ENDP2);

PMAToUserBufferCopy(Bulk_Data_Buff,ENDP2_RXADDR, Data_Len);

switch(Bot_State)

{

case BOT_IDLE:

CBW_Decode();//第一次收到命令肯定调用这个解码函数。

break;//它的作用应该是填充CBW命令块封包结构

case BOT_DATA_OUT:

if(CMD == SCSI_WRITE10)

{

SCSI_Write10_Cmd();

break;

}

}

(3)追踪进入CBW_Decode()

这个函数的代码较长,我就不列举在这里了,我就分析一下本次的主要工作。

首先将用户缓冲区的数据复制到命令封包结构里面。

然后准备好状态封包结构:

CSW.dTag = CBW.dTag;//这个标志由主机生成,可以用于检查设备是否正确收到该命令。

CSW.dDataResidue = CBW.dDataLength;

然后主要是根据命令操作码,调用相应的SCSI命令处理函数。

switch(CBW.CB[0])

{

case SCSI_REQUEST_SENSE:

SCSI_RequestSense_Cmd();

break;

case SCSI_INQUIRY:

SCSI_Inquiry_Cmd();

break;

我这里就列出了两项,实际的命令是很多的。本次主要是查询处理。

(4)追踪进入SCSI_Inquiry_Cmd()

以上函数是在usb_bot.c里面,现在跳转到usb_scsi.c里面。

这个函数的主要工作是调用Transfer_Data_Request(Inquiry_Data, Inquiry_Data_Length)来完成。

这个Inquiry_Data = Standard_Inquiry_Data,后面这个Standard_Inquiry_Data是scsi_data.c里面定义的一个数据结构,专门用于inquiry命令的返回。

u8 Standard_Inquiry_Data[] =

{

0x00, /* Direct Access Device */

0x80, /* RMB = 1: Removable Medium */

0x02, /* Version: No conformance claim to standard */

0x02, //这里圈圈的书上说应该为 0x01

36BULK_MAX_PACKET_SIZE;

Block_offset = BULK_MAX_PACKET_SIZE;

}

else

{

UserToPMABufferCopy(Data_Buffer + Block_offset, ENDP1_TXADDR, BULK_MAX_PACKET_SIZE);

Block_Read_count-= BULK_MAX_PACKET_SIZE;

Block_offset += BULK_MAX_PACKET_SIZE;

}

SetEPTxCount(ENDP1, BULK_MAX_PACKET_SIZE);SetEPTxStatus(ENDP1, EP_TX_VALID);

Memory_Offset += BULK_MAX_PACKET_SIZE;

Transfer_Length-= BULK_MAX_PACKET_SIZE;//剩下的需要传输的字节数。

CSW.dDataResidue-= BULK_MAX_PACKET_SIZE;

Led_RW_ON();

}

这里不清楚的是主机是一次把512字节读完,还是每次发一个命令读取64字节。我觉得应该是发一次读命令,8次“IN”读取一个扇区,再发一个“IN”读取命令状态封包。

8、写命令WRITE(10)

这个命令的处理过程跟读命令的处理差不多,只是最后它会调用Write_Memory()进行处理。

i = 0;

for(;Counter < temp;Counter++)

{

Data_Buffer[Counter] = Bulk_Data_Buff[i];

i++;

}

从接受缓冲区得到的数据总是先放到用户缓冲区,这个缓冲区有512个字节。

if(!(Transfer_Length % 512))

{

Counter = 0;

MSD_WriteBlock(Data_Buffer, Memory_OffsetInquiry之后会发出ReadFormatCapacity命令,这个命令在SCSI规范中是“厂家自定义命令”,可以参考UFI命令集文档(实际上,U盘所使用的所有SCSI命令集都可以参考UFI文档,它比SCSI标准文档更简洁明了)。注意这个命令在BusHound里是没有描述的,必须在“Device”选项页里勾选上这个U盘所对应的USB Mass Storage Device这个节点,才能看到这个命令的数据流。

-ReadFormatCapacity之后会发出ReadCapacity命令。

-U盘读数据(读扇区)时会发送Read(10)。ReadCapacity完成后就会发送Read(10)读取U盘的第一个扇区。

-U盘写数据时(写扇区)会发送Write(10)。

-TestUnitReady会在无其他数据传输时会定时发送,如果设备没有回应成功的CSW给主机,则主机认为设备已不存在。此时如果再双击磁盘图标,Windows会提示“请插入磁盘”。RequestSense:如果CSW指示此次传输不成功,那么主机会发出此请求。ModeSense6/10这两个命令可以不支持(不支持不代表不反应,任何一个命令你都要做出反应,对于不支持的命令,可以通过STALL握手来向主机表明),暂时也未遇到过什么异常情况,而且我查看过一些U盘,有相当一部分就是随便回了几个数据给主机。这两个命令只会在U盘插入后发送一次,此后不再发送。

U盘开发的几点体会

如果你开发过USB相关项目,理解USB的一些基本概念,例如设备描述符、配置描述符、子类规范等,那么开发U盘只要概念清晰应该不难。以下是我开发过程中的几个相关步骤:

       保证USB 芯片正常工作,用其他USB成功项目验证硬件连接及固件的正确性

按Mass Storage协议 Bulk-Only 模式提供描述符,使PC 机控制面板上设备类型出现Mass Storage Device 响应SCSI指令集中Inquiry 命令,可以出现盘符 实现FAT16文件系统

处理SCSI命令集中READ命令及其他UFI命令,可以访问盘符 处理SCSI命令集中WRITE命令 U盘开发成功

开发U盘有三个工具软件应该必备:USBVIEW 察看设备描述符,端点测试等;BUSHOUND 截取USB总线数据,可分析UFI命令及U盘返回的数据流;串口助手可实时了解U盘所收命令流及程序流程由于每个人知识面不同,我想实现上面的几个步骤遇到的问题也不一样。对我最大的困惑是实现FAT16文件系统,直到在微软网站找到它的白皮书才算解惑。这里简介一下方便大家有的放矢。USB 组织定义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个独立的子类规范,即:

1.USB Mass Storage Class Control/Bulk/Interrupt(CBI)Transport 2.USBMass 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 移动存储。

Windows95 OSR2和Windows 98开始支持FAT32 文件系统,它是对早期DOS的FAT16文件系统的增强,由于文件系统的核心--文件分配表FAT由16位扩充为32位,所以称为FAT32文件系统。在一逻辑盘(硬盘的一分区)超过 512 兆字节时使用这种格式,会更高效地存储数据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此是使用大容量硬盘存储文件的极有效的系统。本人对Windows 98下的FAT32 文件系统做了分析实验,总体上与FAT16文件系统变化不大,现将有关变化部分简介如下:

(一)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。

(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。

(三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过FAT实现的,FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。

从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。

(四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,可以用一簇对应16个扇区,依此类推。FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法使用。显然,对于容量大于512MB的逻辑盘,采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。

但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。

另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则使用时其有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用FDISK等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有的系统将1MB理解为1000000B,1000KB等),及每个分区需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。

(五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。

(六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义,全部32字节的定义如下:

(1)0--7字节 文件正名。(2)8--10字节 文件扩展名。

(3)11字节 文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。

(4)12--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。(5)14--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。

(6)16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。

(7)18--19字节 16位二进制的文件最新访问日期,定义同(6)。(8)20--21字节 起始簇号的高16位。

(9)22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。

(10)24--25字节 16位二进制的文件最新修改日期,定义同(6)。(11)26--27字节 起始簇号的低16位。(12)28--31字节 32位的文件字节长度。

其中第(4)至(8)项为以后陆续定义的。对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。

(七)以前版本的 Windows 和DOS与 FAT32 不兼容,不能识别FAT32分区,有些程序也依赖于 FAT16文件系统,不能和 FAT32 驱动器一道工作。将硬盘转换为 FAT32,就不能再用双引导运行以前版本的Windows(Windows 95 [Version 4.00.950]、Windows NT 3.x、Windows NT 4.0 和 Windows 3.x)。

磁盘结构综述 1.硬盘结构

U盘管理制度(模版) 篇6

U盘管理制度(申购书)

因U盘寿命与读写次数相关,鉴于于机房U盘使用频率比较高,导致机房U盘在三个月内损坏返修达到50%以上,六个月内损耗至无法使用的U盘达到30%以上,并伴随着出现U盘保管不当等带来的损失以及同步带来故障处理延时的现象。

为提高U盘使用时效,解决因U盘导致故障延迟现象,以及提高U盘保管使用的责任心降低丢损率、降低采购成本,现申请配备运维人手一个USB3.0 16G U盘(70~80元不需量产功能),制作PE启动系统,处理ghost恢复系统类等多数故障。将现有的7个带读写锁的U盘(160元左右),由于量产、烧录简单,统一用于Linux、Win2008等需要用虚拟光驱安装的系统。相关管理办法如下:

1、个人在仓管处签字领取带唯一编号的配备U盘,并个人自由保管,担负丢损责任。

2、现有带读写锁的7个U盘,由现场主管保管,换班时清点移交。

3、现场主管每周负责给队员的U盘杀毒,最少2次。

4、个人配备U盘属公司财产,请爱护使用,正确插拔。

5、个人配备U盘签字领取后,使用权归个人,产权归公司。丢失、损坏处理方法如下:

1)自领取日起,半年内丢失,由个人赔偿80%的购买费用,半年至一年丢失,由个人赔偿60%的购买费用;

广东锐讯网络有限公司

2)自领取日起,半年内损坏,由个人赔偿60%修复或者另购的费用,半年至一年损坏,由个人赔偿修复或者另购的费用30%,损坏需要提供损坏的可识别的U盘;

3)U盘官方保修1年,属于店家承认保修范围内损坏,由公司负责保修流程及产生的费用;

4)中途调岗、离职需将U盘完好归还公司运维中心。

5)一年以后还能正常使用的U盘将奖励予保管人留念,鼓励其爱惜工具;

德顺机房运维中心

U盘启动菜单文件详解 篇7

title Boot From DOS Toolkit----定义菜单名称

map --floppies=2---- (定义仿真磁盘数)

map --hook---- (使仿真生效)

#kernel (cd)/BOOT/GRUB/MEMDISK.GZ c=60 h=8 s=36 floppy----指定memdisk内核(现在基本上很少有人用了,所以已经将该命令注释掉,可以直接将该行删除)

#initrd (cd)/BOOT/DOS98.IMG c=60 h=8 s=36 floppy---- (memdisk引导img镜像功能,对于大于2.88M的非标准镜像,必须指定CHS参数,这就是memdisk被藐视的原因,因为grub4dos自带的map --mem就不需要CHS参数,比较方便, 这一行也是被注释掉了的,无用)

map --mem (cd)/BOOT/DOS98.IMG (fd0) ---- (grub4dos自带的仿真功能,将dos98.img仿真成软盘0)

map (fd0) (fd1)---- (将软盘0仿真成软盘1, 这是为了当系统存在物理软驱,或者U盘以zip方式启动后, 可以访问物理软驱和U盘, 以盘符B:来访问)

chainloader (fd0)+1---- (从软驱0(其实是img仿真的,非物理软驱0)的第一扇区启动)

rootnoverify (fd0)---- (设置根为软驱0)

boot---- (启动系统)

启动基于DOS的镜像都是上面的步骤

因为IMG是软盘镜像,所以仿真成FD0

如果是基于硬盘的镜像,像mini win98的img

上一篇:中继不可信下一篇:任务型教学法任务设计