分类: LINUX
2008-05-12 18:49:13
知道出处请提醒
模块的初始化为module_init(rtl_init_module)
这样在模块初始化时将首先调用rtl_init_module,然后在rtl_init_module中调用
pci_module_init.............
pci_module_init的参数为驱动中定义的rtl_pci_driver
static struct pci_driver rtl8139_pci_driver = {
name: MODNAME,
id_table: rtl_pci_tbl,
probe: rtl_init_one,
remove: rtl_remove_one,
};
id_table:rtl_pci_tbl为标识信息参数,用来寻找匹配的设备
然后调用probe:rtl_init_one初始化整个设备
1、可以使用内核传递过来的设备完整参数结构体struct pci_dev * pdev,通过一些内核函数读取该设备结构体的内容来初始化驱动程序使用的全局私有结构体,这个私有结构体将作为参数传递给中断处理函数(因为中断函数处于独立的上下文中,看不到驱动程序中的全局变量,必须使用参数传递的方式将设备参数传递到中断处理函数中去)
这个结构体的内容包括比如设备的mem空间起始地址、大小,dma操作时申请的内核空间地址、buf指针,等待队列指针或者spin_lock等,还需要包含结构体struct pci_dev * pdev(在模块释放时起到了作用)
2、建立devfs,确定主次设备号,在/dev下建立设备文件
这个是pci设备的module初始化流程,如果是在内存地址空间映射的设备怎么处理呢?设备的基地址之类如何得到