<i id='zpy79'></i>
<acronym id='zpy79'><em id='zpy79'></em><td id='zpy79'><div id='zpy79'></div></td></acronym><address id='zpy79'><big id='zpy79'><big id='zpy79'></big><legend id='zpy79'></legend></big></address>
  • <tr id='zpy79'><strong id='zpy79'></strong><small id='zpy79'></small><button id='zpy79'></button><li id='zpy79'><noscript id='zpy79'><big id='zpy79'></big><dt id='zpy79'></dt></noscript></li></tr><ol id='zpy79'><table id='zpy79'><blockquote id='zpy79'><tbody id='zpy79'></tbody></blockquote></table></ol><u id='zpy79'></u><kbd id='zpy79'><kbd id='zpy79'></kbd></kbd>
  • <i id='zpy79'><div id='zpy79'><ins id='zpy79'></ins></div></i>

    <code id='zpy79'><strong id='zpy79'></strong></code>
    <dl id='zpy79'></dl>

    <span id='zpy79'></span>
    <ins id='zpy79'></ins>

    1. <fieldset id='zpy79'></fieldset>
          1. Linux kernel2.6.25 CS8900网卡驱动移植

            • 时间:
            • 浏览:5
            • 来源:124软件资讯网

              一样平常来说  ,我们在编译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内里涉及和兼容的工具很是多 ,去除容易发生冲突的部门 ,添加自己需要实现的功效  ,可以使得移植事情能够顺遂举行