Linux kernel CS8900网卡驱动的移植


网络传输是当今世界的一大主流,因此网卡驱动也自然而然在各类驱动中占领了一席之地。下面我们就简短地来说一下CS8900网卡驱动移植到Linux kernel的一些问题。

首先要说的是函数入口。一般来说,我们在编译kernel时,设备驱动的选择有两种方式:一种是直接编译到kernel里,另一种是以模块方式挂接。CS8900网卡驱动如果以模块方式挂接,函数init_module就是入口;如果是直接编译到kernel里,那么函数cs89x0_probe才是入口。

在此入口函数中,将完成网卡驱动的各项初始化。如注册虚拟地址,设备号,中断号,以及各个相关寄存器的初始化。

其次,在kenel里面,任何物理地址都要通过MMU转化成虚拟地址,因此在kernel里,我们真正去操作的寄存器的地址其实是和每个寄存器的物理地址一一对应的虚拟地址。我们在定义完我们所要用到的寄存器后,都必须使用一个函数将我们所要用到的寄存器的物理地址转换成为在kernel里可以操作的虚拟地址,然后才能将他们用以具体的操作,否则一切都是徒劳。

第三,CS8900网卡的寄存器都是16位的,所以在选择读写函数时也必须选择16位寄存器的读写函数。

第四,CS8900网卡驱动在kernel里的收发数据方式是基于中断方式的。因此,我们在初始化函数里必须将相应寄存器的中断控制位激活,使CS8900网卡在收发数据时可以采用中断方式。当然,中断号的正确设置也是必不可少的。

最后,关于中断还要说一点。网卡不可能也不需要时时刻刻都处于中断状态,合理的中断触发时机是一个必要条件。

以上便是Linux kernel CS8900网卡驱动移植所需注意的内容。Kernel里面涉及和兼容的东西非常多,去除容易产生冲突的部分,添加自己需要实现的功能,可以使得移植工作能够顺利得进行。(作者:Ronnie )

相关内容