2012-08-06 102 views
2

我想了解使用RTL8187 Wi-Fi芯片与Wi-Fi卡相关的Linux驱动程序源代码。具体来说,我试图在USB协议层跟踪Linux与ALFA AWUS036H USB Wi-Fi卡的交互。我一直在使用两种方法来做到这一点的源代码和2)迄今1)printk()陈述观看的usbmon的十六进制输出。使用这两种方法我可以追踪什么正在发生低的水平,但没有为什么任何理解它是在一个较高水平发生。Linux USB内核驱动程序如何与USB Wi-Fi卡内的EEPROM交互?

在这一点上我特别注意的是,它看起来好像rtl8187驱动程序所做的第一件事情是USB设备中的EEPROM上的一整个读/写操作,而我没有很好的理解EEPROM如何在USB设备内部(或者外部)工作。作为一个例子,我已经把打印语句周围的代码行中/usr/src/linux/drivers/net/wireless/rtl818x/rtl8187/dev.c,我相信从USB Wi-Fi卡的MAC地址是阅读:

printk(KERN_INFO "COMMENCING reading MAC address, I think..."); 
eeprom_93cx6_multiread(&eeprom, RTL8187_EEPROM_MAC_ADDR, 
       (__le16 __force *)mac_addr, 3); 
printk(KERN_INFO "DONE reading MAC address, I think..."); 

现在我本来以为这样的事情可能会产生短短USB控制消息,但其他printk()陈述我的eeprom_83cx6_multiread()子程序中表明,这种简单的操作60以上的USB控制消息的顺序产生的读取和可能只是尽可能多的USB控制写入。

有没有一种高层次的教程的地方,解释的相互作用是什么USB和EEPROM的USB设备内部之间?我对从哪里开始寻找更多信息感到不知所措。我一直认为像EEPROM这样的东西可以从USB编程器中抽象出来,并带有简单的USB信息,然后该器件将转换成EEPROM中必须发生的任何事情。进一步深入研究USB驱动程序代码,虽然它看起来像是发送给EEPROM的高脉冲和低脉冲,以及操作之间的特定(虽然非描述性)时间延迟,这似乎意味着不存在这样的抽象。我真的不知道该从哪里开始了解所有元素如何一起工作。

回答

4

这真的取决于芯片上。

有时(在这种情况下,虽然)司机只会询问芯片“给我EEPROM中的N个字节开始偏移O”的,然后它是由芯片实际上与EEPROM通信,获取数据并将其提供给驱动程序。在这种情况下,驱动程序不需要知道它是什么样的eeprom或如何与它交谈。

在其他情况下,像这样,芯片只是通过USB接口暴露所有(或大部分)存储器映射,而驱动器则通过从必要存储器位置读取/写入来完成所有工作。连接到eeprom的芯片上的引脚可通过该存储器映射进行访问,并且在这种情况下对eeprom的访问是通过对串行协议进行位反转来实现的。

所以,为了使驱动读取MAC的值解决由读/在存储器映射中写入适当的寄存器,将读/写这些引脚一次一个。每当一个引脚切换或读取多个控制消息时都会进行交换,这就是为什么你会看到如此多的控制消息。

这样做的一个原因是为了降低成本,尽可能多地在驱动程序中完成逻辑,而不是芯片本身。现在,这样做,特别是通过USB,这是非常低效的(与其他方法相比),但是对于这种情况下的EEPROM访问,这并不重要,因为它很少进行。