Linux那些事儿之我是UHCI-引子

原创 2007年09月29日 23:15:00

写一下UHCI,也顺便怀念一下Intel,以及Intel的那几个女同事们,好久没联系了,你们可好

UHCIIntel提出来的.虽然离开Intel一年多了,但我总觉得也许有一天我还会回到Intel.所以关于Intel的东西,我多少会关注一下.我挺怀念Intel,虽然钱也不多,但是那时候毕竟刚毕业,对钱的问题也没想太多.

UHCI全名Universal Host Controller Interface,它是一种USB主机控制器的接口规范,江湖中把遵守它的硬件称为UHCI主机控制器.Linux,把这种硬件叫做HC,或者说Host Controller,而把与它对应的软件叫做HCD.HC Driver.Linux中这个HCD所对应的模块叫做uhci-hcd.

当我们看一个模块的时候,首先是看KconfigMakefile文件.drivers/usb/host/Kconfig文件中:

    161 config USB_UHCI_HCD

    162         tristate "UHCI HCD (most Intel and VIA) support"

    163         depends on USB && PCI

    164         ---help---

    165           The Universal Host Controller Interface is a standard by Intel for

    166           accessing the USB hardware in the PC (which is also called the USB

    167           host controller). If your USB host controller conforms to this

    168           standard, you may want to say Y, but see below. All recent boards

    169           with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,

    170           i810, i820) conform to this standard. Also all VIA PCI chipsets

    171           (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro

    172           133). If unsure, say Y.

    173

    174           To compile this driver as a module, choose M here: the

    175           module will be called uhci-hcd.

众里寻他千百度之后,我发现了上面这段文字,注意那句depends on USB && PCI.这句话的意思就是说这个选项是依赖于另外两个选项,CONFIG_USBCONFIG_PCI,很显然这两个选项代表着Linuxusb的核心代码和pci的核心代码.

UHCI作为USB主机控制器的接口,它依赖于usb核心这很正常,但为何它也依赖于pci核心呢?理由很简单,UHCI主机控制器本身通常是PCI设备,即通常它会插在PCI插槽里,或者直接就集成在主板上.但总之,大多数的UHCI主机控制器是连在PCI总线上的.所以,很无奈的是,UHCI驱动程序就不得不了解一点PCI设备驱动程序.

先用lspci命令看一下,

localhost:/usr/src/linux-2.6.22.1/drivers/usb/host # lspci | grep USB

00:1d.0 USB Controller: Intel Corporation Enterprise Southbridge UHCI USB #1 (rev 09)

00:1d.1 USB Controller: Intel Corporation Enterprise Southbridge UHCI USB #2 (rev 09)

00:1d.2 USB Controller: Intel Corporation Enterprise Southbridge UHCI USB #3 (rev 09)

00:1d.7 USB Controller: Intel Corporation Enterprise Southbridge EHCI USB (rev 09)

比如在我的计算机里,就有三个UHCI主机控制器,以及另一个主机控制器,EHCI主机控制器,它们都是pci设备.

接着我们来看Makefile.

localhost:/usr/src/linux-2.6.22.1/drivers/usb/host # cat Makefile

#

# Makefile for USB Host Controller Drivers

#

 

ifeq ($(CONFIG_USB_DEBUG),y)

        EXTRA_CFLAGS            += -DDEBUG

endif

 

obj-$(CONFIG_PCI)               += pci-quirks.o

 

obj-$(CONFIG_USB_EHCI_HCD)      += ehci-hcd.o

obj-$(CONFIG_USB_ISP116X_HCD)   += isp116x-hcd.o

obj-$(CONFIG_USB_OHCI_HCD)      += ohci-hcd.o

obj-$(CONFIG_USB_UHCI_HCD)      += uhci-hcd.o

obj-$(CONFIG_USB_SL811_HCD)     += sl811-hcd.o

obj-$(CONFIG_USB_SL811_CS)      += sl811_cs.o

obj-$(CONFIG_USB_U132_HCD)      += u132-hcd.o

很显然,我们要的就是与CONFIG_USB_UHCI_HCD对应的uhci-hcd.o这个模块.而与uhci-hcd.o最相关的就是与之同名的C文件.这是它的源文件.drivers/usb/host/uhci-hcd.c的最后7,我们看到:

    969 module_init(uhci_hcd_init);

    970 module_exit(uhci_hcd_cleanup);

    971

    972 MODULE_AUTHOR(DRIVER_AUTHOR);

    973 MODULE_DESCRIPTION(DRIVER_DESC);

    974 MODULE_LICENSE("GPL");

正如每个女人都应该有一支口红,每个模块都应该有两个宏,它们是module_initmodule_exit,分别用来初始化和注销自己.而这两行代码的意思就是说uhci_hcd_init这个函数将会在你加载这个模块的时候被调用,uhci_hcd_cleanup则是将会在你卸载这个模块的时候被执行.

所以我们没有办法,只能从uhci_hcd_init开始我们的故事.

    917 static int __init uhci_hcd_init(void)

    918 {

    919         int retval = -ENOMEM;

    920

    921         printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "%s/n",

    922                         ignore_oc ? ", overcurrent ignored" : "");

    923

    924         if (usb_disabled())

    925                 return -ENODEV;

    926

    927         if (DEBUG_CONFIGURED) {

    928                 errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);

    929                 if (!errbuf)

    930                         goto errbuf_failed;

    931                 uhci_debugfs_root = debugfs_create_dir("uhci", NULL);

    932                 if (!uhci_debugfs_root)

    933                         goto debug_failed;

    934         }

    935

    936         uhci_up_cachep = kmem_cache_create("uhci_urb_priv",

    937                 sizeof(struct urb_priv), 0, 0, NULL, NULL);

    938         if (!uhci_up_cachep)

    939                 goto up_failed;

    940

    941         retval = pci_register_driver(&uhci_pci_driver);

    942         if (retval)

    943                 goto init_failed;

    944

    945         return 0;

    946

    947 init_failed:

    948         kmem_cache_destroy(uhci_up_cachep);

    949

    950 up_failed:

    951         debugfs_remove(uhci_debugfs_root);

    952

    953 debug_failed:

    954         kfree(errbuf);

    955

    956 errbuf_failed:

    957

    958         return retval;

    959 }

我不知道这个函数算不算我们迄今为止最有技术含量的一个函数.我甚至怀疑,以前写代码的哥们喜欢用冗长的函数来吓唬我,后来,通过我像祥林嫂般的不断<<呐喊>>,他们也开始<<彷徨>>,他们也开始<<友邦惊诧>>,他们发现,那种冗长的代码就像雷锋塔一样,迟早要倒掉的.所以他们修正了自己写代码的风格,也算是<<从百草园到三味书屋>>了吧,只可惜,我在复旦荒废了四年光阴,毕业后文化程度远不及<<孔乙己>>,充其量也就是<<少年闰土>>的水准.所以,眼前这个函数,对我来说,只能说,简约,而不简单.莫非难道写代码的哥们都穿了利郎商务男装?要不就是他们都是陈道明的粉丝.

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux那些事儿之我是USB[典藏完整版]

  • 2012年03月08日 14:21
  • 11.65MB
  • 下载

linux USB HOST之EHCI和OHCI

1. ehci寄存器定义在include/linux/usb/ehci-def.h, 而ohci寄存器定义在drivers/usb/host/ohci.h中。                     ...
  • ljzcom
  • ljzcom
  • 2012年11月15日 15:08
  • 6605

Linux驱动开发必看

【IT168 技术文档】在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念。我们将学习内核定时器、同步机制以及内存分配方法。不过,...
  • wh8_2011
  • wh8_2011
  • 2016年07月24日 22:38
  • 1086

Linux内核移植和根文件系统制作(详细步骤精讲)

第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的...
  • Kelsey11
  • Kelsey11
  • 2017年07月01日 17:18
  • 663

Linux那些事儿之我是UHCI(7)主机控制器的初始化(一)

好了,usb_alloc_dev,多么熟悉啊,在讲hub驱动时这就是那个八大函数的第一个.这里做的就是为Root Hub申请了一个struct usb_device结构体,并且初始化,将返回值赋给指针...
  • fudan_abc
  • fudan_abc
  • 2007年10月16日 14:23
  • 3524

linux设备驱动之USB数据传输分析 二

3.2:控制传输过程 1:root hub的控制传输 在前面看到,对于root hub的情况,流程会转入rh_urb_enqueue().代码如下: static int rh_urb_enqu...
  • kof98765
  • kof98765
  • 2014年07月29日 23:17
  • 1720

Linux内核剪裁指南。。。

导读:   内核功能:   能够完成系统的基本功能,上网,收发邮件等,支持xwindows图形界面。   在menuconfig中配置:   详细介绍内核配置选项及删改情况   第一部分:全部删除 ...
  • eltonzhao
  • eltonzhao
  • 2008年01月24日 21:10
  • 406

Linux下驱动的应用

  • 2012年01月10日 14:56
  • 76KB
  • 下载

Linux那些事儿 之 戏说USB(24)设备的生命线(七)

算是进入了HCD的片儿区,这里的老大不是帮派头目也不是巡逻片儿警,而是几个结构。C里边是以结构为王的,随便到一个新地方,新环境,新山头儿,首先要去结识的就是几个占山为王,雄据一方的结构。在HCD这个片...
  • zhqh100
  • zhqh100
  • 2015年03月26日 09:57
  • 649

uhci ehci ohci及hcdxxx的区别与 usb驱动架构(USB总线分析前奏曲)

摘自:usb协议   最近在做一个usb总线控制器的驱动,用的是一个韩国厂家的.基本上是CPU bus ->芯片->usb设备.   因此我做的驱动类似于uhci ehci ohci的...
  • liangxiaozhang
  • liangxiaozhang
  • 2013年01月10日 14:19
  • 1393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux那些事儿之我是UHCI-引子
举报原因:
原因补充:

(最多只允许输入30个字)