DM9000_IO DM9000C bus与 CPU总线连接,CPU分配的地址段,PIN CMD为低
DM9000_DATA DM9000C bus与 CPU总线连接,CPU分配的地址段,PIN CMD为高
读寄存器值
static u8 DM9000_ior(int reg)
{
先向DM9000C写入reg
DM9000_outb(reg, DM9000_IO);
然后通过CMD拉高,读出IO值,即为reg值
return DM9000_inb(DM9000_DATA);
}
写寄存器值
static void DM9000_iow(int reg, u8 value)
{
通过IO写reg值给DM9000C
DM9000_outb(reg, DM9000_IO);
CMD拉高后,把reg数据写到dm9000c对应的reg中
DM9000_outb(value, DM9000_DATA);
}
PHY的读写与EERPOM读写流程相似,详见以下分析
static u16 dm9000_phy_read(int reg)
{
u16 val;
第一步把PHY reg 值写入DM9000C 指定寄存器DM9000_EPAR
DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
然后向寄存器DM9000_EPCR发出读的命令
DM9000_iow(DM9000_EPCR, 0xc);
等待读完成
udelay(100);
清除读命令,停读动作
DM9000_iow(DM9000_EPCR, 0x0);
16bit值的phy reg 数据分别存放在两个DM9000C寄存器中DM9000_EPDRH,DM9000_EPDRL
val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);
return val;
}
写寄存器值
static void dm9000_phy_write(int reg, u16 value)
{
PHY reg值写入DM9000C寄存器DM9000_EPAR
DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
把PHY reg data分别存入指定寄存器DM9000_EPDRL , DM9000_EPDRH
DM9000_iow(DM9000_EPDRL, (value & 0xff));
DM9000_iow(DM9000_EPDRH, ((value >> 8) & 0xff));
向DM9000_EPCR发送写phy reg data指令
DM9000_iow(DM9000_EPCR, 0xa);
等待写完成
udelay(500);
清除写命令,停写phy reg动作
DM9000_iow(DM9000_EPCR, 0x0);
DM9000_DBG("dm9000_phy_write(reg:0x%x, value:0x%x)\n", reg, value);
}
读写EEPROM和读写PHY REG流程相同,
唯一的区别是写phy reg值与写EEPROM位移值到DM9000C指定寄存器时有区别。
void dm9000_read_srom_word(int offset, u8 *to)
{
DM9000_iow(DM9000_EPAR, offset);
DM9000_iow(DM9000_EPCR, 0x4);
udelay(8000);
DM9000_iow(DM9000_EPCR, 0x0);
to[0] = DM9000_ior(DM9000_EPDRL);
to[1] = DM9000_ior(DM9000_EPDRH);
}
void dm9000_write_srom_word(int offset, u16 val)
{
DM9000_iow(DM9000_EPAR, offset);
DM9000_iow(DM9000_EPDRH, ((val >> 8) & 0xff));
DM9000_iow(DM9000_EPDRL, (val & 0xff));
DM9000_iow(DM9000_EPCR, 0x12);
udelay(8000);
DM9000_iow(DM9000_EPCR, 0);
}