1. bus/dev/drv 模型
usb 接口是逻辑上的 usb 设备 ,编写的 usb_driver 驱动程序,支持的是usb 接口:
usb 控制器或 hub 识别出 usb 设备后,会创建、注册 usb_deviceusb_device 被driversusbcoregeneric.c 驱动认领后,会选择、设置某个配置这个配置下面的接口,都会分配、设置、注册一个 usb_interface左边的 usb_driver 和右边的 usb_interface 如果匹配,则调用 usb_driver.probe2. 接口函数在 usb 设备驱动程序中,能使用的 usb 函数都在这个头文件里:includelinuxusb.h。
2.1 pipe使用这些接口函数的主要目的是传输数据,传输数据的对象是 usb 设备里的某个 endpoint,这被称为 pipe:
/* create various pipes... */#define usb_sndctrlpipe(dev, endpoint) ((pipe_control < < 30) | __create_pipe(dev, endpoint))#define usb_rcvctrlpipe(dev, endpoint) ((pipe_control < < 30) | __create_pipe(dev, endpoint) | usb_dir_in)#define usb_sndisocpipe(dev, endpoint) ((pipe_isochronous < < 30) | __create_pipe(dev, endpoint))#define usb_rcvisocpipe(dev, endpoint) ((pipe_isochronous < < 30) | __create_pipe(dev, endpoint) | usb_dir_in)#define usb_sndbulkpipe(dev, endpoint) ((pipe_bulk < < 30) | __create_pipe(dev, endpoint))#define usb_rcvbulkpipe(dev, endpoint) ((pipe_bulk < < 30) | __create_pipe(dev, endpoint) | usb_dir_in)#define usb_sndintpipe(dev, endpoint) ((pipe_interrupt < < 30) | __create_pipe(dev, endpoint))#define usb_rcvintpipe(dev, endpoint) ((pipe_interrupt < transfer_dma = dma address of buffer; // usb_alloc_coherent的输出参数urb- >transfer_flags |= urb_no_transfer_dma_map;2.3.4 提交 urb构造好 urb 后,需要提交到 usb 系统里,才能启动传输。
int usb_submit_urb(struct urb *urb, gfp_t mem_flags);2.3.5 取消 urb已经提交的 urb,可以取消它,有 2 个函数:
usb_kill_urb:这是一个同步函数,它会等待 urb 结束usb_unlink_urb:这是一个异步函数,它不会等待 urb 结束,usb 控制器驱动会调用它的回调函数void usb_kill_urb(struct urb *urb);int usb_unlink_urb(struct urb *urb);
星空机器人发布无人机精准着陆系统SR-PV
安全阀怎么调压力
未来,每个人都可以在云上拥有一台超级电脑
CAN总线的位定时
流量计选型的五个方面和性能要求
Linux USB设备驱动模型查看
多方布局8K 超高清成为趋势
不给诺基亚6面子,旗舰诺8谁为它买单?
10个保护物联网设备安全的方法
一文知道压敏电阻的选用步骤
苹果生产的首批新iPhone手机,已交付给苹果美国总部
电力系统的组成
系统的消息循环
大屏旗舰手机荣耀Note10搭载着哪些黑科技?
基于Zynq SoC增强CCD图像传感器性能
微软Edge浏览器将推全新分享链接页面
第1部:RepRap社区的介绍
0glasses中标中国联通集团5G创新应用专区供应商
夏普拟联手鸿海 吃东芝存储器20%股权
区块链对于数据的意义在哪里