首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
嵌入式Linux下PCI设备驱动的设计与实现
来源:本站整理  作者:佚名  2011-10-10 07:24:47



       随着通用处理器和嵌入式技术的迅猛发展,越来越多的电子设备需要由处理器控制。目前大多数CPU和外部设备都会提供PCI总线的接口,PCI总线已成为计算机系统中一种应用广泛、通用的总线标准[1]。Linux因其开放源代码以及稳定的性能,越来越受到广大用户青睐。同时,基于Linux内核的嵌入式操作系统应用势头强劲,开发基于Linux的设备驱动程序,具有很强的实用性和可移植性[2]。

1 PCI总线概述

   PCI(Peripheral Component Interconnect)总线,即外部设备互连,是现在流行的一种连接PC和外围设备的总线结构[3]。PCI提供了一组完整的总线接口规范,可以在33 MHz时钟频率、32 bit数据总线宽度的条件下达到峰值132 Mb/s的传输速率;它能支持一种称为线性突发的数据传输模式,可确保总线不断满载数据;采用总线主控与同步操作,显著改善PCI的性能;PCI独立于处理器的结构,用户可随意增添外围设备,以扩展电脑系统而不必担心在不同时钟频率下会导致性能下降。

2 PCI设备驱动程序的设计与实现

 Linux中将设备分成字符设备、块设备和网络设备三种类型,通过主设备号和从设备号实现对设备的描述。其中主设备号描述控制该设备的驱动程序,即驱动程序与主设备号一一对应,从设备号用来区分同一个驱动程序控制的不同设备[5]。

 PCI设备属于字符设备。本设计采用模块方式实现PCI卡驱动程序。驱动程序主要由设备注册和注销、设备探测和移除、设备中断处理和系统调用等函数组成。

2.1 设备注册和注销

 使用一个设备之前,必须保证己经对它进行注册,这项工作一般是在设备初始化时完成。设备初始化函数中调用函数register_chrdev()来注册字符设备。流媒体数据缓存PCI卡驱动程序的注册代码如下:
 #define MAJOR_NUM 128
   register_chrdev(MAJOR_NUM,"pci_card",&pci_card_fops);
   将设备的主设备号设为128,设备名称为pci_card。pci_card_fops是一个file_operations结构指针,这个结构是设备驱动程序所提供的入口点位置,在设备注册时向系统进行登记,以便系统在适当时调用。pci_card_fops定义如下:
 statIC struct file_operations pci_card_fop={
         owner:THIS_MODULE,
         open:pic_card_open,
         release:pic_card_release,
         read:pic_card_read,
         write:pic_card_write,
         ioctl:pic_card_ioctl
 };
 当不再使用此设备时,需调用unregister_chrdev()函数注销驱动程序。
2.2 设备探测和移除
 在扫描到新的PCI设备后,系统需要调用设备驱动程序实现的探测函数以查找与设备相匹配的PCI驱动。流媒体数据缓存PCI卡设备驱动的探测函数pic_card_probe()的主要实现代码如下:
 pci_Card = kmalLOC(sizeof(struct pci_card),GFP_KERNEL);
                          //为设备实例分配存储空间
 pci_enable_device(dev);                     //激活PCI设备
 sPIN_lock_init(pci_card ->lock);
                      //初始化特定设备实例的私有化数据
 pci_read_config_byte(dev,PCI_REVISION_ID,(u8*)&(pci_
 card ->rev_id));                //读取配置信息
 pci_card->mem_base=pci_resource_start(dev, 0);
                            //读取I/O资源的配置信息
 pci_request_regions(dev,"pic_card");      //申请I/O区域
 pci_set_master(dev);               //设置成总线主模式
 pic_card->mem_start=ioremap(pic_card->mem_base,
 pic_card->mem_size);            // I/O内存映射
 设备移除函数主要完成释放映射的虚拟地址、释放I/O区域、关闭PCI设备和释放为设备实例分配的内核空间等功能。

[1] [2]  下一页

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:57,359.38000 毫秒