Linux设备驱动开发概述
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-05-16
= NULL) 5 { 6 struct xxx_dev *dev = req->rq_disk->private_data; 7 if (!blk_fs_request(req)) //不是文件系统请求 8 { 9 printk(KERN_NOTICE "Skip non-fs requestn"); 10 end_request(req, 0);//通知请求处理失败 11 continue; 12 } 13 xxx_transfer(dev, req->sector, req->current_nr_sectors, req->buffer, 14 rq_data_dir(req)); //处理这个请求 15 end_request(req, 1); //通知成功完成这个请求 16 } Linux网络设备驱动的结构如上图所示,其中设备驱动功能层各函数是网络设备接口层net_device 数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作.sk_buff 结构体用于表示描述网络包,它定义了对应于传输层TCP/UDP(及ICMP 和IGMP)、网络层 和和链路层协议的协议头. Linux下编写网络设备驱动的主体工作是完成net_device结构体的填充以及成员函数的实现,底层最核心的工作是:发送数据包和接收数据包,接收数据包是由中断触发的.发送数据包函数的典型结构如下: 1 int xxx_tx(struct sk_buff *skb, struct net_device *dev) 2 { 3 int len; 4 char *data, shortpkt[ETH_ZLEN]; 5 /* 获得有效数据指针和长度 */ 6 data = skb->data; 7 len = skb->len; 8 if (len < ETH_ZLEN) 9 { 10 /* 如果帧长小于以太帧最小长度,补0 */ 11 memset(shortpkt, 0, ETH_ZLEN); 12 memcpy(shortpkt, skb->data, skb->len); 13 len = ETH_ZLEN; 14 data = shortpkt; 15 } 16 17 dev->trans_start = jiffies; /* 记录发送时间戳 */ 18 19 /* 设置硬件寄存器让硬件把数据包发送出去 */ 20 xxx_hw_tx(data, len, dev); 21 ... 22 } 接收数据包的典型结构是: 1 static void xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs) 2 { 3 ... 4 switch (status &ISQ_EVENT_MASK) 5 { 6 case ISQ_RECEIVER_EVENT: 7 /* 获取数据包 */ 8 xxx_rx(dev); 9 break; 10 /* 其他类型的中断 */ 11 } 12 } 13 static void xxx_rx(struct xxx_device *dev) 14 { 15 ... 16 length = get_rev_len (...); 17 /* 分配新的套接字缓冲区 */ 18 skb = dev_alloc_skb(length 2); 19 20 skb_reserve(skb, 2); /* 对齐 */ 21 skb->dev = dev; 22 23 /* 读取硬件上接收到的数据 */ 24 insw(ioaddr RX_FRAME_PORT, skb_put(skb, length), length >> 1); 25 if (length &1) 26 skb->data[length - 1] = inw(ioaddr RX_FRAME_PORT); 27 28 /* 获取上层协议类型 */ 29 skb->protocol = eth_type_trans(skb, dev); 30 31 /*把数据包交给上层 */ 32 netif_rx(skb); 33 34 /* 记录接收时间戳 */ 35 dev->last_rx = jiffies; 36 ... 37 } 对于其他如MTD设备、TTY设备、I2C设备、LCD设备、音频设备、摄像头、USB设备、PCI设备等,Linux都定义了类似于网络设备驱动的复杂的层次结构,如TTY设备驱动的层次如下: 这些复杂结构的定义,加大了Linux驱动的开发门槛,同时也开发Linux驱动甚至具有了类似于使用VC 开发MFC程序的特点. 3.总结 简言之,可以得出如下等式:Linux设备驱动开发=硬件控制+Linux内核API(用于并发/同步控制、阻塞/唤醒、中断底半部调度、内存和I/O访问等)+驱动框架.等式右边的3个要素缺一不可,开发高质量的Linux驱动也势必要求工程师对这些知识有良好的掌握 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Linux设备驱动开发概述的所有评论