规范化driver的printk

本文详细解析了Linux内核中关于设备调试的一系列封装,包括如何使用dev_printk函数进行日志输出,以及针对不同级别的调试信息的封装函数如dev_err、dev_info等。此外,文章还讨论了如何在特定模块上进行调试信息开关的封装。

转自:http://hi.baidu.com/littertiger/blog/item/5bae2c38970934f1b311c725.html


看2.6.20的代码,发现里面用了dev_err,仔细一看才知道不知什么时候,在include/linux/device.h里面对于printk有一组完整的封装。
#define dev_printk(level, dev, format, arg...) \
        printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)

#ifdef DEBUG
#define dev_dbg(dev, format, arg...)            \
        dev_printk(KERN_DEBUG , dev , format , ## arg)
#else
#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0)
#endif

#define dev_err(dev, format, arg...)            \
        dev_printk(KERN_ERR , dev , format , ## arg)
#define dev_info(dev, format, arg...)           \
        dev_printk(KERN_INFO , dev , format , ## arg)
#define dev_warn(dev, format, arg...)           \
        dev_printk(KERN_WARNING , dev , format , ## arg)
#define dev_notice(dev, format, arg...)         \
        dev_printk(KERN_NOTICE , dev , format , ## arg)

主要是在printk的时候,不用些module/device名字了。
不过单个module的调试信息开关,还得需要在这之上封装哟。

<think>嗯,用户这次聚焦在usb_xhci_driver结构体上,结合之前的讨论和引用资料来看,ta应该是在研究Linux USB主机控制器的驱动框架。用户可能正在开发或调试xHCI相关驱动,需要理解这个核心结构体的设计意图。 从引用[3]提到的USB驱动层次来看,usb_xhci_driver属于“USB主机控制器驱动层”的核心。引用[1]和[2]补充了重要背景:USB设备驱动其实包含总线相关和功能相关两部分,而usb_xhci_driver正是前者在xHCI规范下的具体实现。 用户提到的usb_xhci_driver应该就是之前讨论的xhci_hc_driver的完整名称。需要重点说明三点:第一,这个结构体本质是struct hc_driver的xHCI实现;第二,它通过函数指针抽象了硬件操作;第三,它像模板一样被PCI/ACPI等具体总线驱动复用。 注意到用户引用的资料提到usb_driver(引用[4])和USBD层(引用[2]),在回答时需要区分清楚:usb_xhci_driver属于比usb_driver更底层的驱动,直接操作主机控制器硬件,而USBD层的功能实际由它和USB核心共同实现。 用户可能存在的认知盲区是:为什么需要这么复杂的层次划分?这其实在引用[3]的四层架构里已有暗示——为了支持不同厂商的xHCI控制器,同时保持上层USB核心和USB设备驱动的通用性。在回答时要强调“硬件差异隔离”和“接口标准化”这两个设计要点。 最后需要提醒自己:用户提供的引用[4]关于usb_driver的描述容易造成概念混淆,在回答中要明确区分host controller driver(usb_xhci_driver)和device driver(usb_driver)的层级关系。</think>在 Linux USB 主机控制器驱动架构中,`usb_xhci_driver`(通常指 `xhci_hc_driver`)结构体是 **xHCI (eXtensible Host Controller Interface) 规范的核心驱动实现**,其作用与应用场景如下: --- ### **一、核心作用** 1. **抽象硬件操作接口** `usb_xhci_driver` 是 `struct hc_driver` 类型的实例,定义了 USB 核心层(`usbcore`)与 xHCI 硬件交互的标准操作函数集,包括: - **初始化与控制**:`reset()`(控制器复位)、`start()`(启动传输)、`stop()`(停止传输)[^3]。 - **数据传输**:`urb_enqueue()`(提交 USB 请求块)、`urb_dequeue()`(取消请求)[^3]。 - **根集线器模拟**:`hub_status_data()`(获取端口状态)、`hub_control()`(控制端口电源/复位等)[^2][^4]。 - **中断处理**:`irq()`(处理硬件中断)。 - **电源管理**:`suspend()`、`resume()`(休眠与唤醒)[^3]。 2. **实现 xHCI 规范逻辑** 其函数指针指向 xHCI 规范的具体实现(如 `xhci_urb_enqueue`, `xhci_hub_control`),封装了与 xHCI 寄存器交互的底层操作,例如: - 调度传输描述符(Transfer Descriptors)到硬件队列。 - 解析事件环(Event Ring)处理完成事件[^3]。 3. **分离硬件差异与通用逻辑** 作为**驱动模板**,被具体总线驱动(如 PCI、ACPI)复制并扩展: ```c // xhci-pci.c 示例:复制模板并扩展 PCI 相关逻辑 static struct hc_driver xhci_pci_hc_driver = { ... }; memcpy(&xhci_pci_hc_driver, &xhci_hc_driver, sizeof(xhci_hc_driver)); xhci_pci_hc_driver.pci_suspend = xhci_pci_suspend; // 添加 PCI 特有函数 ``` 这样不同总线的 xHCI 控制器(如 Intel PCIe 或 ARM SoC 集成控制器)可复用核心逻辑[^3]。 --- ### **二、在 USB 设备驱动开发中的应用场景** 1. **支持 USB 3.x/4 主机控制器** `usb_xhci_driver` 是 Linux 支持 USB 3.0+ 设备的基础。当用户插入 USB 设备时: - USB 核心层通过 `usb_xhci_driver.urb_enqueue` 提交数据请求。 - xHCI 硬件处理传输后,通过 `irq()` 触发中断,由驱动完成回调[^2][^3]。 2. **实现 USB 核心层要求的接口** USB 设备驱动(如 USB 键盘、存储驱动)通过 **USB 核心层**的统一接口(如 `usb_submit_urb()`)提交请求,无需感知底层控制器类型。`usb_xhci_driver` 将这些通用接口转化为 xHCI 硬件操作[^1][^3]。 3. **多控制器兼容性保障** 开发新的 xHCI 兼容控制器驱动时: - 复制 `usb_xhci_driver` 模板,初始化总线相关部分(如 PCI 设备探测)。 - 无需重写传输、集线器控制等核心逻辑,大幅减少开发成本[^3]。 4. **性能优化与调试** 通过修改 `usb_xhci_driver` 的函数实现(如调度算法),可优化传输效率或添加调试日志: ```c // 示例:调试 URB 提交 static int xhci_dbg_urb_enqueue(...) { printk("URB submitted: endpoint %d\n", urb->ep->desc.bEndpointAddress); return xhci_urb_enqueue(...); // 调用原始函数 } // 替换驱动模板中的函数 xhci_hc_driver.urb_enqueue = xhci_dbg_urb_enqueue; ``` --- ### **三、与 USB 设备驱动的层级关系** 根据 Linux USB 驱动层次[^3]: 1. **硬件层**:xHCI 主机控制器(如 Intel USB 3.0 芯片)。 2. **主机控制器驱动层**:`usb_xhci_driver`(实现硬件操作)。 3. **USB 核心层**:`usbcore`(管理设备、配置、接口)。 4. **USB 设备驱动层**:如 `usb_storage`(U 盘驱动)、`hid-usb`(USB 键盘驱动)。 > ✅ **关键点**:USB 设备驱动通过核心层接口访问硬件,**无需直接调用 `usb_xhci_driver`**。例如 U 盘驱动调用 `usb_submit_urb()` 提交读写请求,核心层将其路由到 `usb_xhci_driver.urb_enqueue()`[^1][^3]。 --- ### **总结** | **角色** | **作用** | |-------------------------|--------------------------------------------------------------------------| | **xHCI 规范实现者** | 封装 xHCI 寄存器操作,处理传输/中断/电源管理。 | | **USB 核心层适配器** | 为 USB 核心提供标准操作函数集(`struct hc_driver`)。 | | **硬件差异隔离层** | 通过模板复用,使不同总线(PCI/ACPI)的 xHCI 驱动共享核心逻辑。 | | **性能与调试切入点** | 修改其函数实现可优化传输或添加调试支持。 | 在 USB 设备驱动开发中,`usb_xhci_driver` 是**底层硬件控制的关键桥梁**,确保 USB 核心层与设备驱动无需关注 xHCI 硬件细节,实现“一次编写,多控制器支持”[^1][^3][^4]。 --- ### **相关问题** 1. **`usb_xhci_driver` 如何与 USB 核心层的 `struct usb_hcd` 交互?** `usb_hcd` 代表一个主机控制器实例,其 `driver` 成员指向 `usb_xhci_driver`,通过 `hcd->driver->reset()` 等函数调用硬件操作[^3]。 2. **在 USB 设备枚举过程中,`usb_xhci_driver` 的哪些函数会被调用?** 主要涉及 `hub_status_data()`(检测设备插入)和 `hub_control()`(复位端口、分配地址)[^2][^4]。 3. **如何为嵌入式 SoC 的 xHCI 控制器编写驱动?** 复制 `usb_xhci_driver` 模板,在平台驱动(`platform_driver`)中初始化寄存器并注册 `struct usb_hcd`[^3]。 4. **`usb_xhci_driver.urb_enqueue` 如何实现异步传输?** 将 URB 请求转化为传输描述符(TD),链接到硬件队列,硬件完成后通过中断通知驱动[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值