![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
USB驱动
王恺瑞
这个作者很懒,什么都没留下…
展开
-
USB 设备驱动之设备接入梳理(六)
话说上一章,介绍了host获取设备描述符的过程,主要的思路就是先获取9 bytes,从这9 bytes中获取配置描述符的长度,然后一次性获取全部的配置描述符,配置描述符其实是配置描述符信息 + 端口描述符信息的总和,在设备内存中的分布如下图所示。有些设备可能不只一个配置描述符(业界称之为:符合设备),也同样是这样的分布。 获取了配置描述符后,对其进行解析。static int usb_parse_configuration(struct usb_device *d...原创 2022-03-24 15:03:53 · 569 阅读 · 0 评论 -
USB 设备驱动之设备接入梳理(五)
继上一步获取到设备描述符之后,判断如果是HUB设备,则对其进行设置。 if (udev->descriptor.bDeviceClass == USB_CLASS_HUB && udev->bus_mA <= unit_load) { u16 devstat; status = usb_...原创 2021-05-20 16:13:58 · 842 阅读 · 0 评论 -
USB 设备驱动之设备接入梳理(四)
static inthub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1, int retry_counter){ struct usb_device *hdev = hub->hdev; struct usb_hcd *hcd = bus_to_hcd(hdev->bus); int retries, operations, retval, i; unsigned delay = H.原创 2020-12-20 12:01:08 · 984 阅读 · 0 评论 -
USB 设备驱动之设备接入梳理_hub_port_connect()函数(三)
hub_port_connect()函数断开该端口设备的连接。 if (udev) { if (hcd->usb_phy && !hdev->parent) usb_phy_notify_disconnect(hcd->usb_phy, udev->speed); usb_disconnect(&port_dev->child); }消除抖动,接入或拔出时,会有物理抖动,导致状态不稳定,所以需要消抖。if (!(po原创 2020-12-20 11:08:35 · 5317 阅读 · 1 评论 -
USB 设备驱动之设备接入梳理(二)
USB提供了一套自顶向下的识别方法,从hub_event出发,检查是否真的有端口发生了改变,如果坐实是port被触发了,则进入port_event。先去获取hub的状态if (hub_port_status(hub, port1, &portstatus, &portchange) < 0) return;最终也是调用get_port_stats()函数去获得想要的状态,hub也是一类usb设备,static int get_port_status(struct原创 2020-11-26 22:01:24 · 2559 阅读 · 0 评论 -
USB 设备驱动之设备接入梳理(一)
hub_event()的前世今生缘起 usb_hub_init()主要是注册驱动和创建工作队列注册hub驱动:if(usb_register(&hub_driver)<0){printk(KERN_ERR"%s:can'tregisterhubdriver\n",usbcore_name);return-1;}这里引入usb_driver 结构体,先看看hub是如何初始化的...原创 2020-11-25 22:27:19 · 1810 阅读 · 0 评论 -
USB设备的枚举过程分析——数据结构先行
USB枚举是host端为了配置(加载合适的驱动)device进行的一个重要配置,如果枚举成功,那么设备正常工作的可能性约为90%,是USB驱动程序中重要的一项配置。主要进行的操作就是获取配置描述符,解析配置描述符、解析端口描述符;简而言之就是从device端获取device性能和配置。 先介绍一下枚举过程中涉及的结构体和成员:第一个 usb 配置描述符struct usb_config_descriptor { __u8 bLength; ...原创 2020-11-23 23:41:44 · 580 阅读 · 0 评论 -
usb转串口——u_serial.c_2
将数据送到tty层,由tty继续处理,数据在req的buffer里面。static void gs_rx_push(unsigned long _port){ struct gs_port *port = (void *)_port; struct tty_struct *tty; struct list_head *queue = &port->read_queue; bool disconnect = false; bool do_push = fa...原创 2020-11-23 21:50:48 · 706 阅读 · 0 评论 -
usb转串口——u_serial.c_1
static int gs_buf_alloc(struct gs_buf *gb, unsigned size){ gb->buf_buf = kmalloc(size, GFP_KERNEL); if (gb->buf_buf == NULL) return -ENOMEM; gb->buf_size = size; gb->buf_put = gb->buf_buf; gb->buf_get = gb->buf_buf; return .原创 2020-11-19 23:31:57 · 743 阅读 · 0 评论