当前位置: 代码迷 >> 驱动开发 >> DM9000A网卡驱动代码的疑惑!大侠请指点一下
  详细解决方案

DM9000A网卡驱动代码的疑惑!大侠请指点一下

热度:42   发布时间:2016-04-28 11:07:00.0
DM9000A网卡驱动代码的疑惑!各位高手大侠请指点一下!
正在看DM9000A网卡芯片的驱动。  
  看的过程中有一些疑问如下:
 
在netif.c中。
// 写入8bit数据
void dm_outb(unsigned char out_addr, unsigned char out_data)
{

 unsigned short n_out_data = 0;
 
 n_out_data = ((unsigned short)out_data) & 0xff;
 
 
 if( out_addr )
 {
  *((volatile UI16*)FLASH_DATA) = n_out_data;
 }
 else
 {
  *((volatile UI16*)FLASH_ADDR) = n_out_data;
 }
 
}
其中的FLASH_DATA和FLASH_ADDR
  在netif.c中。
  UI32 FLASH_DATA = (0xbf000000 + 0x188102);
  UI32 FLASH_ADDR = (0xbf000000 + 0x100102);
 
  这两个值我的理解是向网卡芯片寄存器写数据的时候,要先写寄存器的地址,再写寄存器的数据。如果要写寄存器地址就把它写入FLASH_ADDR,如果写数据就写入FLASH_DATA。但我不知道0x188102和0x100102是如何确定下来的。根据什么确定下来的值。bf000000(这个应该是flash地址在内存中的地址映射吧?但实际网卡发送数据是在flash中,因为电路连接的是flash,而实际程序处理这些数据应该是在sdram中,flash和sdram之间也要有数据交换?如何实现的?)这个基地址又是按照什么确定的。
 
请各位高手大侠帮我看一下,有不好描述的,就简单概括一下。上一次可能我自己没有把问题写清楚,所以弄得别人无法下手。如有比较满意的坚决给分。
 


------解决方案--------------------
dm9000a芯片是根据cmd判断没有问题。你把数据写入0x188102这个地址,地址线上自然会把第16根置高,假设第16根和cmd是连接的。那么dm9000a检测cmd上的电平,然后去处理sd总线上的数据。
这个两个地址是和电路以及芯片有关系。首先这两个地址在系统中是空闲的,然后这两个地址有一根地址线电平时不同,这根地址线就是连到cmd脚上的那根。
比如我自己写的驱动中
#define DM_ADD (*((volatile unsigned int *) 0x100000))
#define DM_CMD (*((volatile unsigned int *) 0x100004))
第3跟连到cmd上