正在看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上