当前位置:   article > 正文

Linux内核中识别USB设备过程_linux系统内核usb插入中断识别过程

linux系统内核usb插入中断识别过程

1.usb全速模式和高速模式的区别,名字上感觉速度应该差不多??

Usb1.1又是usb2.0全速模式,传输速率只有12Mbps

Usb2.0高速模式达到了480mbps

擦类这明显不是一个等级。。。。

2.如何查看插入电脑的usb设备是全速模式还是高速模式??

Linux下使用dmesg命令查看

设备中下查看方法:

插入后直接看打印信息

3.怎么测试的说,电脑下设备是高速的,803P下是全速的怎么测试的??

是通过查看注册信息的方式查看的。

4.803的usb和设备的cy68013有什么区别??

本质上没有区别,类似于stm32内部ADC和外部ADC??、

OHCI  1.0规范

EHCI  2.0规范

Usb device 设备

Usb host  主控制器

Usb控制器时钟是在u-boot中设置???

通过终端查看设备的打印信息,当插入多道设备后,终端会自动打印信息

有点奇怪,当前是设备枚举出错了。

挂接u盘是可以的

意思是没有一个端口要这个多道设备,导致枚举不成功??为什么没人要呢??

echo i>/proc/driver/musb_hdrc.0;

将设备强制改为全速模式

可以成功挂载。

 

通过上面的打印信息可以分析出是设备枚举失败,-71 是协议错误,而且是usb主控制器的错误。

为什么别的设备可以挂接为高速设备??、为什么自己的设备挂接为全速设备就可以正常挂载。

有可能是全速模式下,这设备的相关配置好了,但是高速模式下没配置好

U盘和多道的传输方式应该是不一样的。

 

需要查看各用的什么传输方式,查看该方式是否正常运行,应该就可以了吧?

主机发送个信号给设备,确认是什么设备,然后usb回指令。如果不是高速设备,主机不会发送高速握手协议,但是上面的打印信息肯定是发送了握手协议了,但是usb设备没回??

有可能电脑发送的切换信号,usb设备识别了,803发的切换信号,usb来不及识别。

2、 高速设备的检测

在连接的最开始阶段,高速设备是当成全速设备来识别的,因此,高速设备的D+线上也会有一个1.5K欧姆的上拉电阻到电源,但是与全速设备不相同的是,高速设备对这个上拉电阻,会有一个开关进行通断控制。因为

高速信号传输是通过电流驱动的,而且D+和D-上的信号幅值在0V和400mv之间切换,所以传输时不允许有一个接到3.3V的上拉电阻存在。以下就是简化的高速设备检测流程。

1,集线器或者主机必须确认连在它端口上的设备不是低速设备,如果是低速设备,则集线器或者主机就不会发起高速握手协议。

2,当集线器或者主机确认端口设备不是低速设备后,它将在握手协议的最开始阶段,T0时刻,发出一个SE0(信号或称命令、状态。不管是什么,理解了就好),用作复位

3,设备检测这个SE0,进行复位。(这里设备根据自己处在何种状态,会作出不同的动作)

4,假如设备是高速设备,则它会让上拉电阻仍然连接,但会使高速的端接无效,并驱动高速信号电流流向D-线上,这将在总线上产生一个K脉冲。该脉冲,在复位的TO时刻后,必须持续至少1.0 ms,但不能超过7.0ms

5,集线器在观察到设备发出的K脉冲至少2.5 us后,必须能检测出这个脉冲。假如集线器没有检测出这个脉冲,则它必须持续的发出SE0信号,直到复位结束。

6,在当K脉冲信号在总线上存在不超过100 us的时间后,集线器必须开始发送间隔的K脉冲和J脉冲序列信号,在J’s和K’s之间的总线上不允许有空闲状态发生。该序列信号在复位结束之前将持续一段时间,不少于100 us,但不长于500 us。(这保证了总线上始终保持活动状态,阻止设备进入高速挂起状态。)每一个独立的K脉冲和J脉冲的持续时间至少为40 us,但不能长于60 us。

7,在完成脉冲序列信号发生之后,集线器发出SE0信号,直到复位结束。在复位结束时,集线器必须转到高速使能状态,而无需在数据线上作出任何改变。

8,在设备完成它自己的脉冲信号(K脉冲)后,它将寻找高速集线器的脉冲信号。设备至少需要观测到K-J-K-J-K-J脉冲序列,来作为检测到一个有效的集线器脉冲信号。每一个独立的K脉冲和J脉冲至少需检测到2.5 us。

A),假如设备检测到脉冲序列K-J-K-J-K-J,则在检测到后的500 us(TWTHS)之内,设备要求断开D+的上拉电阻,并使能高速端接,进入高速缺省状态。即已进入高速模式

B),假如设备在完成它自己的脉冲信号之后的1.0 ms到2.5 ms之内,没有检测到脉冲序列K-J-K-J-K-J,则设备要回复到全速缺省状态,并等待至复位结束。(进入全速模式)

                

应该是803的切换时序和多道的切换时序没有对上。然后就需要分析他们的时序和查看一下切换时的电流情况。(切换流程较复杂)

通过linux查看,确实是注册的高速设备,所以,这个设备是支持高速的

先复习一下usb的基础知识,方便更深入的学习

现象:当将一个usb设备接入windows时

1.显示usb名称

2.没安装过驱动会跳出一个对话框,提示安装驱动

 

电脑怎么知道的该显示那个名称???

1.windows里面有了usb的总线驱动程序,接入usb设备后,是总线驱动程序知道的你是什么名字,我们安装的是设备驱动程序

所以usb设备的层次就分为两层

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

设备驱动层         //需要自己写的(了解数据含义)

<--Usb总线驱动层   //一般为内核自带(1.识别设备,2.找到并安装设备驱动程序3.提供usb读写函数   不了解数据含义)

<--硬件设备(usb主机控制器)

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

写的usb总线驱动程序相当于写的usb主机控制器驱动程序,usb主机控制器接有usb设备,设备驱动程序相当于是支持usb设备的,设备驱动程序为了能够访问usb设备,需要借助usb总线驱动程序提供的函数,把包发给usb主机控制器,然后主机控制器将数据发给usb设备。(usb驱动程序框架)

 

Usb总线驱动程序负责什么??

Usb总线驱动负责识别usb设备,然后给usb设备找到对应的驱动程序

 

Usb设备种类很多,怎么能一接入电脑就能识别出来??

Usb和pc设备都要遵守一些规范

当usb设备接入电脑后,pc会发送指令询问你是什么?

Usb回复我是什么什么设备。

两人都要用一样的协议都要说中文

Usb总线驱动程序发出指令获取设备信息(描述符)

Usb设备必须返回描述符给PC

 

PC上有很多设备,PC是怎么进行区分的??

Usb接口只有四条线 5v GND D+ D-

接在usb总线上的每一个usb设备都有自己的编号

Pc想访问某个usb设备时,发出命令都要有对应的编号地址

 

刚接入的时候,没编号,怎么通讯??

每一个设备接入pC时,usb总线驱动程序都会给它分配一个编号

 

Usb设备接入PC时,还没有编号,怎么把编号告诉他们??

在未分配新编号之前,PC使用默认的0编号进行通讯

 

Usb一接入,电脑能够立即发现???

是硬件做的处理,pc 端D+ D-接有15k下拉电阻

Usb设备的D-端和5v之间接有一个1.5k电阻,当插入pc时,5v有电压了,就会拉高D-引脚,电脑就知道有设备接入了。

 

D-和5v之间有一个1.5k电阻代表的是全速设备,D+和5v之间有一个1.5k电阻代表的是一个高速设备。(应该是之前的标准,当前的板卡没有发现遵循这个)

 

Usb是主从结构:所有的usb传输都是从主机这方发起,usb设备没有主动通知usb主机的能力

 Usb鼠标滑动一下产生数据,但是它没有能力通知PC机来读取数据。

 

怎么保证数据是及时的??

PC机不断的查询。

Usb的传输类型

U盘(不实时,文件可靠 批量传输

Usb鼠标(时间有保证,可靠 中断传输—)(借助概念,使用的查询方式))

Usb摄像头(数据不可靠,实时 实时传输

控制传输:文件可靠,实时(usb的识别过程)

 

 

Usb传输的对象:端点(endpoint)

读u盘 写u盘 可细化为,把数据写到u盘的端点1,从u盘的端点2读取数据

除了端点0外的端点都是单向的。

端点0用于控制传输。既能输出也能输入

每一个端点都只有一种传输类型和传输方向

术语中的输入(IN)输出(OUT)永远都是基于usb主机来说的

比如鼠标,鼠标的数据是从鼠标传到PC机,对应的端点称为输入端点。

 

Usb主机控制器协议规范:(硬件层)

UHCI  OHCI  EHCI

UHCI:intel(适用于低速1.5mbps和全速usb设备12mbps)

OHCI:microsoft(微软) (适用于低速和全速usb设备)

EHCI: 高速(480Mbps)

 

Usb总线驱动程序

1.识别设备,

(1)分配地址,并告诉usb设备(set address)

(2)发出命令获取描述符

2.找到并安装设备驱动程序

3.提供usb读写函数

 

Usb设备自带一个hub

 

查看插入usb设备后的串口打印信息,在内核目录下搜索

信息。(usb device using)

Grep “USB device using” * -nR

  1. --》Drivers/usb/core/hub.c
  2. --》hub_port_init() //hub_set_address()把地址告诉usb设备
  3. //usb_get_device_descriptor//获取描述符
  4. //usb_new-device(udev)
  5. Err= usb_get_configuration(udev)//将描述符读出并解析
  6. Usb_parse_configuration//解析
  7. Device_add //把设备放入bus_type的dev链表,从usb_bus的driver链表里读出usb_driver,把usb_interface和usb_driver的id_table一一比较如果能匹配调用usb_driver的probe函数
  8. --》hub_port_connect_change()//choose_address(udev)给新设备分配编号
  9. udev =usb_alloc_dev(hdev,hdev-bus,port1);
  10. dev->dev.bus=&usb_bus_type;
  11. --》hub_events()//hub事件
  12. --》hub_thread//hub线程,在队列里面休眠
  13. --》Kick_khubd唤醒这个线程
  14. --》hub_irq
  15. --》硬件上的操作

 

 

usb驱动程序编写:

目的:usb鼠标用作按键

1.分配 input_dev

2.设置

3.注册

4.硬件操作

 

怎么写usb设备驱动?

1.分配设置usb_driver结构体

           .id_table //支持哪些设备

           .probe //具体的解析操作

           .disconnect

2.注册

 

 

驱动程序的编写:

1.入口函数(注册结构体)

2.出口函数(卸载结构体)

3.module_init module_exit 修饰一下

4.module_license("GPL")规范

5.分配设置usb_driver结构体

 

测试驱动程序:

1.make menuconfig去掉原来的usb鼠标驱动

2.make uImage 使用新的内核启动

3.insmod usbmouse_as_key.ko

4.在开发板上接入拔出usb鼠标

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/613964
推荐阅读
相关标签
  

闽ICP备14008679号