1.1 驱动程序函数/数据的属性 请在适当的地方使用初始化和清理函数的属性(相应的宏在 <linux/init.h> 中定义): __init初始化代码。在驱动程序初始化后被丢弃。 __exit退出代码。对于非模块驱动程序被忽略。 关于何时/在何处使用上述属性的提示: module_init()/module_exit() 函数(以及仅从这些函数调用的所有...
int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name) void pci_unregister_driver(struct pci_driver *drv) pci_module_init()//在一些驱动程序上作为__pci_register_driver别名 内核根据设备ID查询设备的驱动程序,这是一种探测机制。探测机制有两种方式:静态和动态。
int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name) void pci_unregister_driver(struct pci_driver *drv) pci_module_init()//在一些驱动程序上作为__pci_register_driver别名 内核根据设备ID查询设备的驱动程序,这是一种探测机制。探测机制有两种方式:静态和动态。
static int __init rtl8139_init_module (void) { return pci_module_init (&rtl8139_pci_driver); } 它直接调用了pci_module_init(),这个函数代码在Linux/drivers/net/eepro100.c中,并且把rtl8139_pci_driver(这个结构是在我们的驱动代码里定义的,它是驱动程序和PCI设备联系的纽带)的地址作为参数传给了它。
pci_module_init(&pci_driver); 调用函数后,如果pci_device_id数组中标识的设备存在于系统中,并且该设备恰好还没有驱动程序,则该驱动程序会被安装。下面我们来看从8139too驱动代码中裁剪的pci设备初始化代码: pci_driver.h: /* pci_driver.h * helinqiang@hotmail.com ...
所有的中断处理程序要使用共享中断号还可以使用参数devid将中断号irqs映射为设备数据结其它有用的函数pcifindslot根据设备所在的总线号和插槽号探测相应的pci设备pcisetpowerstate设置pci电源管理状态pcifindcapability在设备的能力表中找出指定的能力pcimoduleinit内联函数确保驱动程序正确的初始化以及错误处理pciresourcestart...
staticvoid __exit example_cleanup_module (void) { pci_unregister_driver(&demo_pci_driver); } /* 加载驱动程序模块入口 */ module_init( example_init_module); /* 卸载驱动程序模块入口 */ module_exit( example_cleanup_module); 1. 2.
static int __init demo_init_module (void) { if (!pci_present()) return -ENODEV; if (!pci_register_driver(&demo_pci_driver)) { pci_unregister_driver(&demo_pci_driver); return -ENODEV; } return 0; } 驱动程序首先调用函数pci_present( )检查PCI总线是否已经被Linux内核支持,如果系统支持PCI...
PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之间传输数据时更好的性能;尽可能的平台无关;简化往系统中添加和删除外设的工作。二、PCI寻址 从现在开始...