usb-serial-2 usb主机控制器驱动

2024-01-21 18:58

本文主要是介绍usb-serial-2 usb主机控制器驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux2.6.35 mx535

usbserial modem老是disconnect,分析一下usb主控制器驱动原理及linux下主机对设备的枚举过程。

硬件接口

Chapter 77
Universal Serial Bus Controller (USB)
架构图如下,共计4个主机控制器,使用host 1





hi3518的架构更简单一些,

对比一下:
和mx535一样,hi3518控制器和收发器phy之间使用utmi。
并且root hub位于控制器内部。mx535架构图上没体现出来。


通用usb枚举过程


几个概念

传输transfer的分类:
1.控制传输:对设备进行控制,使用控制端点进行传输,主要用在usb枚举时
2.等时传输:
3.中断传输:鼠标键盘等hid设备均是
4.批量传输:u盘

事务transaction的分类:
1.in
2.out
3.setup

包packet的分类:
1.setup(令牌)
2.data(数据)
3.ack(握手)


几个概念的关系:
传输由若干个事务组成,事务由若干个包组成,包又域组成。

usb枚举过程:
1.获取设备描述符
2.复位
3.设置地址
4.再次获取设备描述符
5.获取配置描述符
6.获取接口,端点描述符
7.获取字符串描述符
8.选择设备配置

每个传输由主机发起,在usb枚举时的各个动作都是由传输完成,大部分是一个传输即可完成:
1.获取设备描述符----使用一个控制传输
2.复位----使用一个reset包
3.设置地址----使用一个控制传输
4.再次获取设备描述符----使用一个控制传输
5.获取配置描述符----使用n个控制传输
6.获取接口,端点描述符----使用一个控制传输
7.获取字符串描述符----使用n个控制传输
8.选择设备配置----使用一个控制传输
监视鼠标枚举:



关于端点:

端点的输入和输出都是以host而言的。 端点是成对出现的。
usb主机和usb设备如鼠标等都会有输入端点0和输出端点0,分别是芯片内部的若干字节的buffer,大于8bytes。
在枚举阶段,
usb设备将数据如设备描述符写入自身的输入端点0(对host而言输入),然后经过物理传输,host会在自身的输入端点收到数据。
usb设备读自身的输出端点0(对host而言的输出),将会读到host传来的命令信息比如获取设备描述符,host是通过将命令写入自身的输出端点0,然后经过物理传输,到达设备的输出端点0的。
比如d12芯片包括控制端点在内的3个端点,如下:

驱动实现

先看插上modem之后的打印信息:
root@freescale /$ hub 2-1.4:1.0: drivers/usb/core/hub.c,hub_events,3403, state 7 ports 7 chg 0000 evt 0010drivers/usb/core/hub.c,hub_events,3447: ----------------------hub->descriptor->bNbrPorts=7,i=1drivers/usb/core/hub.c,hub_events,3447: ----------------------hub->descriptor->bNbrPorts=7,i=2drivers/usb/core/hub.c,hub_events,3447: ----------------------hub->descriptor->bNbrPorts=7,i=3drivers/usb/core/hub.c,hub_events,3447: ----------------------hub->descriptor->bNbrPorts=7,i=4
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=1
hub 2-1.4:1.0: drivers/usb/core/hub.c,hub_port_connect_change,3100, port 4, status 0101, change 0001, 12 Mb/s
drivers/usb/core/hub.c,hub_port_connect_change,3102: portstatus=101,portchange=1
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=0
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=0
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=0
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=0
drivers/usb/core/hub.c,hub_port_status,407: status=101,change=0
hub 2-1.4:1.0: debounce: port 4: total 100ms stable 100ms status 0x101
drivers/usb/core/hub.c,hub_port_status,407: status=103,change=10
usb 2-1.4.4: ------new full speed USB device using fsl-ehci and address 18
drivers/usb/core/hub.c,hub_port_status,407: status=111,change=0
hub 2-1.4:1.0: port 4 not reset yet, waiting 10ms
drivers/usb/core/hub.c,hub_port_status,407: status=103,change=10
usb 2-1.4.4: udev 18, busnum 2, minor = 145
usb 2-1.4.4: New USB device found, idVendor=1ab7, idProduct=5740
usb 2-1.4.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0
option 2-1.4.4:1.0: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB5
option 2-1.4.4:1.1: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB6
option 2-1.4.4:1.2: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB7
option 2-1.4.4:1.3: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB8
option 2-1.4.4:1.4: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB9
option 2-1.4.4:1.5: GSM modem (1-port) converter detected
usb 2-1.4.4: GSM modem (1-port) converter now attached to ttyUSB10

line 15 hub 2-1.4:1.0: drivers/usb/core/hub.c,hub_port_connect_change,3100, port 4, status 0101, change 0001, 12 Mb/s
hub 2-1.4:1.0  其中
hub表示2-1.4是一个hub.
2表示2号总线或2号主机控制器或2号root hub。
1表示2号hub下的第一个口所接的东东(可以是hub或device)
4表示上面第一个口所接的东东(hub)的第4个口所接的东东表示2-1.4是一个hub.
即2号root hub下的第1个口接了一个hub,这个hub的第4个口也接的是个hub

line 28 usb 2-1.4.4: udev 18, busnum 2, minor = 145
usb 表示2-1.4.4是一个usb设备
合起来是2号root hub下的第1个口接了一个hub,这个hub下的第4个口接了一个接了一个hub,这hub下的第4个口接了一个usb device

line 31 option 2-1.4.4:1.0: GSM modem (1-port) converter detected
2-1.4.4:1.0表示最后一层hub的第4个口接了一个usb device,此device的配置1的接口0  (被转换成一个串口)

usb/serial/usbserial.c usb转串口驱动
usb/serial/bus.c

usb/host/ehci-hcd.c usb主机控制器驱动
usb/host/ehci-arc.c 

usb/host/ehci-hub.c 
usb/core/hub.c 负责usb设备的枚举

linux中使用usb_hcd描述usb主机控制器驱动,


在ehci-hcd.c进行平台设备ehci_fsl_driver的注册
#ifdef CONFIG_USB_EHCI_FSL
#include "ehci-fsl.c"
#define PLATFORM_DRIVERehci_fsl_driver
#endif
retval = platform_driver_register(&PLATFORM_DRIVER);

ehci_fsl_driver则是定义在ehci-arc.c的平台驱动:
static struct platform_driver ehci_fsl_driver = {
.probe = ehci_fsl_drv_probe,
.remove = ehci_fsl_drv_remove,
.shutdown = usb_hcd_platform_shutdown,
#ifdef CONFIG_PM
.suspend = ehci_fsl_drv_suspend,
.resume = ehci_fsl_drv_resume,
#endif
.driver = {
  .name = "fsl-ehci",
},
};

平台驱动ehci_fsl_driver的probe函数中创建了usb_hcd, hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); 位于ehci-arc.c
usb_hcd的hc_driver  ehci_fsl_hc_driver很重要,实现usb很多操作的函数指针

ehci主机控制器用ehci_hcd结构体描述,和usb_hcd结构体使用私有数据指针联系。
ehci_hcd结构体的初始化位于ehci-hcd.c的ehci_init()
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
ehci->need_io_watchdog = 1;
init_timer(&ehci->watchdog);
ehci->watchdog.function = ehci_watchdog;
ehci->watchdog.data = (unsigned long) ehci;


init_timer(&ehci->iaa_watchdog);
ehci->iaa_watchdog.function = ehci_iaa_watchdog;
ehci->iaa_watchdog.data = (unsigned long) ehci;




hub_port_connect_change函数中所调用的函数中,有两个函数很重要
分别是hub_port_init和usb_new_device,如下
hub_events()------->hub_port_connect_change()------->hub_port_init()------->hub_port_reset------->hub_port_wait_reset------->hub_port_status获取此口所接设备的速度
hub_events()------->hub_port_connect_change()------->usb_new_device()------->usb_enumerate_device()------->usb_get_configuration()获取设备描述符



usb driver中的提交函数usb_submit_urb()最终是通过usb core机制调用了主机控制器的urb_enqueue(),将数据通过phy发出
usb_submit_urb()------->usb_hcd_submit_urb()(位于usb/core/hcd.c)-------> hcd->driver->urb_enqueue()(位于usb/host/ehci-arc.c)-------> ehci_urb_enqueue()(位于usb/host/ehci-hcd.c)




windows下监视usb

在任务管理器中可以观察到usb host ctrl和root hub






使用 usb bound更清楚,并可以监视usb数据传输。
从下图一目了然,每个控制器下挂的hub,每个hub下挂的设备:
一般笔记本上引出的usb口,都是位于不同的hub下的.


在device页选中要监视的设备,在capture点击run即可监视。

linux下监视usb
lsusb -v

这篇关于usb-serial-2 usb主机控制器驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630525

相关文章

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk)

【虚拟化】AIO主机安装PVE8,配置网络,安装win11(virtio,qcow2,scsi,oobe,adk) 文章目录 1、ESXI vs PVE,AIO主机系统二选一2、PVE网络配置(DNS,换源,网卡,https,概览)3、win11虚拟化配置(virtio,raw,qcow2)附,域名解析,rocky9.4,黑群晖 1、ESXI vs PVE,AIO主机系统二选

Usb Audio Device Descriptor(10) Hid Device

对于 Standard Interface Descriptor, 当 bInterfaceClass=0x03时,即为HID设备。Standard Interface Descriptor如下 struct usb_standard_interface_descriptor{U8 bLength; /*Size of this descriptor in bytes*/U8 bDescrip

Android rk3399 UAC(USB Audio)开发笔记

一、UAC有1.0和2.0,因Windows对2.0支持不好,我使用的是UAC1.0驱动 内核配置:CONFIG_USB_CONFIGFS_F_UAC1          ---这个宏配置无需物理codec,使用虚拟 alsa codec  驱动路径:"kernel\drivers\usb\gadget\function\f_uac1.c" 内核配置:CONFIG_USB_CONFIGFS_