array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 USB驱动程序之USB总线驱动程序学习笔记 - 爱码网

USB驱动程序之USB总线驱动程序学习笔记

USB总线驱动程序的作用

1. 识别USB设备
1.1 分配地址
1.2 并告诉USB设备(set address)
1.3 发出命令获取描述符
描述符的信息可以在include\linux\usb\Ch9.h看到  (Ch9是指USB规范的第九章)

2. 查找并安装对应的设备驱动程序
3. 提供USB读写函数



把USB设备接到开发板上,看输出信息:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] Attached SCSI removable disk
拔掉
usb 1-1: USB disconnect, address 2


再接上:
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
scsi1 : SCSI emulation for USB Mass Storage devices
scsi 1:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2
sd 1:0:0:0: [sda] Attached SCSI removable disk



在内核目录下搜:

grep "USB device using" * -nR
drivers/usb/core/hub.c:2186:              "%s %s speed %sUSB device using %s and address %d\n",
USB驱动程序之USB总线驱动程序学习笔记
根据打印信息查看信息所在的函数hub_port_init(),看这个函数的被调用情况

hub_irq  //这个中断是主机控制器驱动程序注册的中断,当接上USB设备后,USB设备硬件上的手脚使主机控制器的D+或D-引脚发生变化。主机控制器硬件上感知有USB控制器接入,就会产生某个中断,调用中断函数hub_irq。

USB驱动程序之USB总线驱动程序学习笔记

  hub_irq
  kick_khubd
hub_thread
hub_events
hub_port_connect_change

udev = usb_alloc_dev(hdev, hdev->bus, port1);
dev->dev.bus = &usb_bus_type;  //总线设备驱动模型

choose_address(udev); // 给新设备分配编号(地址)


hub_port_init   // usb 1-1: new full speed USB device using s3c2410-ohci and address 3

hub_set_address  // 把编号(地址)告诉USB设备

usb_get_device_descriptor(udev, 8); // 获取设备描述符,这里获得8个字节是因为还不知道端点0一次性能传输多少数据,从第8个字节可以知道端点0一次性传输的包大小是多少。

USB驱动程序之USB总线驱动程序学习笔记

retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);

usb_new_device(udev)   
err = usb_get_configuration(udev); // 把所有的描述符都读出来,并解析
usb_parse_configuration

device_add  // 把device放入usb_bus_type的dev链表, 
           // 从usb_bus_type的driver链表里取出usb_driver,
           // 把
usb_interface和usb_driver的id_table比较
           // 如果能匹配,调用usb_driver的probe

USB驱动程序之USB总线驱动程序学习笔记

usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。

##################################################

我们插上任意的USB设备,就发现内核打印出一些信息,说明USB总线驱动程序已经做好。USB设备程序已经做好。后面只需要编写USB驱动程序,即上图中的usb_driver 。(因此,以后写USB驱动程序,写的就是USB接口描述符方面的

##################################################

USB驱动程序之USB总线驱动程序学习笔记

关于设备描述符的详细介绍,可以参考我的博客:http://blog.csdn.net/qq_26093511/article/details/51125618


1、设备描述符

USB驱动程序之USB总线驱动程序学习笔记


(1)这里bMaxPacketSize0
最大包大小0是指端点0,每一个设备都有端点0,因为是通过端点0识别USB设备的,把命令和地址发给端点0,从端点0读取到描述符信息

(2)设备描述符有厂家ID、产品ID等

可以打开windows里面的设备管理器

USB驱动程序之USB总线驱动程序学习笔记

(3)设备描述符里有bNumConfigurations

是指配置的个数,这个设备有多少种配置。因而有配置描述符。

2、配置描述符

配置描述符里有bNumInterfaces; /*配置所支持的接口数*

3、接口描述符

接口描述符是指逻辑上的设备,如一个USB声卡,硬件上只有一个,但是逻辑上可能有两个功能,一个是录音,一个是播放。

写驱动程序的时候是给逻辑上的设备写的,所以一个USB硬件可能安装多个驱动程序。

4、端点描述符  (端点是USB传输对象)

(1)结构体

struct usb_endpoint_descriptor {
 __u8 bLength; /* 描述符长度 */
 __u8 bDescriptorType; /* 描述符类型 */
 __u8 bEndpointAddress; /* 端点地址: 0~3 位是端点号,第 7 位是方向(0-OUT,1-IN) */
 __u8 bmAttributes; /* 端点属性: bit[0:1] 的值为00 表示控制,为01 表示同步,为02 表示批量,为03 表示中断 */

 __le16 wMaxPacketSize; /* 本端点接收或发送的最大信息包的大小 */
 __u8 bInterval; /* 轮询数据传送端点的时间间隔 */
 /* 对于批量传送的端点以及控制传送的端点,此域忽略 */
 /* 对于同步传送的端点,此域必须为 1 */
 /* 对于中断传送的端点,此域值的范围为 1~255 */

 __u8 bRefresh;
  __u8 bSynchAddress;
} __attribute__ ((packed));

(2)

USB驱动程序之USB总线驱动程序学习笔记

5、把描述符统统读出来后,根据这些信息来找到驱动程序


转自:http://blog.csdn.net/qingkongyeyue/article/details/53363298

相关文章: