有点不会使用这个编辑器,下次使用markdown来编辑
1. 寄存器定义
在寄存器定义中定义了常用的寄存器列表,这里注意自己在写硬件代码时值得学习:
#define DM9000_NCR 0x00
#define DM9000_NSR 0x01
#define DM9000_TCR 0x02
#define DM9000_TSR1 0x03
#define DM9000_TSR2 0x04
#define DM9000_RCR 0x05
#define DM9000_RSR 0x06
#define DM9000_ROCR 0x07
#define DM9000_BPTR 0x08
#define DM9000_FCTR 0x09
#define DM9000_FCR 0x0A
#define DM9000_EPCR 0x0B
#define DM9000_EPAR 0x0C
#define DM9000_EPDRL 0x0D
#define DM9000_EPDRH 0x0E
#define DM9000_WCR 0x0F
#define DM9000_PAR 0x10
#define DM9000_MAR 0x16
#define DM9000_GPCR 0x1e
#define DM9000_GPR 0x1f
#define DM9000_TRPAL 0x22
#define DM9000_TRPAH 0x23
#define DM9000_RWPAL 0x24
#define DM9000_RWPAH 0x25
#define DM9000_VIDL 0x28
#define DM9000_VIDH 0x29
#define DM9000_PIDL 0x2A
#define DM9000_PIDH 0x2B
#define DM9000_CHIPR 0x2C
#define DM9000_SMCR 0x2F
#define DM9000_PHY 0x40 /* PHY address 0x01 */
#define DM9000_MRCMDX 0xF0
#define DM9000_MRCMD 0xF2
#define DM9000_MRRL 0xF4
#define DM9000_MRRH 0xF5
#define DM9000_MWCMDX 0xF6
#define DM9000_MWCMD 0xF8
#define DM9000_MWRL 0xFA
#define DM9000_MWRH 0xFB
#define DM9000_TXPLL 0xFC
#define DM9000_TXPLH 0xFD
#define DM9000_ISR 0xFE
#define DM9000_IMR 0xFF
2. 基础读写函数
/*
Read a byte from I/O port
*/
static u8 DM9000_ior(int reg)
{
DM9000_outb(reg, DM9000_IO);
return DM9000_inb(DM9000_DATA);
}
/*
Write a byte to I/O port
*/
static void DM9000_iow(int reg, u8 value)
{
DM9000_outb(reg, DM9000_IO);
DM9000_outb(value, DM9000_DATA);
}
底层实现函数1:
#define DM9000_outb(d,r) writeb(d, (volatile u8 *)(r))
#define DM9000_inb(r) readb((volatile u8 *)(r))
由于在SMDKV210中,DM9000直接的挂接在SROM0上,并且具有引脚兼容的特点,所以CPU在处理该部分地址空间时,是直接的当作内存来处理。所以可以使用指针的方式访问该部分区域。在有一个int数据类型转换位u8数据类型时有截断的现象,直接取得是低位的数据,高位的数据没有用到,也可以说高位全是0.
最迷人的一部分代码:
DM9000_outb(reg, DM9000_IO);
DM9000_outb(value, DM9000_DATA);
通过芯片手册可以知道CMD管脚连接的是Xm0ADDR2,在DM9000中关于CMD的描述如下:
CMD high:DATA port
CMD low :INDEX port
DM9000_IO DM9000_BASE
DM9000_DATA DM9000_IO + 4
我们只要保证在读写数据区域在指定的SROM0区域,并且Xm0ADDR2为相应的电平就可以对CMD进行相应的读写控制,这里通过 + 4 操作就实现了对CMD的控制,这是一个非常nice的技巧,值得学习!