usb_hcd ohci_hcd关系

BigBlackTree 2011-07-26 11:04:07
主机控制器驱动

在Linux内核中,用usb_hcd结构体描述USB主机控制器驱动,它包含USB主机控制器的“家务”信息、硬件资源、状态描述和用于操作主机控制器的hc_driver等,其定义如代码清单20.6所示。

代码清单20.6 usb_hcd结构体
struct usb_hcd {
/* 管理“家务” */ struct usb_bus self;
const char *product_desc;
/* 产品/厂商字符串 */ char irq_descr[24];
/* 驱动 + 总线 # */struct timer_list rh_timer;
/* 根Hub轮询 */ 9 struct urb *status_urb;
/* 目前的状态urb */ /* 硬件信息/状态 */
const struct hc_driver *driver;
/*硬件特定的钩子函数 */ 13 14 /* 需要维护的标志 */ 15 unsigned long flags; 16 #define HCD_FLAG_HW_ACCESSIBLE 0x00000001 17 #define HCD_FLAG_SAW_IRQ 0x00000002 18 19 unsigned rh_registered: 1; /* 根Hub注册? */ 20 21 /* 下一个标志的采用只是“权益之计”,当所有HCDs支持新的根Hub轮询机制后将移除 */ 22 unsigned uses_new_polling: 1; 23 unsigned poll_rh: 1; /* 轮询根Hub状态? */ 24 unsigned poll_pending: 1; /* 状态已经改变? */ 25 26 int irq; /* 被分配的irq */ 27 void _ _iomem *regs; /* 设备内存和I/O */ 28 u64 rsrc_start; /* 内存和I/O资源开始位置 */ 29 u64 rsrc_len; /* 内存和I/O资源长度 */ 30 unsigned power_budget; /* mA, 0 = 无限制 */ 31 32 #define HCD_BUFFER_POOLS 4 33 struct dma_pool *pool[HCD_BUFFER_POOLS]; 34 35 int state; 36 #define _ _ACTIVE 0x01 37 #define _ _SUSPEND 0x04 38 #define _ _TRANSIENT 0x80 39 40 #define HC_STATE_HALT 0 41 #define HC_STATE_RUNNING (_ _ACTIVE) 42 #define HC_STATE_QUIESCING (_ _SUSPEND|_ _TRANSIENT|_ _ACTIVE) 43 #define HC_STATE_RESUMING (_ _SUSPEND|_ _TRANSIENT) 44 #define HC_STATE_SUSPENDED (_ _SUSPEND) 45 46 #define HC_IS_RUNNING(state) ((state) & _ _ACTIVE) 47 #define HC_IS_SUSPENDED(state) ((state) & _ _SUSPEND) 48 /* 主机控制器驱动的私有数据 */ 49 unsigned long hcd_priv[0]_ _attribute_ _((aligned(sizeof(unsigned long)))); 50 };



OHCI主机控制器驱动

OHCI HCD驱动属于HCD驱动的实例,它定义了一个ohci_hcd结构体,作为代码清单20.6给出的usb_hcd结构体的私有数据,这个结构体的定义如代码清单20.8所示。

代码清单20.8 ohci_hcd结构体
struct ohci_hcd 2 { 3 spinlock_t lock; 4 5 /* 与主机控制器通信的I/O内存(DMA一致) */ 6 struct ohci_regs _ _iomem *regs; 7 8 /* 与主机控制器通信的主存(DMA一致) */ 9 struct ohci_hcca *hcca; 10 dma_addr_t hcca_dma; 11 12 struct ed *ed_rm_list; /* 将被移除 */ 13 struct ed *ed_bulktail; /* 批量队列尾 */ 14 struct ed *ed_controltail; /* 控制队列尾 */ 15 struct ed *periodic[NUM_INTS]; /* int_table“影子” */ 16 17 /* OTG控制器和收发器需要软件交互,其他的外部收发器应该是软件透明的 */ 18 struct otg_transceiver *transceiver; 19 20 /* 队列数据的内存管理 */ 21 struct dma_pool *td_cache; 22 struct dma_pool *ed_cache; 23 struct td *td_hash[TD_HASH_SIZE]; 24 struct list_head pending; 25 26 /* driver状态 */ 27 int num_ports; 28 int load[NUM_INTS]; 29 u32 hc_control; /* 主机控制器控制寄存器的复制 */ 30 unsigned long next_statechange; /* 挂起/恢复 */ 31 u32 fminterval; /* 被保存的寄存器 */ 32 33 struct notifier_block reboot_notifier; 34 unsigned long flags; 35 };


上面代码稍微有点乱,其实就是两个结构体,是关于usb主控驱动的,我现在不明白的是usb_hcd和ohci_hcd到底有什么关系,上面说的“OHCI HCD驱动属于HCD驱动的实例,它定义了一个ohci_hcd结构体,作为代码清单20.6给出的usb_hcd结构体的私有数据”这句我也看不懂,望赐教
...全文
632 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧