- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PCIE开发流程
PCIE开发流程前言:对于USB、PCIE设备这种挂接在总线上的设备而言,USB、PCI只是它们的”工作单位”,它们需要向”工作单位”注册(使用usb_driver,pci_driver),并接收”工作单位”的管理(被调入probe()、调出disconnect/remove()、放假suspend()/shutdown()、继续上班resume()等),但设备本身可能是一个工程师、一个前台或者一个经理,因此做好工程师,前台或者经理是其主题工作,这部分对应于字符设备驱动,tty设备驱动,网络设备驱动等。第一节 整体构成整个驱动程序的开发应该包括三个大的部分驱动模块的加载与卸载xxx_init_module()注册pci_driver设备。xxx_cleanup_module()注销pci_driver设备。pci_driver成员函数的初始化xxx_probe()完成PCI设备初始化,注册字符设备xxx_remove()完成PCI设备释放,注销字符设备字符设备file_operations成员函数用于实现上层应用程序对下层驱动程序调用时的调用函数。xxx_open()xxx_release()xxx_ioctl()xxx_read()xxx_write()第二节 PCIE设备实现细节由于PCIE设备的驱动的开发都是按照一个统一规范的框架进行的。因此以一个字符设备为例说明这个框架的实现机制。在所有PCIE驱动开发的过程中驱动程序的初始化和注销涉及的函数为module_init(xxx_init_module),并在init中完成的功能为注册PCIE设备,具体函数内容如下所示:注销涉及的函数为module_exit(xxx_cleanup_module)在exit中完成的功能为注销PCIE设备,具体函数内容如下所示:PCIE设备的注册在模块的初始化过程中,首先是注册PCIE设备,使用函数为pci_register_driver(xxx_pci_driver),输入变量指明了PCIE结构体,如下所示:#define XXX_MODULE_NAME xxx_audiostatic struct pci_driver xxx_pci_driver = {.name= XXX_MODULE_NAME,.id_table= xxx_pci_tbl,.probe= xxx_probe,.remove= __devexit_p(xxx_remove),#ifdef CONFIG_PM.suspend= xxx_pm_suspend,.resume= xxx_pm_resume,#endif /* CONFIG_PM */};结构体中name指明PCIE模块的名称,id_table指明了PCIE的设备驱动号也就是为哪个设备进行驱动等。其中probe函数完成PCI设备的初始化以及其设备本身身份(字符,TTY,网络等)的驱动注册。也是驱动注册中最重要的函数。probe函数讲解首先使能pci设备,pci_enable_device(pci_dev),该函数主要作用是调用底层代码初始化PCI配置空间命令寄存器的I/O位和memory位。设置成总线主DMA模式,pci_set_dma_mask(pci_dev, XXX_DMA_MASK)用于实现对dma设备的设置。读取PCI的配置信息,使用的函数是pci_resource_start (pci_dev, 1)获取设备的内存基地址和所有BAR的长度,4、调用ioremap完成配置信息的映射,可以配置PCI定义的寄存器BAR设置的空间用于映射DMA的寄存器。申请I/O资源,request_region(card-ac97base, 256, card_names[pci_id-driver_data])注册字符/网络设备涉及到的函数为cdev_init(xxx_cdev,xxx_fops);/*注册驱动*/register_chrdev_region(xxx_dev_no,1,XXX);/*申请设备号*/cdev_add(xxx_cdev);/*添加字符设备*/request_irq(card-irq, xxx_interrupt, SA_SHIRQ, card_names[pci_id-driver_data], card))/*申请中断以及注册中断处理程序*/remove函数讲解释放I/O资源 pci_release_regions(pdev)禁止PCI设备 pci_disable_device(pdev)释放占用的设备号register_chrdev_region(xxx_dev_no,1,XXX);注销字符设备cdev_del(xxx_dev.cdev)。设备的file_operations操作在pr
文档评论(0)