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