ARM嵌入式系统开发之接收函数的实现

时间:2021-11-13 19:08:47
接收函数的实现

    接收函数主要完成几个方面的工作:一是检查接收到的数据包是否正确;二是根据数据包长度在内核空间为数据包申请一个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嵌入式系统开发之接收函数的实现
ARM嵌入式系统开发之接收函数的实现










【书名】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程序开发人员阅读和学习。