没有合适的资源?快使用搜索试试~ 我知道了~
uhci作了些更正 不建议下载
资源详情
资源评论
资源推荐
Linux 那些事儿之我是 UHCI
UHCI 主机控制器的驱动程序,2.6.22.1 中的代码.
引子 ...........................................................................................2
开户和销户 ...............................................................................5
PCI,我们来了! ........................................................................9
物以类聚 .................................................................................14
IO 内存和 IO 端口 ..................................................................20
传说中的 DMA.......................................................................25
来来,我是一条总线,线线线线线线 ........................................33
主机控制器的初始化(一).......................................................37
主机控制器的初始化(二).......................................................40
有一种资源,叫中断.................................................................46
一个函数引发的故事(一).......................................................48
一个函数引发的故事(二).......................................................52
一个函数引发的故事(三).......................................................57
一个函数引发的故事(四).......................................................63
一个函数引发的故事(五).......................................................65
Root Hub 的注册.....................................................................68
寂寞在唱歌 .............................................................................71
Root Hub 的控制传输(一).......................................................80
Root Hub 的控制传输(二).......................................................90
非 Root Hub 的控制传输 ......................................................105
PDF created with pdfFactory trial version www.pdffactory.com
非 Root Hub 的 Bulk 传输 ....................................................119
传说中的中断服务程序(ISR)...............................................125
Root Hub 的中断传输 ...........................................................145
非 Root Hub 的中断传输 ......................................................147
等时传输 ...............................................................................159
实战电源管理(一).................................................................165
实战电源管理(二).................................................................173
实战电源管理(三).................................................................178
实战电源管理(四).................................................................184
FSBR.....................................................................................192
(大结局)脱就一个字 .............................................................199
引子
写一下 UHCI 吧,也顺便怀念一下 Intel,以及 Intel 的那几个女同事们,好久没联系了,你们可好?
UHCI是 Intel 提出来的.虽然离开 Intel 一年多了,但我总觉得也许有一天我还会回到 Intel.所以关于 Intel的东西,我多
少会关注一下.我挺怀念 Intel 的,虽然钱也不多,但是那时候毕竟刚毕业,对钱的问题也没想太多.
UHCI 全名 Universal Host Controller Interface,它是一种 USB 主机控制器的接口规范,江湖中把遵守它的硬件称为
UHCI 主机控制器.在 Linux 中,把这种硬件叫做 HC,或者说 Host Controller,而把与它对应的软件叫做 HCD.即 HC
Driver.Linux 中这个 HCD 所对应的模块叫做 uhci-hcd.
当我们看一个模块的时候,首先是看 Kconfig 和 Makefile 文件.在 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
PDF created with pdfFactory trial version www.pdffactory.com
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_USB和 CONFIG_PCI,很显然这两个选项代表着 Linux中 usb的核心代码和 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
PDF created with pdfFactory trial version www.pdffactory.com
972 MODULE_AUTHOR(DRIVER_AUTHOR);
973 MODULE_DESCRIPTION(DRIVER_DESC);
974 MODULE_LICENSE("GPL");
正如每个女人都应该有一支口红,每个模块都应该有两个宏,它们是 module_init 和 module_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);
PDF created with pdfFactory trial version www.pdffactory.com
952
953 debug_failed:
954 kfree(errbuf);
955
956 errbuf_failed:
957
958 return retval;
959 }
我不知道这个函数算不算我们迄今为止最有技术含量的一个函数.我甚至怀疑,以前写代码的哥们喜欢用冗长的函
数来吓唬我,后来,通过我像祥林嫂般的不断<<呐喊>>,他们也开始<<彷徨>>,他们也开始<<友邦惊诧>>,他们发现,那种
冗长的代码就像雷锋塔一样,迟早要倒掉的.所以他们修正了自己写代码的风格,也算是<<从百草园到三味书屋>>了吧,
只可惜,我在复旦荒废了四年光阴,毕业后文化程度远不及<<孔乙己>>,充其量也就是<<少年闰土>>的水准.所以,眼前这
个函数,对我来说,只能说,简约,而不简单.莫非…难道…写代码的哥们都穿了利郎商务男装?要不就是他们都是陈道明的
粉丝.
开户和销户
之所以说 uhci_hcd_init 有技术含量,并不是说它包含多么精巧的算法,包含多么复杂的数据结构.而是因为这其中涉
及了很多东西.首先 924 行,usb_disable 涉及了 Linux 中的内核参数的概念.928 行 的 kmalloc 和 936 行的
kmem_cache_create 涉及了 Linux 内核中内存申请的问题,931 行 debugfs_create_dir 则涉及到了文件系统,一个虚拟的文
件系统 debugfs,而 941 行 pci_register_driver 则涉及到了 Linux 中 pci 设备驱动程序的注册.
这么多东西往这里一堆,其复杂程度立马就上来了.在这个共和国 58 周年的喜庆日子里,我是多么希望我们的伟大祖
国繁荣昌盛啊!同时,我又是多么希望这个函数有且只有 921 那么一行 printk 语句啊!
第一,内核参数,什么是内核参数?看一下你的 grub 文件,
title SUSE Linux Enterprise Server 10 (kdb enabled)
kernel (hd0,2)/boot/vmlinuz-2.6.22.1-test root=/dev/hda3 resume=/dev/hda2 splash=silent showopts
initrd /boot/initrd-2.6.22.1-test
kernel 那行的都是内核参数,比如 root,比如 resume,比如 splash,比如 showopts.其中 root=代表的是你的 Root 文件系统
的位置,resume=代表的是你用来做 software suspend 恢复的那个分区,而 usb 子系统也准备了这么一个参数,其名字就叫
做 nousb.所以你可以往这一行后面加上 nousb,这就意味着你的系统不需要支持 usb,或者换一种说法,你把 usb 子系统给
disable 掉了.nousb 默认为 0,你设置了它就为 1.而 usb_disabled 返回的就是 nousb 的值.我们在 drivers/usb/core/usb.c 中也
能看到这个函数:
852 /*
853 * for external read access to <nousb>
854 */
855 int usb_disabled(void)
856 {
857 return nousb;
858 }
PDF created with pdfFactory trial version www.pdffactory.com
剩余203页未读,继续阅读
zhangyiheng
- 粉丝: 6
- 资源: 103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (完整数据)各省数字普惠金融指数总指数及各分项指数覆盖广度、使用深度、数字化程度2011-2023年
- (完整数据)全国及各城市POI数据(2023年含七大主要城市数据))_second.zip
- (完整数据)全国及各城市POI数据(全新整理2012-2023年
- (完整数据)全国328个城市的·气_象·面板数据:PM2.5、PM10、SO2、NO2、O3、CO2013-2022年
- (完整数据)中国市级政府财政透明度数据2012-2023年
- 用 Rust 编写的视频游戏覆盖框架,支持 DirectX 和 OpenGL.zip
- GeoGebra科学计算器.apk
- SpringBoo中Mybatis多数据源动态切换
- 用于 C++2a 实时编码演示的 Windows 桌面复制工具.zip
- CnPack 密码算法库
- 用于 DayZ 生存游戏的基于外部内存的雷达 - (DirectX、ImGUI).zip
- 2019-2022 csp-j/s真题
- 用于 DirectX 编程的现代 C++ 库.zip
- 用于 egui 的 Direct3D11 渲染器.zip
- 用于 Ruby 的 DirectX.zip
- 用于 Unity 3D 的星系生成器,具有自定义粒子分布器、DirectX 11 粒子和高度定制的曲线驱动生成 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0