接收函数的实现
接收函数主要完成几个方面的工作:一是检查接收到的数据包是否正确;二是根据数据包长度在内核空间为数据包申请一个sk_buff;三是把数据包复制到sk_buff,填写相关域段和统计信息并且把sk_buff插入相应的输入队列;四是释放数据包占用的芯片bufffer。下面就结合代码片段讲述其功能实现。
static void DM9000_rcv(struct net_device *dev)
{
struct DM9000_local *lp = (struct DM9000_local *)dev->priv;
int packet_number;
word status;
word packet_length;}
变量定义部分:
status = inw( DATA_REG );
packet_length = inw( DATA_REG );
设置指针位置,读取状态和数据包长度信息:
packet_length &= 0x07ff;
if ( !(status & RS_ERRORS ) ){
struct sk_buff* skb;
byte * data;
skb = dev_alloc_skb( packet_length );
if ( skb == NULL ) {
printk(KERN_NOTICE "%s: Low memory, packet dropped./n",
dev->name);
lp->stats.rx_dropped++;
goto done;
}
skb_reserve( skb, 2 );
skb->dev = dev;
insw( DATA_REG , data, packet_length >> 1);
skb->protocol = eth_type_trans(skb, dev );
netif_rx(skb);
lp->stats.rx_packets++;
}
如果数据包接收正确,申请sk_buff空间,把数据复制到skb。insw为宏指令,完成数据从芯片buffer到data起头内存的复制。eth_type_trans(skb,dev)是内核函数,用于从以太网数据包中提取网络协议内容,并把它放到skb结构的相应位置。netif_rx(skb)也是内核函数,作用是根据skb的信息把它插入相应的输入队列。
数据包接收错误的处理:
outw( MC_RELEASE, MMU_CMD_REG );
传输命令给芯片,释放已处理的接收数据包占用的buffer。
——以上内容选自《ARM嵌入式Linux系统开发技术详解》一书
【书名】ARM嵌入式Linux系统开发技术详解
【作者】杨水清 张 剑 施云飞 等编著
【ISBN】978-7-121-07469-1
【出版社】电子工业出版社
【出版日期】2008年11月
【宣传语】
继《Windows驱动开发技术详解》之后又一本心血力作!
原创经典,嵌入式系统一线工程师倾力打造。
深入Linux系统底层和内核,透析ARM嵌入式Linux系统开发的本质。
通过嵌入式系统开发实例,归纳ARM嵌入式Linux系统开发的整个过程。
【内容简介】
本书由浅入深、通俗易懂地讲解了嵌入式Linux的系统设计与开发。全书共25章,从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬件环境的构建、BootLoader、Linux内核移植、嵌入式文件系统、嵌入式Linux多任务程序开发、嵌入式Linux设备驱动开发、嵌入式Linux网络程序开发、MiniGUI图形界面开发、设备驱动开发案例、综合案例等内容。书中通过大量的例程来讲解知识要点,并提供了大量极有参考价值的开发案例,读者可以通过这些例程和开发案例对嵌入式Linux开发有一个系统的学习和提高。
本书共有四个方面的内容。在嵌入式系统的硬件结构中讲述了嵌入式处理器ARM的特点、嵌入式系统硬件环境的构建和ADS开发工具的使用。在嵌入式Linux系统移植中讲述了目标板软件环境的构建,主要包括BootLoader、Linux内核、文件系统以及交叉开发环境的构建。在嵌入式Linux软件开发中讲述了嵌入式LinuxC语言开发工具的使用、标准库的使用、多任务开发基础和设备驱动开发基础。在嵌入式应用系统实例分析中讲述了嵌入式Linux的网络程序开发、MiniGUI图形界面开发、CAN总线设备驱动设计、DM9000网络驱动设计、SD卡驱动设计和嵌入式B超系统设计。
本书语言通俗易懂,内容丰富,注重理解与实例,知识涵盖面广。非常适合从事嵌入式Linux系统开发的初级工程师、高校学生、Linux程序开发人员阅读和学习。