


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PCie驱动Pcie设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。Pce的配置空间:PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是由操作系统决定其映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。PCI总线规范定义的配置空间总长度为256个字节,配置信
2、息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。312is|0DebIDVendorIDOOh|SnrUiCcnEnand0411C场&Cod?RevisionIDOSh5ISTHeaderTypeOCIjAm公R扫眼1103asrAddrf5-4Rczisier214!iBaseAddreisRegissei3mBaseAddressReels4ICIiBax
3、220hBaseRtgiiter624hCISPointer2ShIDSubvscfmVendorID2Ch时口xROX*Bas*AddffisSObCapitij:T5PoiniefUh3Sli,味上干1JJziGncInttfrup:PuiTn:!*TrupiLine一般来说,基于pcie总线的驱动,需要涉及到pci_driverpci_devpci_device_id.pci_device_id:用于标识pcie设备,通过上图的厂商Id设备Id功能号等唯一确定一个pcie设备,内核通过这个结构体确认驱动与设备是否匹配。pci_dev:一般pcie设备都具有热拔插功能,当内核检测到有pci
4、e设备插入时,会与相应的Pci_driver:当有相应的设备匹配会调用驱动的相关方法,驱动中通常要做的是读出BaseAdrressRegister1-6的值,这是pcies设备6个内存空间的基地址,然后通过ioremap方法映射成虚拟地址,至于6个内存空间的具体含义需要依赖于设备。在用模块方式实现PCI设备驱动程序时,通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块。例如/*指明该驱动程序适用于哪一些PCI设备*/staticstructpci_device_iddemo_ids=(PCI_DEVICE(PCI_VENDOR
5、_ID_INTEL,PCI_DEVICE_ID_INTEL_82810_IG1),(PCI_DEVICE(PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_82810_IG3),(PCI_DEVICE(PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_82810E_IG),(PCI_DEVICE(PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_82815_CGC),(PCI_DEVICE(PCI_VENDOR_ID_INTEL,PCI_DEVICE_ID_INTEL_82845G_IG),(0,;这个p
6、ci_device_id结构需要被输出到用户空间,来允许热插拔和模块加载系统知道什么模块使用什么硬件设备.宏MODULE_DEVICE_TABLE成这个.例如:MODULE_DEVICE_TABLE(pci,demo_ids);structdemo_card(unsignedintmagic;/*使用链表保存所有同类的PCI设备*/structdemo_card*next;/*.*/*中断处理模块*/staticvoiddemo_interrupt(intirq,void*dev_id,structpt_regs*regs)(/*.*/*设备文件操作接口*/staticstructfile_o
7、perationsdemo_fops=(owner:THIS_MODULE,/*demo_fops所属的设备模块*/read:demo_read,/*读设备操作*/write:demo_write,/*写设备操作*/ioctl:demo_ioctl,/*控制设备操作*/mmap:demo_mmap,/*内存重映射操作*/open:demo_open,/*打开设备操作*/release:demo_release/*释放设备操作*/*.*/;/*设备模块信息*/staticstructpci_driverdemo_pci_driver=(name:demo_MODULE_NAME,/*设备模块名称
8、*/id_table:demo_idsl,/*能够驱动的设备列表*/probe:demo_probe,/*设备与驱动匹配时调用remove:demo_remove/*卸载设备模块*/*.*/;3.初始化设备模块在Linux系统下,想要完成对一个PCI设备的初始化,需要完成以下工作:检查PCI总线是否被Linux内核支持;检查设备是否插在总线插槽上,如果在的话则保存它所占用的插槽的位置等信息。读出配置头中的信息提供给驱动程序使用。当Linux内核启动并完成对所有PCI设备进行扫描、登录和分配资源等初始化操作的同时,会建立起系统中所有PCI设备的拓扑结构,此后当PCI驱动程序需要对设备进行初始化时
9、,一般都会调用如下的代码:staticint_initdemo_init_module(void)(/*检查系统是否支持PCI总线*/if(!pci_present()return-ENODEV;/*注册硬件驱动程序*/if(!pci_register_driver(&demo_pci_driver)(pci_unregister_driver(&demo_pci_driver);return-ENODEV;/*.*/return0;驱动程序首先调用函数pci_present()检查PCI总线是否已经被Linux内核支持,如果系统支持PCI总线结构,这个函数的返回值为0,如果驱
10、动程序在调用这个函数时得到了一个非0的返回值,那么驱动程序就必须得中止自己的任务了。调用pci_register_driver()函数来注册PCI设备的驱动程序,此时需要提供一个pci_driver结构,在该结构中给出的probe探测例程将负责完成对硬件的检测工作。staticint_initdemo_probe(structpci_dev*pci_dev,conststructpci_device_id*pci_id)structdemo_card*card;/*启动PCI设备*/if(pci_enable_device(pci_dev)return-EIO;/*设备DMA标识*/if(pc
11、i_set_dma_mask(pci_dev,DEMO_DMA_MASK)return-ENODEV;/*在内核空间中动态申请内存*/if(card=kmalloc(sizeof(structdemo_card),GFP_KERNEL)=NULL)printk(KERN_ERR"pci_demo:outofmemoryn");return-ENOMEM;memset(card,0,sizeof(*card);/*读取PCI配置信息*/card->iobase=pci_resource_start(pci_dev,1);card->pci_dev=pci_dev;
12、card->pci_id=pci_id->device;card->irq=pci_dev->irq;card->next=devs;card->magic=DEMO_CARD_MAGIC;/*设置成总线主DMA模式*/pci_set_master(pci_dev);/*申请I/O资源*/request_region(card->iobase,64,card_namespci_id->driver_data);return0;4.打开设备模块在这个模块里主要实现申请中断、检查读写模式以及申请对设备的控制权等。在申请控制权的时候,非阻塞方式遇忙返回
13、,否则进程主动接受调度,进入睡眠状态,等待其它进程释放对设备的控制权。staticintdemo_open(structinode*inode,structfile*file)(/*申请中断,注册中断处理程序*/request_irq(card->irq,&demo_interrupt,SA_SHIRQ,card_namespci_id->driver_data,card)(/*检查读写模式*/if(file->f_mode&FMODE_READ)/*.*/if(file->f_mode&FMODE_WRITE)/*.*/*申请对设备的控制权*/
14、down(&card->open_sem);while(card->open_mode&file->f_mode)if(file->f_flags&O_NONBLOCK)/*NONBLOCK模式,返回-EBUSY*/up(&card->open_sem);return-EBUSY;else/*等待调度,获得控制权*/card->open_mode|=f_mode&(FMODE_READ|FMODE_WRITE);up(&card->open_sem);/*设备打开计数增1*/MOD_INC_USE_COU
15、NT;/*.*/在对资源的访问方式上,除了有I/O指令以外,还有对外设I/O内存的访问。对这些内存的操作一方面可以通过把I/O内存重新映射后作为普通内存进行操作,另一方面也可以通过总线主DMA(BusMasterDMA)的方式让设备把数据通过DMA传送到系统内存中。释放设备模块主要负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好与打开设备模块相反:staticintdemo_release(structinode*inode,structfile*file)(/*.*1/*释放对设备的控制权*/card->open_mode&=(FMODE_READ|FMODE_WRITE);/*唤醒其它等待获取控制权的进程*/wake_up(&card->open_wait);up(&card->open_se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2017-2018学年高中政治人教版必修2教案第3单元第7课第2框民族区域自治制度适合国情的基本政治制度
- 新解读《GB-T 13085 - 2018饲料中亚硝酸盐的测定 比色法》
- 投资券商面试题目及答案
- 练习册高二数学试卷
- 机构组装基础知识培训课件
- 临猗县初三二模数学试卷
- 泸县五年级数学试卷
- 七年级长垣数学试卷
- 南阳市小学数学试卷
- 隧道可行性分析
- GB/T 45607-2025船舶与海上技术船舶系泊和拖带设备系泊导缆孔底座
- 外墙高空蜘蛛人作业施工方案
- 2025年工业锅炉G1证理论考试笔试试题6(200题)附答案
- CNAS-CC105-2016 《确定管理体系审核时间》(2018年第一次修订)
- 2025年初中语文教师招聘面试八年级下册逐字稿第25课马说
- 《船舶导航系统》课件
- 2019-2025年初级银行从业资格之初级风险管理模拟题库及答案下载
- 血液肿瘤科知识培训课件
- 网络安全产品代理销售合同
- 广播工程系统施工方案
- 校园超市经营投标方案
评论
0/150
提交评论