Linux USB Host-Controller的初始化代码框架分析【转】
转自:http://blog.csdn.net/zkami/article/details/2496770
usb_hcd_omap_probe (const struct hc_driver *driver) (dev/ohci/ohci-omap.c)
在模块初始化时被platform_driver_register()调用,用来初始化与ohci_hcd_omap_driver
相匹配的usb主控制器.
->usb_create_hcd(driver); 创建一个代表host-controller的数据结构(struct usb_hcd)并初始化 core/hcd.h
->hcd = kzalloc(sizeof(*hcd) + driver->hcd_priv_size, GFP_KERNEL); 为struct usb_hcd分配一块内存
->usb_bus_init (struct usb_bus *bus); (hcd.c) 初始化代表usb bus的数据结构(struct usb_bus)
->初始化struct usb_hcd的定时器,工作队列
->填充struct usb_hcd的rsrc_start字段:host-controller memory/io的起始物理地址
rsrc_len字段:host-controller memory/io的长度
regs字段:host-controller memory/io映射的内核虚拟地址。
->ohci_hcd_init(struct ohci_hcd *ohci); (dev/ohci/ohci-mem.c)
->usb_add_hcd(struct usb_hcd *hcd,unsigned int irqnum, unsigned long irqflags) (/core/hcd.h)
完成struct usb_hcd剩余的初始化工作
->hcd_buffer_create(hcd):创建dmapool
->usb_register_bus(usb_bus):注册usb bus
->usb_alloc_dev(NULL, &hcd->self, 0): (core/usb.c)
处理主控制器hcd上的根Hub(hcd->self.root_hub),这里做的就是为Root Hub申请了一个struct usb_device结构体,并且初始化, 将返回值赋给指针rhdev. Root Hub的parent指针指向了Controller本身.
->ohci_omap_init:完成omap硬件的init工作
->otg_get_transceiver();
->otg_set_host(ohci->transceiver, &ohci_to_hcd(ohci)->self);
针对OTG特性进行的初始化,后面分析
->ohci_init(struct ohci_hcd *ohci); (host/ohci-hcd.c)
->为ohci->hcca分配空间
->ohci_mem_init() 创建ohci->td_cache和ohci->ed_cache的dma_pool
->request_irq(irqnum, &usb_hcd_irq, irqflags,hcd->irq_descr, hcd)
注册中断处理函数.其中中断号是irqnum, 中断服务程序是usb_hcd_irq(struct usb_hcd *hcd) (ohci-hcd.c).
根据usb2.0 spec定义的中断类型有:usb_hcd_irq()根据具体类型执行相应操作,后面分析.
#define OHCI_INTR_SO (1 << 0) /* scheduling overrun */
#define OHCI_INTR_WDH (1 << 1) /* writeback of done_head */
#define OHCI_INTR_SF (1 << 2) /* start frame */
#define OHCI_INTR_RD (1 << 3) /* resume detect */
#define OHCI_INTR_UE (1 << 4) /* unrecoverable error */
#define OHCI_INTR_FNO (1 << 5) /* frame number overflow */
#define OHCI_INTR_RHSC (1 << 6) /* root hub status change */
#define OHCI_INTR_OC (1 << 30) /* ownership change */
#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */
->ohci_omap_start(struct usb_hcd *hcd):启动OHCI
->ohci_run(struct ohci_hcd *ohci) (ohci-hcd.c)
Start an OHCI controller, set the BUS operational resets USB and controller
enable interrupts 根据spec写相应寄存器来启动OHCI HC
->ohci_stop(struct usb_hcd *hcd)
ohci_run失败的话,释放一些资源和已申请的中断, 释放ohci的ed/td cache以及ohci-hcca
->register_root_hub(struct usb_hcd) (core/hcd.c)
->usb_set_device_state(usb_device, usb_device_state)
是roothub的话仅将new_state赋给udev->state,否则根据usb_device_state作不同处理
->usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE) 获取roothub的设备描述符
->usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size);返回设备描述符,后面分析
->usb_new_device(usb_dev) 配置并注册usb设备 (hub.c)
->usb_configure_device(udev); (hub.c) 读取设备的配置信息
->usb_get_configuration(udev);
->usb_cache_string() 读取设备以下三个信息(字符描述符):product, manufacturer, serial
->usb_configure_device_otg(udev);
->usb_autoresume_device(udev->parent); 建立usb设备的父子关系
->device_add(&udev->dev);
注册usb设备: 将设备加载到总线上(添加到总线的设备队列中),并为该设备搜索与之匹配的驱动
->usb_set_device_state(udev, USB_STATE_NOTATTACHED);
->usb_hc_died (hcd);
->usb_hcd_poll_rh_status(usb_hcd) hcd.c
获取“根Hub状态变化”的具体信息,并将该信息递交给usb_hcd->status_urb
->ohci_hub_status_data(usb_hcd, buf)
首先: 读取根Hub"状态变化信息",并将其存放于buffer中
->ohci_root_hub_state_changes(ohci, changed, any_connected);
根据主控制器在设备接入前的状态(如SUSPEND),将主控制器状态设置为中断发生后的下一状态(如OPERATION), 并判断根Hub是否需要继续轮询(poll_rh等于表示需要继续轮询)
->ohci_rh_suspend(ohci, 1); pm方面以后分析
->ohci_rh_resume(ohci); pm方面以后分析
->usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); pm方面以后分析
然后: 将保存于buffer中的root hub"状态变化信息"传递给usb_hcd->status_urb并将该urb提交给root hub驱动层
-> usb_hcd_unlink_urb_from_ep()
-> usb_hcd_giveback_urb()
-> mod_timer() 调整roothub定时器使其再次进入定时器队列
Linux USB Host-Controller的初始化代码框架分析【转】的更多相关文章
- linux USB HOST之EHCI和OHCI【转】
转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 2 关键数据结 ...
- Using a USB host controller security extension for controlling changes in and auditing USB topology
Protecting computer systems from attacks that attempt to change USB topology and for ensuring that t ...
- Linux usb 3. Host 详解
文章目录 1. 简介 2. Usb Core 驱动设备模型 2.1 Usb Device Layer 2.1.1 device (struct usb_device) 2.1.2 driver (st ...
- 转:USB主机控制器(Host Controller)--深入理解
1. 主机控制器(Host Controller) • UHCI: Universal Host Controller Interface (通用主机控制接口, USB1.0/1.1) • ...
- linux usb驱动记录(一)
一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示: 从主机侧看usb驱动可分为四层: ...
- Security arrangements for extended USB protocol stack of a USB host system
Security arrangements for a universal serial bus (USB) protocol stack of a USB host system are provi ...
- Linux usb 6. HC/UDC 测试
目录 1. 背景介绍 2. Device (gadget zero) 2.1 gadget zero 创建 2.2 SourceSink Function 2.3 Loopback Function ...
- Linux USB驱动框架分析(2)【转】
转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011 ...
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
随机推荐
- OFART: OpenFlow-Switch Adaptive Random Testing
文章名称:OFART: OpenFlow-Switch Adaptive Random Testing 发表时间:2017 期刊来源:--- 摘要 问题: 如果转发设备的正确性没有验证,这将影响这个网 ...
- Book Review 《构建之法》-2
-敏捷流程包括了几大原则:Backlog.burn-down.Sprint.Scrum. 敏捷开发注重个人之间的交流,提倡尽早的交付有价值的软件满足顾客的需求, 在开发过程中不断与客户进行交互,变化. ...
- [讲座] Parallel Processing of Graphs
Graph 本次学术前沿讲座由邵斌老师主讲,标题已经揭示了主题:Graph.1.5h的talk,听完自觉意犹未尽.本来以为是一节自己没接触过的图形学的talk,没想到讲的很多内容都跟自己学过的很多东西 ...
- RYU 的选择以及安装
RYU 的选择以及安装 由于近期的项目需求,不得已得了解一下控制器内部发现拓扑原理,由于某某应用中的控制器介绍中使用的RYU,所以打算把RYU装一下试试.出乎意料的是,RYU竟是我之前装过最最轻便的控 ...
- PerfMon Metrics Collector插件的Disks I/O使用总结
做Jmeter测试的时候如果想要统计磁盘的IO读写速度,那么很容易想到用PerfMon Metrics Collector这个插件,但是具体使用过程中还有以下需要注意的. 1.如下图首先,需要选择监控 ...
- [转帖]Windows10七大版本区别在哪?
Windows10七大版本区别在哪? http://os.51cto.com/art/201804/570132.htm 一.Windows10家庭版 对于绝大多数用户来说,最后可能获得的应该就是Wi ...
- C++ STL 的底层数据结构实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque ...
- java.util.concurrent BlockingQueue详解
什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞 ...
- JSONP使用及注意事项小结
什么是JSONP 三句话总结: 概念:JSONP(JSON with Padding)是JSON的一种"使用模式". 目的:用于解决主流浏览器的跨域数据访问的问题. 原理:利用 & ...
- 【设计模式】—— 命令模式Commond
前言:[模式总览]——————————by xingoo 模式意图 将一个请求封装成一个对象,从而对这个命令执行撤销.重做等操作. 典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Un ...