Linux-USB-gadget设备驱动_第1页
Linux-USB-gadget设备驱动_第2页
Linux-USB-gadget设备驱动_第3页
Linux-USB-gadget设备驱动_第4页
Linux-USB-gadget设备驱动_第5页
免费预览已结束,剩余46页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LinuxLinux usbusb gadgetgadget 驱动驱动 利用 Linux USB gadget 设备驱动可以实现一些比较有意思的功能 举两个例子 1 一个 嵌入式产品中的某个存储设备 或是一个存储设备的某个分区 可以作为一个 U 盘被 PC 设别 从而非常方便的完成文件交互 这个功能被广泛的应用于手机 数码相机等产品中 2 一个嵌入式设备通过 USB 连接到你的 PC 后 在你的 PC 端会出现一个新的网络连接 在嵌入式设备上也会有一个网卡设备 你可以配置它们的 IP 地址 并进行网络通讯 俗称 USBNET 所有 USB 通讯的设备端都有 usb device 程序 通常称它们为 usb 固件 在一些功能简单的 设备里 用一些专用的可编程 USB 控制器就可以了 而在一些运行了类似 linux 操作系统 的复杂的嵌入式系统中 要完成 usb device 程序 就会要求你不仅熟悉 usb device 控制 器的操作 还要熟悉操作系统的驱动架构 我想通过 功能体验 驱动调试 gadget 驱动结构分析 编写一个自己的 g adget 驱动 这 4 个方面解析 linux usb gadget 设备驱动的编写方法 一 linux 模拟 U 盘功能的实现 在硬件环境为华清远见的 fs2410 平台 软件环境为 linux 2 6 26 的 linux 系统上 实现 模拟 U 盘的功能 向内核添加代码 include include include 修改修改 arch arm mach s3c2410 mach smdk2410 carch arm mach s3c2410 mach smdk2410 c USB device 上拉电阻处理 static void smdk2410 udc pullupsmdk2410 udc pullup enum s3c2410 udc cmd e cmd u8 s3c2410 pullup info Pull up enable Pull up disable UDC reset in case of printk smdk2410 udc s n s3c2410 pullup info cmd s3c2410 gpio cfgpin S3C2410 GPG9 S3C2410 GPG9 OUTP switch cmd case S3C2410 UDC P ENABLE s3c2410 gpio setpin S3C2410 GPG9 1 set gpg9 output HIGH break case S3C2410 UDC P DISABLE s3c2410 gpio setpin S3C2410 GPG9 0 set gpg9 output LOW break case S3C2410 UDC P RESET FIXME break default break static struct s3c2410 udc mach info smdk2410 udc cfgsmdk2410 udc cfg initdata udc command smdk2410 udc pullup static struct platform device smdk2410 devices initdata static void init sdmk2410 init void u32 upll value set s3c2410fb info s3c24xx udc set platdata 初始化 s3c device sdi dev platform data Turn off suspend on both USB ports and switch the selectable USB port to USB device mode s3c2410 modify misccr S3C2410 MISCCR USBHOST S3C2410 MISCCR USBSUSPND0 S3C2410 MISCCR USBSUSPND1 0 x0 设置 USB 时钟 upll valueupll value 0 x780 x78 S3C2410 PLLCON MDIVSHIFT S3C2410 PLLCON MDIVSHIFT 0 x02 0 x02 S3C2410 PLLCON PDIVSHIFT S3C2410 PLLCON PDIVSHIFT 0 x03 0 x03 S3C2410 PLLCON SDIVSHIFT S3C2410 PLLCON SDIVSHIFT whilewhile upll value upll value readl S3C2410 UPLLCON readl S3C2410 UPLLCON writel upll value writel upll value S3C2410 UPLLCON S3C2410 UPLLCON udelay 20 udelay 20 修改修改 drivers usb gadget file storage cdrivers usb gadget file storage c static void start transfer struct fsg dev fsg struct usb ep ep struct usb request req int pbusy enum fsg buffer state state int rc udelay 800 udelay 800 配置内核支持 U 盘模拟 USB Gadget Support USB Peripheral Controller S3C2410 USB Device Controller S3C2410 USB Device Controller S3C2410 udc debug messages USB Gadget Drivers File backed Storage Gadget 3 编译内核 make zImage make modules 在目录 drivers usb gadget 下生成 g file storage ko 加载驱动 测试功能 利用前面的生成的内核 启动系统后 加载 g file storage ko insmod g file storage ko insmod g file storage ko file dev mtdblock2 stall 0 removable 1 0 03 USB usb gadget register driver g file storage 0 04 USB binding gadget driver g file storage 0 05 USB s3c2410 set selfpowered g file storage gadget File backed Storage Gadget version 20 October 2004 g file storage gadget Number of LUNs 1 g file storage gadget lun0 ro 0 file dev mtdblock3 0 06 USB udc enable called smdk2410 udc Pull up enable 连接设备到 windows windows 系统会自动设备到一个新的 U 盘加入 格式化 U 盘 存入文 件 卸载 U 盘后 在目标板上执行如下操作 mkdir mnt gadget mount t vfat dev mtdblock2 mnt gadget ls 可以看到 windows 存入 U 盘的文件 二 usbnet 功能的实现 配置内核支持 usbnet USB Gadget Support USB Peripheral Controller S3C2410 USB Device Controller S3C2410 USB Device Controller S3C2410 udc debug messages USB Gadget Drivers Ethernet Gadget with CDC Ethernet support RNDIS support 2 编译内核 make zImage make modules 在目录 drivers usb gadget 下生成 g ether ko 3 加载驱动 测试功能 利用前面的生成的内核 启动系统后 加载 g ether ko insmod g ether ko ifconfig usb0 192 168 1 120 usb0 Link encap Ethernet HWaddr 5E C5 F6 D4 2B 91 inet addr 192 168 1 120 Bcast 192 168 1 255 Mask 255 255 255 0 UP BROADCAST RUNNING MULTICAST MTU 1500 Metric 1 RX packets 253 errors 0 dropped 0 overruns 0 frame 0 TX packets 43 errors 0 dropped 0 overruns 0 carrier 0 collisions 0 txqueuelen 1000 RX bytes 35277 34 4 KiB TX bytes 10152 9 9 KiB 连接设备到 windows windows 系统会提示安装驱动 根据提示安装上 RNDIS 驱动 这个驱 动可以在网络上找到 此时 windows 会新生成一个网络连接 配置它的 ip 地址等信息 然 后就可以和目标系统通过 USB 实现网络通讯了 这一节主要把在实现 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 三种类型的端点进行数据 命令 状态传送 后两个子规范则定义了存储介质的操作命令 A TA 命令规范用于硬盘 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 sto rage c s3c2410 udc c 等驱动文件 这些文件的具体结构 将在下一篇文章中描述 此时我们想先从这些代码中找到 USB 描述描述符 从中确定使用的存储类规范 从而确定 协议 确定通讯协议是我们调试的基础 存储类规范是由接口描述符决定的 接口描述符各项的定义义如下 其中 bInterfaceClass bInterfaceSubClass bInterfaceProtocol 可以判断出设备 是否是存储类 以及属于哪种存储子类和存储介质的操作命令 在 file storage c 文件中 USB protocol value the transport method define USB PR CBI 0 x00 Control Bulk Interrupt define USB PR CB 0 x01 Control Bulk w o interrupt define USB PR BULK 0 x50 Bulk only USB subclass value the protocol encapsulation define USB SC RBC 0 x01 Reduced Block Commands flash define USB SC 8020 0 x02 SFF 8020i MMC 2 ATAPI CD ROM define USB SC QIC 0 x03 QIC 157 tape define USB SC UFI 0 x04 UFI floppy define USB SC 8070 0 x05 SFF 8070i removable define USB SC SCSI 0 x06 Transparent SCSI 默认的情况是 mod data Default value s transport parm BBB protocol parm SCSI 默认的赋值如下 bInterfaceClass 08 表示 存储类 bInterfaceSubClass 0 x06 表示 透明的 SCSI 指令 bInterfaceProtocol 0 x50 表示 bulk only 传输 2 Bulk Only 传输协议传输协议 下面看看 Bulk Only 传输协议 详细的规范请阅读 Universal Serial BusM ass Storage ClassBulk Only Transport 设备插入到 USB 后 USB 即对设备进行搜索 并要求设备提供相应的描述符 在 USBHost 得到上述描述符后 即完成了设备的配置 识别出为 Bulk Only 的 Mass Storag e 设备 然后即进入 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 dCBWSignature CBW 的标识 固定值 43425355h little endian dCBWTag dCBWTag 主机发送的一个命令块标识 设备需要原样作为 dCSWTag CSW 中的一部分 再发 送给 Host 主要用于关联 CSW 到对应的 CBW dCBWDataTransferLength dCBWDataTransferLength 本次 CBW 命令要求在命令与回应之间传输的字节数 如果为 0 则不传输数据 bmCBWFlags bmCBWFlags 反映数据传输的方向 0 表示来自 Host 1 表示发至 Host bCBWLUN bCBWLUN 对于有多个 LUN 逻辑单元的设备 用来选择具体目标 如果没有多个 LUN 则写 0 bCBWCBLength bCBWCBLength 命令的长度 范围在 0 16 CBWCB CBWCB 传输的具体命令 符合bInterfaceSubClass 中定义的命令规范 此处是 SCSI CSW 命令格式如下 dCSWSignature dCSWSignature CSW 的标识 固定值 53425355h little endian dCSWTag dCSWTag 设置这个标识和 CBW 中的 dCBWTag 一致 参照上面关于 dCBWTag 的解释 dCSWDataResidue dCSWDataResidue 还需要传送的数据 此数据根据 dCBWDataTransferLength 本次已经传送的数据 得到 bCSWStatus bCSWStatus 指示命令的执行状态 如果命令正确执行 bCSWStatus 返回 0 即可 3 SCSI 指令集指令集 Bulk Only 的 CBW 中的 CBWCB 中的内容即为如下格式的命令块描述符 Command Block De scriptor SCSI 2 有三种字长的命令 6 字节 10 字节和 12 字节 Microsoft Window s 环境下支持 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 命令时 可以出现盘符 所以可以通过 b ushound 软件查看通讯过程 找出原因 下面是利用 bushound 工具在出现问题时采集到的数据 Dev Phase Data Info Time Cmd Phase Ofs 26 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTR 0us 1 1 0 26 DI 12 01 10 01 00 00 00 10 25 05 a5 a4 12 03 01 02 4 8ms 1 2 0 03 01 1 2 16 26 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTR 14us 2 1 0 26 DI 09 02 20 00 01 01 04 c0 01 3 9ms 2 2 0 26 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTR 16us 3 1 0 26 DI 09 02 20 00 01 01 04 c0 01 09 04 00 00 02 08 06 4 9ms 3 2 0 50 05 07 05 81 02 40 00 00 07 05 02 02 40 00 00 P 3 2 16 26 CTL 80 06 00 03 00 00 02 00 GET DESCRIPTR 60us 4 1 0 26 DI 09 02 20 00 01 01 04 c0 01 3 9ms 2 2 0 26 DI 04 03 3 9ms 3 1 0 26 CTL 80 06 00 03 00 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 03 09 04 02 00 GET DESCRIPTR 10us 1 2 16 26 DI 1a 03 4 0ms 6 2 0 26 CTL 80 06 03 03 09 04 1a 00 GET DESCRIPTR 18us 7 1 0 26 DI 1a 03 33 00 37 00 32 00 30 00 34 00 31 00 37 00 3 7 2 0 4 1 7 4 9ms 7 2 0 35 00 36 00 37 00 37 00 35 00 5 6 7 7 5 7 2 16 26 CTL 00 09 01 00 00 00 00 00 SET CONFIG 16us 8 1 0 26 CTL 01 0b 00 00 00 00 00 00 SET INTERFACE 60ms 9 1 0 26 CTL a1 fe 00 00 00 00 01 00 CLASS 62ms 10 1 0 26 DI 00 3 9ms 10 2 0 26 DO 55 53 42 43 08 60 e0 86 24 00 00 00 80 00 06 12 US BC 985us 11 1 0 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 11 1 16 26 DI 00 80 02 02 1f 00 00 00 4c 69 6e 75 78 20 20 20 Linux 1 0ms 12 1 0 46 69 6c 65 2d 53 74 6f 72 20 47 61 64 67 65 74 File Stor Gadget 12 1 16 30 33 31 32 0312 12 1 32 26 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTR 893ms 13 1 0 26 DI 09 02 20 00 01 01 04 c0 01 09 04 00 00 02 08 06 4 1ms 13 2 0 50 05 07 05 81 02 40 00 00 07 05 02 02 40 00 00 P 13 2 16 26 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTR 2 7sc 14 1 0 26 DI 09 02 20 00 01 01 04 c0 01 09 04 00 00 02 08 06 4 4ms 14 2 0 50 05 07 05 81 02 40 00 00 07 05 02 02 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 即 I nquiry 命令 要求目标返回 Inquiry 命令要求的数据 长度是 0 x24 接下来设备端通过 D I 返回了设备信息 按照规范 在返回完了数据后 设备端还应该通过 DI 向系统返回 CSW 的值 但实际的捕获内容并没有 所以导致不能正确出现盘符 在 file storage cfile storage c 中 发送数据时都会调用到中 发送数据时都会调用到 start transfer 函数 在此函数 中加入 printk 调试语句 观察现象 发现只要加入的调试语句 windows 端就能够正常设 别设备了 于是 可以猜测是因为需要在连续两次发送之间加上一些延时 在函数中加入 udelay 800 后 windows 系统可以正常发现设备了 具体的代码架构 将在下一遍文章 中解析 下面是程序正常后 用 bushound 捕获到的数据 红色部分 可以看出设备正确的按照规范在发送完数据后 返回 CSW 信息 四 总结做好 USB gadget 驱动 或者 USB host 驱动调试需要 掌握一定的知识基础 包括 USB 协议 具体的类设备规范 USB 驱动程序架构 USB 设备端控制器操作 等 合理利用调试工具 包括 USB view bushound 及一些硬件 USB 信号分析仪 Linux USB 设备端驱动有两部分组成 一部分是 USB 设备控制器 USB Device Controller UDC 驱动 另一部分是硬件无关的功能驱动 如 鼠标 u 盘 usb 串口 usb 网络等 也可以分为 3 层的 分别是 Controller Drivers Gadget Drivers Upper Layers 大 概意思都差不多 一 控制器一 控制器 USB USB DeviceDevice Controller Controller UDC UDC 驱动驱动 Gadget 框架提出了一套标准 API 在底层 USB 设备控制器驱动则实现这一套 API 不 同的 UDC 需要不同的驱动 甚至基于同样的 UDC 的不同板子也需要进行代码修改 这一 层是硬件相关层 Linux 标准内核里支持各种主流 SOC 的 udc 驱动 如 S3C2410 PXA270 等 你可以通 过内核直接配置支持 你也可以通过修改它们获取更高的效率 如 s3c2410 uda c 中并 没有利用到控制器的 dma 功能 你可以根据需要修改它 要理解 UDC 驱动代码就必须对相应的硬件控制器熟悉 当然 如果你对此不感兴趣 或没 时间熟悉 也可以暂时跳过对硬件相关部分 本文也侧重于对软件结构的描述 不关心硬 件细节 下面给出在 UDC 驱动中涉及到的一些关键数据结构及 API 参考 s3c2410 uda c 1 关键的数据结构及 API gadget api 提供了 usb device controller 驱动和上层 gadget 驱动交互的接口 下面列 出一些关键的数据结构 struct usb gadget 代表一个 UDC 设备 readonly to gadget driver const struct usb gadget ops ops 设备的操作集 struct usb ep ep0 ep0 USB 协议中的端点 0 处理 setup 请求 struct list head ep list of usb ep 本设备支持的端点链表 enum usb device speed speed 如 USB SPEED LOW USB SPEED FULL 等 unsigned is dualspeed 1 支持 full high speed unsigned is otg 1 OTG 的特性 unsigned is a peripheral 1 当前是 A peripheral 而不是 A host unsigned b hnp enable 1 unsigned a hnp support 1 unsigned a alt hnp support 1 const char name struct device dev struct usb gadget driver 代表一个 gadget 设备 driver 如 file storage c 中的 fsg driver 又如 如 zero c 中的 zero driver char function 一个字符串 如 Gadget Zero enum usb device speed speed int bind struct usb gadget void unbind struct usb gadget int setup struct usb gadget const struct usb ctrlrequest void disconnect struct usb gadget void suspend struct usb gadget void resume struct usb gadget FIXME support safe rmmod struct device driver driver struct usb gadget ops 代表设备的操作集 int get frame struct usb gadget int wakeup struct usb gadget int set selfpowered struct usb gadget int is self powered nt vbus session struct usb gadget int is active int vbus draw struct usb gadget unsigned mA int pullup struct usb gadget int is on int ioctl struct usb gadget unsigned code unsigned long param struct usb ep 代表一个端点 void driver data const struct usb ep ops ops 端点的操作集 如上 struct list head ep list gadget 的所有 ep 的 list struct usb ep ops 表示端点的操作集 int queue struct usb ep ep struct usb request req gfp t gfp flags 将一个 usb request 提交给 endpoint 是数据传输的关键函数 struct usb request 表示一个传输的请求 这与 usb host 端的 urb 类似 void buf unsigned length dma addr t dma unsigned no interrupt 1 unsigned zero 1 unsigned short not ok 1 void complete struct usb ep ep struct usb request req void context struct list head list int status unsigned actual 上述结构中具体每项的含义可以参考 http tali admingilde org linux docbook gadge t 如 struct usb request 在 http tali admingilde org linux docbook gadget re02 html 中 NameName struct usb request describes one i o request SynopsisSynopsis struct usb request void buf unsigned length dma addr t dma unsigned no interrupt 1 unsigned zero 1 unsigned short not ok 1 void complete struct usb ep ep struct usb request req void context struct list head list int status unsigned actual MembersMembers buf Buffer used for data Always provide this some controllers only use PIO or don t use DMA for some endpoints length Length of that data dma DMA address corresponding to buf If you don t set this field and the usb controller needs one it is responsible for mapping and unmapping the buffer no interrupt If true hints that no completion irq is needed Helpful sometimes with d eep request queues that are handled directly by DMA controllers zero If true when writing data makes the last packet be short by adding a zero length packet as needed short not ok When reading data makes short packets be treated as errors queue stops advancing till cleanup complete Function called when request completes so this request and its buffer ma y be re used Reads terminate with a short packet or when the buffer f ills whichever comes first When writes terminate some data bytes will usuall y still be in flight often in a hardware fifo Errors for reads or writes stop the queue from advancing until the completion function returns so that any transfers invalidated by the error may first be dequeued context For use by the completion callback list For use by the gadget driver status Reports completion code zero or a negative errno Normally faults bloc k the transfer queue from advancing until the completion callback returns Code ESHUTDOWN indicates completion caused by device disconnect or whe n the driver disabled the endpoint actual Reports bytes transferred to from the buffer For reads OUT transfers this may be less than the requested length If the short not ok flag is set short reads are treated as errors even when status otherwise indicates suc cessful completion Note that for writes IN transfers some data bytes may still reside in a device side FIFO when the request is reported as complete DescriptionDescription These are allocated freed through the endpoint they re used with The hardware s driver can add extra per request data to the memory it returns whichoften avo ids separate memory allocations potential failures later when the request is queued Request flags affect request handling such as whether a zero length packet is written the zero flag whether a short read should be treated as anerror blocking request queue advance the short not ok flag or hinting that an interrupt is not required the no interrupt flag for use with deeprequest queues Bulk endpoints can use any size buffers and can also be used for interrupt tra nsfers interrupt only endpoints can be much less functional 2 为 USB gadget 功能驱动提供的注册 注销函数 EXPORT SYMBOL usb gadget unregister driver 注销一个 USB gadget 功能驱动 EXPORT SYMBOL usb gadget register driver 注册一个 USB gadget 功能驱动 二 二 USBUSB gadgetgadget 功能驱动功能驱动 如果内核已经支持了 SOC 的 UDC 驱动 很多时候 我们可以只关心这部分代码的编 写 那么我们如何编写出一个类似 usb 功能驱动呢 usb 功能驱动应该至少要实现如下功能 实现 USB 协议中端点 0 部分和具体功能相关的部分 UDC 驱动无法帮我们 完成的部分 如 USB REQ GET DESCRIPTOR USB REQ GET CONFIGURATION 等 完成了这个功能以后 USB 主机端系统就会设别出我们是一个什 么样的设备 实现数据交互功能 即如何实现向硬件控制器的端点发出读 写请求来完成数据交互 具体功能的实现如 如何实现一个 usb net 驱动 或是一个 usb storage 驱动 接下来以 zero c 为例 说明这 3 个方面是如何实现的 1 1 zerozero 设备介绍设备介绍 作为一个简单的 gadget 驱动 zero 的功能基于两个 BULK 端点实现了简单的输入输出功 能 它可以用作写新的 gadget 驱动的一个实例 两个 BULK 端点为一个 IN 端点 一个 OUT 端点 基于这两个 由底层提供的 端点 g zero 驱动实现了两个 configuration 第一个 configuration 提供了 sink source 功 能 两个端点一个负责输入 一个负责输出 其中输出的内容根据设置可以是全 0 也可 以是按照某种算法生成的数据 另一个 configuration 提供了 loopback 接口 IN 端点 负责把从 OUT 端点收到的数据反馈给 Host 2 2 zerozero 设备注册 注销设备注册 注销 static int init init void return usb gadget register driver

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论