关于编译Linux-2.6.38.8内核时s3c_device_ohci未定义问题的分析

  在编译Linux-2.6.38.8内核的最后阶段出现s3c_device_ohci未定义的错误: 
  1. arch/arm/mach-s3c2410/built-in.o:(.init.data+0x30): undefined reference to `s3c_device_ohci'  
  2. make: *** [.tmp_vmlinux1] Error 1  

    根据错误信息可知,错误出现在arch/arm/mach-s3c2410目录下所有目标文件链接成built-in.o的时候,所以首先要找出此目录下的什么文件使用了s3c_device_ohci,方法是在此目录下使用以下命令查找: 

  1. $ grep "s3c_device_ohci" -nR .  

    查找结果: 

  1. ./mach-smdk2410.c:90:   &s3c_device_ohci,  
  2. ./mach-h1940.c:385: &s3c_device_ohci,  
  3. Binary file ./mach-smdk2410.o matches  
  4. ./mach-vr1000.c:337:    &s3c_device_ohci,  
  5. ./mach-qt2410.c:250:    &s3c_device_ohci,  
  6. ./mach-bast.c:586:  &s3c_device_ohci,  
  7. ./mach-tct_hammer.c:132:    &s3c_device_ohci,  
  8. ./mach-n30.c:381:   &s3c_device_ohci,  
  9. Binary file ./built-in.o matches  
  10. ./mach-otom.c:95:   &s3c_device_ohci,  
  11. ./mach-amlm5900.c:157:  &s3c_device_ohci,  

    在arch/arm/mach-s3c2410/mach-smdk2410.c文件中的第90行,s3c_device_ohci被作为平台设备在系统初始化阶段被使用。

    那么它在哪里定义的呢?

    这样的定义一定与具体的平台有关,在Linux-2.6.38.8内核中它被定义在arch/arm/plat-samsung目录下的dev-usb.c文件中,因为在默认情况下dev-usb.c文件并没有被编译,而且在配置界面上也没有相关的选择提示,所以才会出现这样的错误。

    现在要做的就是想办法把它配置进去,方法如下:

    (1)、在arch/arm/plat-samsung/Makfile文件中找到dev-usb.o对应的配置选项CONFIG_S3C_DEV_USB_HOST,然后从当前目录下的Kconfig文件中找到S3C_DEV_USB_HOST,并在它的bool后添加选择提示,如下所示:

  1. config S3C_DEV_USB_HOST  
  2.     bool "support S3C_DEV_USB_HOST"  
  3.     help  
  4.       Compile in platform device definition for USB host.  

    (2)、执行make menuconfig并在配置界面中把它选上即可。    

  1. System Type --->  
  2.            [* ] support S3C_DEV_USB_HOST (NEW) 

<think>嗯,用户问的是Linux内核USB驱动中一个关于Makefile和源文件的问题。用户发现Makefile里有CONFIG_USB_XHCI_HCD这个配置项,但找不到对应的xhci-hcd.c文件。这确实是个容易让人困惑的点,特别是对刚接触内核驱动开发的人来说。 从用户的问题描述看,ta应该正在研究或开发USB相关驱动,可能遇到了编译或配置上的疑问。用户能注意到Makefile和源文件名的对应关系,说明已经有一定内核模块编译的基础知识,但对Kconfig-Makefile的联动机制可能还不完全清楚。 我注意到几个关键点需要解释清楚:首先内核的配置系统是Kconfig和Makefile配合工作的,CONFIG_USB_XHCI_HCD这个配置项在Kconfig里定义,然后在Makefile里通过obj-$(CONFIG_USB_XHCI_HCD)来关联要编译的文件。但这里有个重要细节——实际编译的目标文件是ohci-hcd.o,但对应的源码文件名却是ohci-hcd.c,命名并不完全一致。用户可能正是被这个命名差异迷惑了。 需要特别说明的是,xhci-hcd.c这个文件名用户找不到是正常的,因为根本不存在。正确的核心文件是xhci.c,这个从引用[4]里也能证实。用户可能因为看到配置项叫XHCI_HCD就理所当然认为源码文件也叫xhci-hcd.c,其实内核的命名习惯更简洁。 另外从引用[2][3]可以看出,XHCI驱动是模块化设计的,包含PCI和Platform两种实现方式,这些子模块的配置项都在同一个Kconfig菜单下。在Makefile里会通过条件判断来包含不同文件,比如xhci-pci.c或xhci-plat.c等,但核心逻辑仍在xhci.c中。 用户可能还隐含了一个疑问:为什么配置项和文件名不是严格对应?这其实反映了Linux内核的命名规范——配置项强调功能描述(XHCI_HCD表示这是个主机控制器驱动),而文件名更侧重实际实现的技术主体(xHCI规范的核心实现)。 最后要注意提醒用户,在开发自定义驱动(如引用[5]的示例),模块名(aiot_simple_usb.o)和源码文件名(aiot_simple_usb.c)必须严格匹配,这与内核自带驱动的命名规则不同。</think>在Linux内核USB驱动中,`CONFIG_USB_XHCI_HCD`配置项存在但找不到`xhci-hcd.c`文件的原因是**源码文件名与配置项名称存在差异**,且驱动实现分散在多个文件中。以下是具体分析--- ### 1. **配置项与源码的对应关系** - `CONFIG_USB_XHCI_HCD`是Kconfig中定义的配置选项(见引用[2]),用于控制xHCI驱动的编译: ```kconfig config USB_XHCI_HCD tristate "xHCI HCD (USB 3.0) support" ``` - 在Makefile中,该配置项关联的编译目标为`xhci-hcd.o`(见引用[2]): ```makefile obj-$(CONFIG_USB_XHCI_HCD) += xhci-hcd.o ``` - **关键点**:`xhci-hcd.o`是**目标文件**,其对应的源码文件是`xhci.c`(而非`xhci-hcd.c`)。 通过查看内核源码树可验证: ```bash drivers/usb/host/ ├── xhci.c # 核心实现 ├── xhci.h # 头文件 ├── xhci-plat.c # 平台相关代码(如ARM SoC) ├── xhci-pci.c # PCI控制器支持 └── ... ``` --- ### 2. **源码文件分散设计** xHCI驱动采用模块化设计: - **`xhci.c`** 包含xHCI规范的核心逻辑(寄存器操作、队列管理等)。 - **`xhci-pci.c`/`xhci-plat.c`** 实现硬件适配层: - `xhci-pci.c`:处理PCI接口的控制器(如PC主板)。 - `xhci-plat.c`:支持非PCI的嵌入式SoC(如引用[2]中的Marvell/Renesas芯片)。 - 通过Makefile整合: ```makefile xhci-hcd-y := xhci.o xhci-mem.o xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-$(CONFIG_PCI) += xhci-pci.o xhci-hcd-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat.o ``` --- ### 3. **为何找不到`xhci-hcd.c`?** - **命名惯例**:内核驱动常用`<驱动名>.c`作为主文件(如`xhci.c`),而非严格匹配配置项名称。 - **构建逻辑**:`xhci-hcd.o`是最终生成的目标文件,它由多个源码文件编译链接而成(如`xhci.o`由`xhci.c`编译)。 --- ### 4. **配置与编译流程** 1. **启用配置**: 通过`make menuconfig`选择`CONFIG_USB_XHCI_HCD=y/m`(引用[3])。 2. **编译驱动**: Makefile将`xhci.c`等文件编译为`xhci-hcd.ko`(模块)或链接进内核3. **加载驱动**: 若编译为模块,加载后生成`xhci_hcd`内核模块(见引用[2]说明)。 --- ### 总结 - **正确源码文件**:xHCI核心实现位于`drivers/usb/host/xhci.c`。 - **配置项作用**:`CONFIG_USB_XHCI_HCD`控制整个xHCI驱动的编译,包括子模块(PCI/Platform)。 - **文件命名差异**:目标文件`xhci-hcd.o`对应源码`xhci.c`,符合内核代码组织惯例。 > 参考资料: > [^1]: Linux内核Makefile中通过`obj-$(CONFIG_*)`关联配置项与目标文件。 > [^2]: xHCI驱动的Kconfig定义及模块化设计(`xhci-pci.c`/`xhci-plat.c`)。 > [^3]: 模块编译配置示例(`CONFIG_USB_XHCI_HCD=m`生成`xhci-hcd.ko`)。 --- ### 相关问题 1. **如何为自定义硬件添加xHCI驱动支持?** 需实现平台相关代码并注册到`xhci-plat.c`框架中[^2]。 2. **xHCI驱动如何处理USB 3.0与2.0设备的兼容性?** 通过`xhci.c`中的协议转换层和虚拟化根集线器实现。 3. **调试xHCI驱动常用哪些内核工具?** 如`usbmon`、`xhci-dbg.c`中的调试接口及`dmesg`日志分析。 4. **当`CONFIG_USB_XHCI_HCD=y`但设备未识别,如何排查?** 检查PCI/ACPI枚举、硬件兼容性及`dmesg`中的xHCI初始化日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值