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);
…
}
文章评论(0条评论)
登录后参与讨论