我正在尝试了解与使用 RTL8187 Wi-Fi 芯片的 Wi-Fi 卡相关的 Linux 驱动程序源代码。具体来说,我试图在 USB 协议层跟踪 Linux 与 ALFA AWUS036H USB Wi-Fi 卡的交互。到目前为止,我一直在使用两种方法来执行此操作,1)
将printk()
语句放入源代码并2)
查看usbmon
. 使用这两种方法,我可以跟踪低级别发生的事情,但不了解它为什么会在高级别发生。
在这一点上,我特别关注的是,看起来 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 设备内的 USB 和 EEPROM 之间的交互是什么?我不知道从哪里开始寻找更多信息。我一直认为 EEPROM 之类的东西会从 USB 编程器中抽象出来,使用简单的 USB 消息,然后设备会将这些消息转换为 EEPROM 中必须发生的任何事情。进一步深入研究 USB 驱动程序代码,虽然看起来有高脉冲和低脉冲发送到 EEPROM,以及操作之间的特定(尽管非描述性)时序延迟,这似乎意味着不存在这样的抽象。我真的不知道从哪里开始了解所有元素如何协同工作。