编写USB传输程序需要遵循一定的步骤和结构,以下是一个基本的指南:
定义全局变量和注册USB驱动结构体
定义一个`usb_driver`结构体,并在入口函数中通过`usb_register()`函数进行注册。
实现USB驱动结构体的成员函数
myusb_mouseprobe:
分配一个`input_dev`结构体。
设置`input_dev`结构体,使其支持L、S、回车3个按键事件。
注册`input_dev`结构体。
进行硬件相关的操作,包括设置USB数据传输的三要素(端点、数据缓冲区、urb结构体)和初始化urb结构体以传输数据。
myusb_mousedisconnect:
在断开连接时释放资源。
myusb_mouseid_table:
定义鼠标设备的ID表。
处理USB中断
编写probe函数调用的鼠标中断函数,判断缓存区数据是否改变,若改变,则通过`input_event`上传鼠标事件。
使用DMA传输数据
如果硬件支持DMA,需要告诉urb结构体使用DMA缓冲区地址,并通过`usb_submit_urb()`提交urb。
处理传输完成和错误
在`usb_complete_t`类型的函数中,检查urb的状态,释放它,或者重新提交到另一个传输中去。
了解USB传输类型
USB传输分为控制传输和数据传输,每种传输与USB终结点类型(设备中的缓冲区)相关联。
选择合适的传输方式
根据设备类型和需求选择合适的传输方式,例如控制传输用于配置设备,批量传输用于大量数据传输,中断传输用于实时数据传输等。
示例代码