1 / 11
文档名称:

PCIE开发流程.docx

格式:docx   大小:27KB   页数:11页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

PCIE开发流程.docx

上传人:qsrkmc24 2021/11/22 文件大小:27 KB

下载得到文件列表

PCIE开发流程.docx

文档介绍

文档介绍:精品文档,仅供学习与交流,如有侵权请联系网站删除
【精品文档】第 1 页
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_audio"
static 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,
精品文档,仅供学习与交流,如有侵权请联系网站删除
【精品文档】第 2 页
.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