首页 理论教育深入剖析Linux内核驱动

深入剖析Linux内核驱动

【摘要】:DM 3730的USB主机控制器框架如图7-17所示。Linux内核为各种USB总线控制器开发了标准的操作接口,EHCI同样提供了统一的操作接口。

DM 3730的USB主机控制器框架如图7-17所示。图7-17引自《DM 3730芯片手册》中第3247页的框图。

从图7-17中可见,DM 3730中包含OHCI和EHCI,另外是一些连接属性的配置,这里以EHCI为例进行介绍。

1.初始化

先来看看初始化部分,还是通过platform driver的probe函数来了解细节,其内容如下:

978-7-111-49426-3-Chapter07-186.jpg

图7-17 DM 3730 USB主机控制器框架图

978-7-111-49426-3-Chapter07-187.jpg

978-7-111-49426-3-Chapter07-188.jpg

978-7-111-49426-3-Chapter07-189.jpg

从分析中可见,主要的工作是进行属性的设置、资源的申请和接口的注册,然后通过usb_add_hcd的调用实现功能。

相应的platform device是在系统初始化时通过usb_ehci_init进行的,这里就不进行详述了。(www.chuimin.cn)

2.总线传输

总线传输的控制器接口是由hc_driver来定义的,DM 3730 ehci相关的功能由ehci_omap_hc_driver来实现,具体细节如下:

978-7-111-49426-3-Chapter07-190.jpg

从中可见,主要的接口都是标准的EHCI操作接口。Linux内核为各种USB总线控制器开发了标准的操作接口,EHCI同样提供了统一的操作接口。EHCI总线控制器整体架构如图7-18所示。图7-18引自《EHCI规范》。

从图7-18中可见,EHCI将传输分为periodic和asynchronous两个调度队列,中断和周期传输使用periodic调度,而其他传输使用asynchronous队列。EHCI的调度和传输都是通过ehci-q.c和ehci-sched.c来实现的。

978-7-111-49426-3-Chapter07-191.jpg

图7-18 EHCI USB总线控制器整体框图

EHCI控制器实现原理:处理器需要把ISO数据和INT数据建立一张表放在内存中,而ECHI的寄存器FRINDEX则会跟踪这个表,每一个时间片加1,FRINDEX所指之处,控制器就会把这个指针所指向的数据结构中的数据送到总线上去。除了周期调度EHCI控制器外,还提拱了另一种调度来处理实时性要求不高的数据,叫做异步调度。处理器把块传输和控制传输的数据按协议要求的数据结构在内存中安排并建立一个链表,Async List Addr则会跟踪这个链表,总线控制器则把Async List Addr所指向的数据搬运到USB总线上去。

EHCI的实现都是按照EHCI控制器规范来做的,其中涉及很多EHCI规范的内容,这里就不进行详细分析了。