原创 Linux网卡驱动程序设计(三)

2012-8-31 14:44 1501 17 17 分类: MCU/ 嵌入式

2.4 设备驱动功能层

Net_device结构体的成员(属性和函数指针)需要被设备驱动功能层的具体数值和函数赋予,应编写相应的设备驱动功能层的函数,这些函数形如xxx_open(),xxx_stop(),

Xxx_stop(),xxx_tx(),xxx_get_stats(),xxx_tx_timeout等。

由于网络数据包的接收可由中断引发,设备驱动的功能层中另一个主题部分将是中断处理函数,它负责读取硬件上接收的数据包并传给上层协议,可能包含xxx_interrupt()xxx_rx()函数,前者主要完成中断类型判断等基本的工作,后者则需完成数据包的生成和递交上层等复杂工作。

2.5 网络设备与媒介层

网络设备与媒介层直接对应于实际硬件设备。

直接操作硬件寄存器。

 

.网络驱动程序的基本方法

网络设备做为一个对象,提供一些方法供系统访问。正是这些有统一接口的方法, 
掩蔽了硬件的具体细节,让系统对各种网络设备的访问都采用统一的形式,做到硬件 
无关性,下面解释最基本的方法。

 

3.1 初始化

驱动程序必须有一个初始化方法。在把驱动程序载入系统的时候会调用这个初始化程序。它做以下几方面的工作。检测设备,在初始化程序里你可以根据硬件的特征检查硬件是否存在,然后决定是否启动这个驱动程序;配置和初始化硬件,在初始化程序里你可以完成对硬件资源的配置。配置或协商好硬件占用的资源以后,就可以向系统申请这些资源。接下来你要初始化device结构中的变量。最后,你可以让硬件正式开始工作。

dev->irq  = KSZ8842_IRQ;

dev->base_addr  = KSZ8842_BASE;

dev->open = net_open;

dev->stop = net_stop;

dev->tx_timeout = net_tx_timeout;

dev->watchdog_timeo = 3*HZ;

dev->hard_start_xmit  = net_hard_start_xmit;

dev->set_mac_address  = net_set_mac_address;

dev->ethtool_ops = &net_ethtool_ops;

3.2 打开与释放

在传送数据包到达接口之前,内核必须打开接口并赋予地址。例如内核在响应ifconfig命令时打开或关闭一个接口。

内核响应ifconfig时,首先通过ioctl(SIOCSIFADDR)赋予地址,然后通过ioctl (SIOCSIFFLAGS)打开接口,这些都由内核来执行,与设备无关,只是后一个命令会条用设备的open方法

网络设备的打开函数需要完成如下工作:

1、使能设备使用的硬件资源,申请I/O区域、中断和DMA等。

2、激活设备发送队列:void netif_start_queue(struct net_device *dev);

Int xxx_open(struct net_device *dev)

{

Ret = request_irq(dev->irq, &xxx_interrrupt,0,dev->name,dev);

Netif_start_queue(dev);

}

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
17
关闭 站长推荐上一条 /3 下一条