- 论坛徽章:
- 36
|
讨论一下read_eeprom这个函数阿。
程序在 rtl8139_init_one函数中调用该函数:
- addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6;
- for (i = 0; i < 3; i++)
- ((u16 *) (dev->dev_addr))[i] =
- le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len));
复制代码
应该是先读取eerpom的前16bits,如果其值为0x8129则addr_len=8,否则为6。
这个地方有些不太理解是为什么?看一下read_eeprom函数的前半部分:
- static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_len)
- {
- int i;
- unsigned retval = 0;
- int read_cmd = location | (EE_READ_CMD << addr_len);
- RTL_W8 (Cfg9346, EE_ENB & ~EE_CS);
- RTL_W8 (Cfg9346, EE_ENB);
- eeprom_delay ();
- /* Shift the read command bits out. */
- for (i = 4 + addr_len; i >= 0; i--) {
- int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
- RTL_W8 (Cfg9346, EE_ENB | dataval);
- eeprom_delay ();
- RTL_W8 (Cfg9346, EE_ENB | dataval | EE_SHIFT_CLK);
- eeprom_delay ();
- }
- RTL_W8 (Cfg9346, EE_ENB);
- eeprom_delay ();
复制代码
以上代码首先是要组成eerpom的读命令。然后通过写寄存器cfg9346来选中eerpom。并将读命令一个一个bit的写到eerpom中。但是不太理解的是,为什么read_cmd = location | (EE_READ_CMD << addr_len)。
EE_READ_CMD为什么要左移的位数和 addr_len有关,这个参数的作用是什么? |
|