正文

Linux USB gadget设备驱动解析---驱动调试2009-12-29 16:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/liyutai/50453.html

分享到:

这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析。 一、背景知识     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描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。        存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:      其中,bInterfaceClass、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 传输 ......更多内容请点击查看原文:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/1746.html  

阅读(4739) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册