linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux入门与提高 > 安装与配置 >
栏目导栏
资料搜索
热门文章
·什么是ISO文件
·VMware下Linux的安装及简单设置
·为Canon PIXMA iP1000喷墨打印
·Linux必学60个命令文件处理
·实例解说Linux中fdisk分区使用
·Linux下软件安装详解(图)
·Windows下硬盘安装FC6
·用DVD镜像文件硬盘安装FC5详细
·linux下软件的基本安装和卸载
·Linux下硬盘分区的最佳方案
·Suse Linux最新版本 10.1的 IS
·Ubuntu Linux操作系统安装Luma
·Linux下的软件安装
·FC5,LINUX下ADSL上网设置与安装
·把你的Linux配置成Windows
最新文章
·linux下Nand Flash的JFFS2文件
·在 Ubuntu7.10 安装 GW-US54GX
·Ubuntu 8.04系统下Opera浏览器
·Linux操作系统下安装显卡驱动的
·Linux操作系统下硬盘挂载方法
·使用initrd文件系统 U-boot引导
·FC6光盘软件更新和Linux常用开
·Fedora 9下使用VirtualBox安装
·Ubuntu Linux 8.04 Vsftp 虚拟
·Weblogic 8.1 for Linux ES3.0
·Ubuntu Linux 8.04下本地安装L
·VMware安装Redhat不能输入密码
·双系统攻略:修复Windows XP引
·Windows Vista硬盘安装Fedora
·在一个硬盘上安装两个Linux操作
Google
 
Linux kernel2.6.25 CS8900网卡驱动移植
[ 作者:  加入时间:2008-05-13 09:30:40  来自:Linux联盟收集整理 ]
 

一般来说,我们在编译kernel时,设备驱动的选择有两种方式:一种是直接编译到kernel里,另一种是以模块方式挂接。CS8900网卡驱动如果以模块方式挂接,函数init_module就是入口;如果是直接编译到kernel里,那么函数cs89x0_probe才是入口。在此入口函数中,将完成网卡驱动的各项初始化。如注册虚拟地址,设备号,中断号,以及各个相关寄存器的初始化。

cs89x0_probe函数里会去调用真正的初始化函数cs89x0_probe1。下面说一下该初始化函数里需要完成的几个重要地方:

1、 注册虚拟地址。

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

ioaddr = (int)ioremap(BASE_ADDR,16);

2、填充net_device结构体。

该结构体的成员都是和网络设备有关的变量。其中比较重要的有两个:dev_addr和open。dev_addr里要存的是主机的MAC地址,一般都是从eeproom中读出来再存放到该变量中,当然也可以根据自己的需要手动赋值。

for (i=0; i < ETH_ALEN/2; i++) {
  unsigned int Addr;
  Addr = readreg(dev, PP_IA+i*2);
  dev->dev_addr[i*2] = Addr & 0xFF;
  dev->dev_addr[i*2+1] = Addr >> 8;
}

Open是一个函数指针,需要把net_open函数赋值给他。net_open函数是一个专门用来注册网络设备中断号的函数,输入ifconfig命令时,最后就会调用到这个函数。在这个函数中要把中断号设置一下。

writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON); 
request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);

3、 I/O端口的中断请求设置。

网卡不可能也不需要时时刻刻都处于中断状态,合理的中断触发时机是一个必要条件。根据硬件电路图的引脚可知,相对应的中断请求寄存器是GPG1和EINT9。在GPG1寄存器里面要把EINT9寄存器功能激活,而在EINT9寄存器里面则要把中断设置为上跳沿触发。

writel(readl(S 3C2410_GPGCON) | 0x8, S3C2410_GPGCON); 
writel(readl(S3C2410_EXTINT1) | 0x40, S3C2410_EXTINT1);

还有一点要注意,CS8900网卡的寄存器都是16位的,所以在选择读写函数时也必须选择16位寄存器的读写函数。

static u16 readword(unsigned long base_addr, int portno)
{
  return inw(base_addr + portno);
  }

  static void writeword(unsigned long base_addr, int portno, u16 value)
{
  outw(value, base_addr + portno);
}

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

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息