DM9000移植代码分析一

这篇博客主要分析了DM9000的寄存器定义和基础读写函数。在寄存器定义部分,提到了在硬件代码编写中的学习点。而在读写函数部分,解释了SMDKV210中DM9000如何被当作内存处理,以及通过指针访问和CMD管脚控制实现数据读写的巧妙方式。
摘要由CSDN通过智能技术生成

有点不会使用这个编辑器,下次使用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的技巧,值得学习!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值