我最近在做网卡驱动,我会把做的过程中的问题贴出来,一来这里有高手可以解答,二来自己可以涨见识,还有就是以后研究网络驱动的盟友也可以参考参考,我会一部分一部分的贴出来的,就是麻烦高手可以给我和共同奋战在嵌入式第一线的盟友一个通俗,容易让我们懂得解释。今天是第一贴:关于网络驱动初始化段的问题。 在dx9000.c驱动程序中 1在初始化程序中 "writel(readl(gpfcon)|0xaa,gpfcon); //old"能不能把这一句换成在做字符驱动程序中的 “*(volatile unsigned int *)r_gpfcon &=(~0x00000040);"的形式阿,他们完成的任务都是一样的啊,都是写2410的寄存器。请问有什么区别? 2在初始化程序中 “outb(DM9000_VID_L, iobase);"能不能用writeb函数来实现,iobase也是通过ioremap映射到的虚拟地址
3outb(DM9000_VID_L, iobase); id_val = inb(iobase + 4); 这么两句怎么就可以读出DM9000_VID_L寄存器的值呢?
4 #define DM9000_ID0x90000A46为什么就是这个90000A46呢?怎么定的? #define DM9000_MIN_IO0x08000300 为什么就是这个08000300呢?怎么定的?
5outb(DM9000_VID_L, iobase); id_val = inb(iobase + 4); 我觉得这两句不能读出DM9000里寄存器VID的值,我认为应该是 id_val=inb(iobase+DM9000_VID_L)这样才对,因为这样才是读VID的寄存器,我不知道对不对,请解释解释?
6id_val = inb(iobase + 4);这里面的iobase+4是数据地址,为什么就是数据地址呢?我怎么知道呢?
7request_region(iobase, 2, dev->name);这一句是不是应该放在初始化函数的前端,至少也要放在outb,inb语句之前吧?设备驱动程序书说:“在尚未取得对端口独占之前,我们不应对这些端口进行操作,需要先声明”。 |