• <tr id='7dehs'><strong id='7dehs'></strong><small id='7dehs'></small><button id='7dehs'></button><li id='7dehs'><noscript id='7dehs'><big id='7dehs'></big><dt id='7dehs'></dt></noscript></li></tr><ol id='7dehs'><table id='7dehs'><blockquote id='7dehs'><tbody id='7dehs'></tbody></blockquote></table></ol><u id='7dehs'></u><kbd id='7dehs'><kbd id='7dehs'></kbd></kbd>

      <code id='7dehs'><strong id='7dehs'></strong></code>

      <span id='7dehs'></span>
      <ins id='7dehs'></ins>

    1. <i id='7dehs'><div id='7dehs'><ins id='7dehs'></ins></div></i>

          <acronym id='7dehs'><em id='7dehs'></em><td id='7dehs'><div id='7dehs'></div></td></acronym><address id='7dehs'><big id='7dehs'><big id='7dehs'></big><legend id='7dehs'></legend></big></address>
        1. <i id='7dehs'></i>

          1. <fieldset id='7dehs'></fieldset>
            <dl id='7dehs'></dl>

            Linux kernel2.6.25 CS8900网卡驱动移植

            • 时间:
            • 浏览:13
            • 来源: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内里涉及和兼容的工具很是多  ,去除容易发生冲突的部门  ,添加自己需要实现的功效  ,可以使得移植事情能够顺遂举行