资源简介

linux网络设备驱动示例代码,linux网络设备驱动示例代码,linux网络设备驱动示例代码,自己编写的代码,欢迎下载。。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 


struct net_device * gec_dev;
char dev_addr[6];



static int gecnet_init(struct net_device *dev)
{
printk(KERN_INFO “gec_net_init \n“);
return 0;
}
static void gecnet_uninit(struct net_device *dev)
{
printk(KERN_INFO “gecnet_uninit \n“);
}

static int gecnet_open(struct net_device *dev)
{
netif_start_queue(dev);
printk(KERN_INFO “gecnet_open \n“);
return 0;
}
static int gecnet_stop(struct net_device *dev)
{
netif_stop_queue(dev);
printk(KERN_INFO “gecnet_stop \n“);
return 0;

}
static netdev_tx_t gecnet_start_xmit(struct sk_buff *skbstruct net_device *dev)
{
printk(KERN_INFO “gecnet_start_xmit \n“);

//hw_net_write(skb->dataskb->lenoffset);//将数据写入硬件寄存器

dev->stats.tx_bytes += skb->len;//更新状态数据

/* free this SKB */
dev_kfree_skb(skb);  //释放sk_buff空间

return NETDEV_TX_OK;
}


static int gec_net_rx(struct net_device *dev)
{

struct sk_buff *skb;
int RxLen = 10;
char *data;

//获取芯片本次收包的长度
//get_pgk_len(&RxLen);

skb = dev_alloc_skb(RxLen + 4);

skb_reserve(skb 2);

//data 为硬件接受到的数据地址
memcpy(skb_put(skb RxLen - 4)dataRxLen);


dev->stats.rx_bytes += RxLen;
dev->stats.rx_packets++;

/* Pass to upper layer */
skb->protocol = eth_type_trans(skb dev);
skb->ip_summed = CHECKSUM_UNNECESSARY;

//递交数据包
netif_rx(skb);

}


struct net_device_ops gec_netops ={

.ndo_init = gecnet_init
.ndo_uninit = gecnet_uninit
.ndo_open = gecnet_open
.ndo_stop = gecnet_stop
.ndo_start_xmit = gecnet_start_xmit

};


static int __init gec_net_init(void)
{

int reti;

gec_dev = alloc_etherdev(sizeof(struct net_device));
ether_setup(gec_dev);

gec_dev->stats.rx_packets = 0;
gec_dev->stats.tx_packets = 0;
gec_dev->stats.rx_bytes = 10;
gec_dev->stats.tx_bytes = 10;

gec_dev->netdev_ops = &gec_netops;
gec_dev->ml_priv = &gec_netops;

for(i=0;i<6;i++)
dev_addr[i] = 0x33;

gec_dev->dev_addr = dev_addr;

sprintf(gec_dev->name“gec_net%d“0);

ret = register_netdev(gec_dev);
if(ret)
goto err1;

return 0;

err1:
printk(KERN_ERR “register_netdev err!\n“);
return -ENODEV;
}


static void __exit gec_net_exit(void)
{
unregister_netdev(gec_dev);
free_netdev(gec_dev);

}


module_init(gec_net_init);
module_exit(gec_net_exit);


MODULE_LICENSE(“GPL“);
MODULE_AUTHOR(“GEC“);


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-08-10 23:24  net\
     文件         168  2013-07-26 11:44  net\.built-in.o.cmd
     文件         287  2013-07-26 17:20  net\.gec_net.ko.cmd
     文件       17632  2013-07-26 11:44  net\.gec_net.mod.o.cmd
     文件       31887  2013-07-26 17:20  net\.gec_net.o.cmd
     目录           0  2013-07-26 15:18  net\.tmp_versions\
     文件          61  2013-07-26 17:20  net\.tmp_versions\gec_net.mod
     文件           8  2013-07-26 11:44  net\built-in.o
     文件        2568  2013-08-10 23:20  net\gec_net.c
     文件      114575  2013-07-26 17:20  net\gec_net.ko
     文件         444  2013-07-26 11:44  net\gec_net.mod.c
     文件       12856  2013-07-26 11:44  net\gec_net.mod.o
     文件      102864  2013-07-26 17:20  net\gec_net.o
     文件         617  2011-09-08 00:38  net\Makefile
     文件           0  2013-07-26 11:44  net\Module.symvers
     文件          38  2013-07-26 17:20  net\modules.order
     文件        9993  2011-09-08 00:27  net\net.c

评论

共有 条评论