linux usb host复位,Linux USB Host-Controller的初始化代码框架分析
Linux USB Host-Controller的初始化代码框架分析
http://blog.csdn.net/zkami
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复位,Linux USB Host-Controller的初始化代码框架分析相关推荐
- linux usb代码,Linux USB Host Controller的初始化代码框架分析
usb_hcd_omap_probe (const struct hc_driver *driver) (dev/ohci/ohci-omap.c) 在模块初始化时被platform_driver_r ...
- linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
驱动代码位于: sound/soc/codec/alc5623.c 随便找个Linux内核都会有. 1.首先进行i2c总线驱动加载在: static int __init alc5623_modini ...
- Linux下USB驱动详解(HOST)
转载地址:http://blog.chinaunix.net/uid-14518381-id-3904999.html USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了 ...
- linux usb 子系统(二)- host driver
了解usb host driver. 1.USB Subsystem Framework The following chart shows the framework of the USB su ...
- Linux那些事儿 之 戏说USB(15)设备
struct usb_device结构冗长而又杂乱 include/linux/usb.h struct usb_device {int devnum;char devpath[16];u32 rou ...
- Linux内核USB总线--设备控制器驱动框架分析
正文 1.概述 如下图所示,USB控制器可以呈现出两种不同的状态.USB控制器作为Host时,称为USB主机控制器,使用USB主机控制器驱动.USB控制器作为Device时,称为USB设备控制器,使用 ...
- Linux那些事儿 之 戏说USB(19)设备
转载地址:http://blog.csdn.net/fudan_abc/article/details/1807800 第一眼看到struct usb_device这个结构,我仿佛置身于衡山路的酒吧里 ...
- 【转】Linux那些事儿 之 戏说USB(19)设备
第一眼看到struct usb_device这个结构,我仿佛置身于衡山路的酒吧里,盯着舞池里扭动的符号,眼神迷离. 交大里苟了几年,毕业了又是住在学校附近的徐虹北路上,沿着虹桥路走过去,到徐家汇不过1 ...
- Linux那些事儿 之 戏说USB(25)设备的生命线(八)
回到struct usb_hcd,继续努力的往下看. 7行,又见kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看drivers/usb/core/hcd ...
最新文章
- 深度学习模型那么多,科学研究选哪个?
- 游戏对象的移动旋转缩放
- 日本农商巨头50年布局多个领域 对话国际农民丰收节贸易会
- leetcode 494. Target Sum | 494. 目标和(动态规划)
- Find Minimum in Rotated Sorted Array
- 一种基于邻域的聚类算法
- iis7 64位 操作excel的一系列问题(未完待续)
- candence 知识积累3
- android 软件apk自动更新实现注意点!!
- Java内存模型详解
- 平平淡淡的真,安安静静的情
- Junit5 单元测试框架的使用
- 联想笔记本快捷键控制千千静听 2009年10月2日19:09:44
- 基于C++的社交应用的数据存储与实现
- 电脑c盘变红满了的清理方法
- IIFE【JavaScript】
- SLAM算法资料收集
- 敏捷开发模式下如何用 PingCode 这类工具进行版本发布管理
- linux系统是什么意思
- Java基础方法执行内存分析
热门文章
- access 英文是什么意思_MOS2019和MOS2016有什么区别?MOS2019难考吗?如何选择微软办公软件考试版本?...
- 知识变现者,必学的《30堂知识变现课》
- 【追光者】2022年终总结,又是一个开始,新的挑战。愿你历尽千帆,归来仍是少年。
- 【计算机毕业设计】544音乐翻唱网站与分享平台
- 腾讯专有云 Tstack和TCE 区别
- 包子和馒头的恩怨完全版
- matlab二进制定义,MATLAB二进制类型数据相关操作
- 根据经纬度获取地址(中文地址以及地址code)
- linux ps 命令s意义,ps命令输出进程状态S+的含义解析
- Copy-Paste