设计以太网驱动
文章以S3C4510B的以太网驱动程序为例,给出了驱动程序的一般设计措施,具体描述了驱动程序的初始化,数据接受和数据发送过程。 本文设计了基于S3C4510B的以太网驱动程序,并通过串口输出。文章给出了对一般MAC
outl;
outl;
outl;
outl;
outl;
s3c4510_eth_fd_init;
for
{
struct frame_desc_struct *fd_ptr;
volatile unsigned long *fb_ptr;
unsigned char *fb_data;
int i;
// 1. Get Tx frame descriptor & data pointer
fd_ptr = gtx_ptr;
fb_ptr = &fd_ptr-> frame_data_ptr;
fb_data = fd_ptr->frame_data_ptr;
// 2. Check BDMA ownership
if
return -1;
// 3. Prepare Tx Frame data to Frame buffer
memcpy;
if ;
fd_ptr->status_and_frame_lenght = ;
// 5. Change ownership to BDMA
fd_ptr->frame_data_ptr |= BDMA_owner;
// 6. Enable MAC and BDMA Tx control register
outl;
outl;
// 7. Change the Tx frame descriptor for next use
gtx_ptr = ;
return 0;
}
数据接受
数据接受是指将网络上的数据帧接受并缓存于网卡的接受缓冲环中,然后由主机程序将缓存环的帧读走并存入内存中以备程序使用。从中可以看出,帧的接受过程提成两步:第一步通过本地DMA将帧存入接受缓冲环;第二步是通过远程DMA并在主机的配合下将接受缓冲环中的帧读入内存。
一般设备收到数据后所有会产生一种中断,在中断解决程序中驱动程序申请一块sk_buff,从硬件读出数据放置到申请好的缓冲区里。接下来填充sk_buff中的部分信息。skb->dev = dev,鉴定收到帧的合同类型,填入skb->protocol。把指针skb->指向硬件数据然后丢弃硬件帧头。还要设立skb->pkt_type,标明第二层数据类型。可以是如下类型:PACKET_BROADCAST,链路层广播;PACKET_MULTICAST,链路层组播;PACKET_SELF,发给自己的帧;PACKET_OTHERHOST,发给她人的帧;最后调用netif_rx把数据传送给合同层。netif_rx里数据放入解决队列然后返回,真正的解决是在中断返回后来,这样可以减少中断时间 。部分参照程序如下:
int s3c4510_eth_rcv
{
struct frame_desc_struct *fd_
设计以太网驱动 来自淘豆网m.daumloan.com转载请标明出处.