P CIE 开发流程 前言:对于USB、PCIE 设备这种挂接在总线上的设备而言,USB、PCI 只是它们的”工作单位”,它们需要向”工作单位”注册(使用 usb_driver,pci_driver),并接收 ”工作 单位 ”的管 理 ( 被调 入 probe()、 调 出 disconnect/remove() 、 放 假suspend()/shutdown()、继续上班 resume()等),但设备本身可能是一个工程师、一个前台或者一个经理,因此做好工程师,前台或者经理是其主题工作,这部分对应于字符设备驱动,tty 设备驱动,网络设备驱动等。 第一节 整体构成 整个驱动程序的开发应该包括三个大的部分 1.1 驱动模块的加载与卸载 xxx_init_module()注册 pci_driver 设备。 xxx_cleanup_module()注销 pci_driver 设备。 1.2 pci_driv er 成员函数的初始化 xxx_probe()完成 PCI 设备初始化,注册字符设备 xxx_remove()完成 PCI 设备释放,注销字符设备 1.3 字符设备 file_operations 成员函数 用于实现上层应用程序对下层驱动程序调用时的调用函数。 xxx_open() xxx_release() xxx_ioctl() xxx_read() xxx_write() 第二节 P CIE 设备实现细节 由于PCIE 设备的驱动的开发都是按照一个统一规范的框架进行的。因此以一个字符设备为例说明这个框架的实现机制。在所有PCIE 驱动开发的过程中 2.1 驱动程序的初始化和注销 涉及的函数为 module_init(xxx_init_module),并在 init 中完成的功能为注册PCIE 设备,具体函数内容如下所示: 注销涉及的函数为module_exit(xxx_cleanup_module)在exit 中完成的功能为注销PCIE 设备,具体函数内容如下所示: 2.2 P CIE 设备的注册 在模块的初始化过程中,首先是注册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, .resume = xxx_pm_resume, #endif /* CONFIG_PM */ }; 结构体中name 指明PCIE 模块的名称,id_table 指明了PCIE 的设备驱动号也就是为哪个设备进行驱动等。 其中probe 函数完成PCI 设备的初始化以及其设备本身身份(字符,TTY,网络等)的驱动注册。...