usb总线
描述符
设备/配置/接口/端点描述符;usb设备驱动是指接口驱动,即一个接口对应一个驱动
通信格式
USB总线上传输的数据是以包为基本单位的,一个包被分为不同的域,根据不同类型的包所包含的域是不一样的。不同的包有一个共同点,都要以同步域开始,紧跟着一个包标识符PID,最终以包结束符EOP结束这个包。
同步域
用来告诉USB串行接口引擎数据要开始传输了,请做好准备。对于全速设备,同步域使用00000001作为信号
包标识符PID
用来标识一个包的类型,总共有8位,其中USB协议使用的只有4位(PID0~PID3),另外4位(PID4~PID7是PID0~PID3的取反,用来校验PID。
控制传输
是双向传输,数据量通常较小,USB系统软件用来主要进行查询,配置和给USB设备发送通用的命令
同步传输
提供了确定的带宽和间隔时间(latency),它被用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传输率的即时应用中,例如执行即时通话的网络电话应用时,使用同步传输模式是很好的选择
中断传输
主要用于定时查询设备是否有中断数据要传输设备的端点模式器的结构决定了它的查询频率,从1到255ms之间,这种传输方式典型的应用在少量的分散的,不可预测数据的传输,键盘,操纵杆和鼠标就属于这一类型中断方式传输是单向的并且对于host来说只有输入的方式
批量传输
主要应用在数据大量传输传输和接受数据上,同时又没有带宽和间隔时间要求的情况下,要求保证传输,打印机和扫描仪属于这种类型,这种类型的设备适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传输完成之后再传输和接收数据。
设备状态
连接:usb设备连接到总线
上电:总线电源/自给电源
默认:上电后不响应总线,直到总线收到复位信号后,用默认的地址可以对设备寻址
地址:每一设备在连接或复位后由主机分配一个唯一的地址
配置:设备使用前需配置
挂起:设备在探测不到总线传输时进入中止状态,并保持自身地址和配置
枚举过程
设备插入端口,hub检测各个端口的D+/D-的电压判断是何种速度的设备,并返回给主机,主机得知新设备连上后等待100ms,发出Set_Port_Feature请求让hub复位刚插上设备的端口(hub驱动D+/D-都为低电平),主机继续向hub发送Get_Port_Status以查询是否复位成功,当hub撤销复位信号,设备处于默认状态,地址为0;主机发送Get_Descriptor获取默认管道的最大包长度,系统会要求hub再复位一次,主机通过Set_Address向设备分配一个地址,进入地址状态,主机发送Get_Descriptor读取设备描述符,并详细解析并读取配置/接口/端点描述符等;通过device_add将设备加入到usb总线并match驱动,匹配后调用device_bind_driver并将控制权交给设备驱动;驱动发送Set_Configuration来确定选择设备的那个配置来工作
控制器驱动
usb设备驱动
总线模型
usb_device;usb_driver;usb_bus;usb_register(struct usb_driver *new_driver);正如同mipi相机的i2c设备驱动注册的i2c_driver的probe会注册v4l2子设备;tftlcd的spi的probe会注册framebuffer,usb设备驱动的probe会注册字符设备/tty设备/块设备/输入设备
urb
是设备驱动中用来跟usb设备通信的基本载体,设备中的每个端点都处理一个urb队列。处理流程为:被设备驱动创建/初始化并被安排给一个特定usb设备的特定端口/被设备驱动提交给usb核心(usb_submit_urb)
Gadget驱动
Function驱动
填充usb_interface_descriptor,usb_endpoint_descriptor合成一些usb_descriptor_header,并实现usb_function的成员函数,最后通过usb_function_register(struct usb_function_driver *newf)注册Gadget Function;类似于主机侧的urb,gadget驱动用struct usb_request描述一次传输请求
Gadget Function API
使能禁止端点,分配释放usb_request,提交取消usb_request,端点fifo管理,端点自动配置
Function驱动注册,udc驱动注册
udc驱动
封装usb设备控制器usb_gadget,填充每个端点usb_ep,实现usb_gadget_ops和usb_ep_ops并通过usb_add_gadget_udc(struct device *parent,struct usb_gadget *gadget)来注册一个udc;
usb_gadget
usb_gadget_ops
usb_ep
usb_ep_ops
调试
usbmon抓包软件