Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145434
  • 博文数量: 43
  • 博客积分: 15
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 00:08
个人简介

Know C, C++ and shell programming, math and sport is my favour too. VIM Fans.

文章分类

全部博文(43)

文章存档

2015年(1)

2014年(27)

2013年(15)

我的朋友

分类: LINUX

2014-08-03 12:05:50

原文地址:驱动之网络小记 作者:windguy

当你遇到不熟悉的API时你怎么办?当你不明白模块怎么注册到内核该怎么办?怎么找到你的硬件?当你不

知道怎么使用驱动怎么办?下面就要看的!!!!


当你遇到不熟悉的API时你怎么办?当你不明白模块怎么注册到内核该怎么办?怎么找到你的硬件?当你不

知道怎么使用驱动怎么办?下面就要看的!!!!

1。当你遇到不熟悉的API时你怎么办?
   看内核里面的东西,会碰到不熟悉的函数,怎么办呢。这是一个内核函数的查询网站:   

会让你事半功倍!

2。当你不明白模块怎么注册到内核该怎么办?
    网络驱动的一个很重要的结构是struct net_device sample,不要问我你不知道在哪个头文件里面声明

!    在声明 一个模块的时候一定要赋予他的 init域一个初始化函数。
    调用register_netdev(&sample)注册该sample到内核去,该结构会挂在dev_base上面。
    马上内核调用sample的init初始化函数把其他的域也分配好。
   
    这样模块就注册完了。

3. 怎么找到你的硬件?
   
   确信你的硬件的IO地址:
   request_region(ioaddr, EL1_IO_EXTENT, dev->name)找到就是对的。
   把他拿给设备吧: sample.base_addr = ioaddr;

    把网卡的物理地址找出来,要拷贝给sample.dev_addr    
        for (i = 0; i < 6; i++)
         {
                outw(i, ioaddr + EL1_DATAPTR);
               station_addr[i] = inb(ioaddr + EL1_SAPROM);
        }

    还有IRQ,怎么办?
     
                autoirq_setup(2);
                inb(RX_STATUS);         /* Clear pending interrupts. */
                inb(TX_STATUS);
                outb(AX_LOOP + 1, AX_CMD);

                outb(0x00, AX_CMD);

                autoirq = autoirq_report(1);

                 if (autoirq == 0)
                {
                        printk(KERN_WARNING "%s probe at %#x failed to detect IRQ line. ",
                               mname, ioaddr);
                        release_region(ioaddr, EL1_IO_EXTENT);
                        return -EAGAIN;
              }    
       找到IRQ了,也把他拿给sample:
        if (autoirq)
                dev->irq = autoirq;

4。当你不知道怎么使用驱动怎么办?
   
   你在sample.hard_start_xmit不是有一个成员吗,他的参数是行如:
    el_start_xmit(struct sk_buff *skb, struct net_device *dev)
   所以内核要发送数据就是直接在网络核心层调用的这个函数。

  
   那接收数据呢?
   首先我们的硬件都是中断方式的,在open设备的时候,俺们来个request_irq把我们的中断处理函数注册

进去。如果有数据到来,我门在中断处理函数中不就能看到了, 那网络核心层怎么看到了,还得在接收到

数据后做一些处理然后netif_rx你就不用管了。 

 


更多精彩还在后头,但俺得看书去。。。。。
如果有要补充的,请在评论后面添加:>>>>>>

    

阅读(1109) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~