最新嵌入式Linux系统高级开发工程师-04PPT课件.ppt
《最新嵌入式Linux系统高级开发工程师-04PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式Linux系统高级开发工程师-04PPT课件.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式嵌入式Linux系统高级开发工系统高级开发工程师程师-04第四天 日程l嵌入式Linux网络子系统分析 l嵌入式Linux网卡驱动编写实例 日程安排l嵌入式嵌入式Linux网卡驱动编写网卡驱动编写l网络设备驱动程序简介ldevice数据结构lsk_buff数据结构l内核的驱动程序接口l以太网控制器sk_buff结构l一个sk_buff代表着一个网络报文。既包含报文的数据,也包含报文的控制信息。lstruct sk_buff struct net_device*dev;/接收和发送sk_buff的设备 union h;/h,nh,mac等指向sk_buff中各层报文头 unsigned c
2、har*head,*data,*tail,*end;/head和tail指向已分配空间的开头和结尾,data和tail分别是有效数据的开头与结尾。lsk_buff分配与释放l分配:struct sk_buff*alloc_skb(unsigned int size,int gfp_mask)l克隆:struct sk_buff*skb_clone(struct sk_buff*skb,int gfp_mask)l释放:void kfree_skb(struct sk_buff*skb)sk_buff的操作函数l在sk_buff缓冲区的尾部添加数据。unsigned char*skb_put(s
3、truct sk_buff*skb,unsigned int len)l在sk_buff缓冲区的头部添加数据。unsigned char*skb_push(struct sk_buff*skb,unsigned int len)l在填充sk_buff缓冲区前保留报文头空间。void skb_reserve(struct sk_buff*skb,unsigned int len)l从数据包头中删除数据。如剥离报文硬件头部。unsigned char*skb_pull(struct sk_buff*skb,int len)编写网络驱动程序发送和接收发送和接收 这是一个网络设备最基本的功能l如一块网
4、卡所做的无非就是收发工作。所以驱动程序里要告诉系统发送函数在哪里,系统在有数据要发送时就会调用发送程序。l驱动程序由于是直接操纵硬件的,所以网络硬件有数据收到,最先能得到这个数据的也就是驱动程序,它负责把这些原始数据进行必要的处理,然后送给系统。l这里,操作系统必须要提供两个机制:找到驱动程序的发送函数驱动程序把收到的数据送给系统net_device结构成员l一个net_device,表示一个网络设备。lstruct net_devicechar nameIFNAMSIZE;/设备名称 ulong base_addr;/网络接口的I/O基地址 uchar irq;/中断号 ushort har
5、d_header_len;/硬件头的长度(14)char addr_len;/MAC地址长度 char dev_addr /设备的硬件MAC地址 ushort flags;/接口标志。可以设置网络设备为混杂模式,组播模式,回环设备,UP状态标志,不执行ARP等等。网络设备的各种操作方法 net_device常用方法成员l初始化:int(*init)(struct net_device*dev)l打开接口:int(*open)(struct net_device*);l停止接口:int(*stop)(struct net_device*);l 数据发送:int(*hard_start_xmit)
6、(struct sk_buff*skb,struct net_device*);l建立硬件头:int(*hard_header)(.)l获取统计信息:网络设备驱动注册l分配net_device:struct net_device*alloc_netdevalloc_netdev(int sizeof_priv,char*name,void(*setup)(struct net_device*);lnet_device初始化给net_device结构的成员赋值l注册net_device:register_netdev(struct net_device*)网络驱动程序的网络驱动程序的-初始化(初
7、始化(initinit)l驱动程序必须有一个初始化方法l在把驱动程序载入系统的时候会调用这个初始化程序。它做以下几方面的工作:检测设备检测设备:在初始化程序里你可以根据硬件的特征检查硬件是否存在,然后决定是否启动这个驱动程序。配置和初始化硬件配置和初始化硬件:在初始化程序里可以完成对硬件资源的配置,比如即插即用的硬件就可以在这个时候进行配置(Linux内核对PnP功能没有很好的支持,可以在驱动程序里完成这个功能)。配置或协商好硬件占用的资源以后,就可以向系统申请这些资源。有些资源是可以和别的设备共享的,如中断。有些是不能共享的,如IO、DMA。初始化初始化devicedevice结构中的变量结
8、构中的变量让硬件正式开始工作让硬件正式开始工作 网络驱动程序网络驱动程序打开打开打开打开(open)(open)open这个方法在网络设备驱动程序里是在网络设备被激活的时候被调用(即设备状态由down-up)l实际上很多在initialize中的工作可以放到这里来做。比如资源的申请、硬件的激活。l如果dev-open返回非0(error),则硬件的状态还是down lopen方法另一个作用是如果驱动程序做为一个模块被装入,则要防止模块卸载时设备处于打开状态。l使能队列netif_start_queue(dev);网络驱动程序网络驱动程序关闭关闭关闭关闭(stop)(stop)close方法做和
9、open相反的工作。可以释放某些资源以减少系统负担。lclose是在设备状态由up转为down时被调用的lclose方法必须返回成功(0=success)l禁止队列netif_stop_queue(dev);网络驱动程序网络驱动程序发送发送发送发送(hard_start_xmit)(hard_start_xmit)所有的网络设备驱动程序都必须有这个发送方法。l在系统调用驱动程序的xmit时,发送的数据放在一个sk_buff结构中。l一般的驱动程序把数据传给硬件发出去。也有一些特殊的设备比如loopback把数据组成一个接收数据再回送给系统,或者 dummy设备直接丢弃数据。l如果发送成功,ha
10、rd_start_xmit方法里释放sk_buff,返回0(发送成功)l如果设备暂时无法处理,比如硬件忙,则返回1。这时如果dev-tbusy置为非0,则系统认为硬件忙,要等到dev-tbusy置0以后才会再次发送。tbusy的置0任务一般由中断完成。网络驱动程序网络驱动程序发送(续)发送(续)l硬件在发送结束后产生中断,这时可以把tbusy置0,然后用mark_bh()调用通知系统可以再次发送。l在发送不成功的情况下,也可以不置dev-tbusy为非0,这样系统会不断尝试重发。l如果hard_start_xmit发送不成功,则不要释放sk_buff。l传送下来的sk_buff中的数据已经包含
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 嵌入式 Linux 系统 高级 开发 工程师 04 PPT 课件
限制150内