【发布时间】:2012-08-06 06:44:08
【问题描述】:
我正在尝试了解与使用 RTL8187 Wi-Fi 芯片的 Wi-Fi 卡相关的 Linux 驱动程序源代码。具体来说,我试图在 USB 协议层跟踪 Linux 与 ALFA AWUS036H USB Wi-Fi 卡的交互。到目前为止,我一直在使用两种方法来做到这一点1) 将printk() 语句放入源代码中,2) 查看usbmon 的十六进制输出。使用这两种方法,我可以跟踪 what 正在发生低级别,但没有任何理解 为什么 它发生在高级别。
此时我特别关注的是,看起来 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 控制消息,但我在 eeprom_83cx6_multiread() 的子例程中的其他 printk() 语句表明这个简单的操作会生成大约 60 个或更多 USB 控制消息读取,并且可能与 USB 控制写入一样多。
是否有任何高级教程可以解释 USB 设备内的 USB 和 EEPROM 之间的交互是什么?我不知道从哪里开始寻找更多信息。我一直认为 EEPROM 之类的东西会从 USB 编程器中抽象出来,使用简单的 USB 消息,然后设备会将这些消息转换为 EEPROM 中必须发生的任何事情。进一步深入研究 USB 驱动程序代码,虽然看起来有高脉冲和低脉冲发送到 EEPROM,以及操作之间的特定(尽管非描述性)时序延迟,这似乎意味着不存在这样的抽象。我真的不知道从哪里开始了解所有元素如何协同工作。
【问题讨论】:
标签: linux usb wifi driver eeprom