转自: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的初始化代码框架分析【转】的更多相关文章

  1. linux USB HOST之EHCI和OHCI【转】

    转自:http://blog.csdn.net/ljzcom/article/details/8186914 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 2 关键数据结 ...

  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 ...

  3. 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 ...

  4. 转:USB主机控制器(Host Controller)--深入理解

    1. 主机控制器(Host Controller) • UHCI: Universal Host Controller Interface (通用主机控制接口, USB1.0/1.1)      • ...

  5. linux usb驱动记录(一)

    一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示:   从主机侧看usb驱动可分为四层: ...

  6. 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 ...

  7. Linux usb 6. HC/UDC 测试

    目录 1. 背景介绍 2. Device (gadget zero) 2.1 gadget zero 创建 2.2 SourceSink Function 2.3 Loopback Function ...

  8. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  9. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

随机推荐

  1. 第一个spring,总结!

    陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过五天的时间,开会时候分配的任务,已经全部完成,在这期间中,我们遇到了一些问题.但是,经过android老师的指导后,app成功的 ...

  2. Beta阶段冲刺-1

    1. 新成员 新加入成员,克克飞同学,任务是去弄公众号相关的部分. 队员 个人简介 博客地址 杨晨露 每天都在开会的PM http://www.cnblogs.com/ycll/ 游舒婷 每天都在装死 ...

  3. Oracle client 使用 .net程序连接 数据库时 出现 8.1.7 的解决办法

    1. GS产品 连接oracle数据库时出现错误图示 2. 其实解决这个问题的办法很简单 一般是 修改一下 Oracle的app 目录的权限 最简单的办法是增加 everyone 权限 然后重启机器即 ...

  4. shell脚本实现多台服务器自动巡检

    shell脚本实现多台服务器自动巡检 摘要:         运维服务一个项目二十多台(或者多台)服务器,每天要做服务器的性能巡检工作是查看服务器的CPU.内存.磁盘空间是否在正常值范围内.像这样每天 ...

  5. Java多线程与线程同步

    六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多 ...

  6. set, unordered_set模板类

    template< class Key, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key> ...

  7. 【刷题】BZOJ 3033 太鼓达人

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  8. 首先java中集合类主要有两大分支

    本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...

  9. 基于docker的spark-hadoop分布式集群之一: 环境搭建

    一.软件准备 1.基础docker镜像:ubuntu,目前最新的版本是18 2.需准备的环境软件包: (1) spark-2.3.0-bin-hadoop2.7.tgz (2) hadoop-2.7. ...

  10. POJ - 2299 Ultra-QuickSort(归并排序)

    https://vjudge.net/problem/POJ-2299 题意 求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序. 分析 很明显是求逆序对的数目,那就要 ...