int __init wwinit(void)
{
int ret;
printk(KERN_ALERT \"\\n\\n\\n\\n\");
wwlogk(\"wwinit: entering - VID=0x%x, DID=0x%x\\n\", WWVID, WWDID); //###############1
ww_init();
ret = alloc_chrdev_region(&wwdev.devno, 0, WWDEV_COUNT, wwdev.name);
if (!ret) {
wwlogk(\"wwinit: device major number = %d\\n\", MAJOR(wwdev.devno)); //###############2
}
else {
wwlogk(\"wwinit: cannot allocate a device major number\\n\");
return ret;
}
ret = pci_register_driver(&wwcodec);
if (!ret) {
wwlogk(\"wwinit: registered pci driver %s\\n\", wwdev.name); //#################3
}
else {
wwelogk(\"wwinit: cannot register pci driver %s\\n\", wwdev.name);
return ret;
}
return 0;
}
以上3处打印信息,在安装wwcode.ko模块的时候,打印出来的信息显示:
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwinit: entering - VID=0x140a, DID=0x100
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwinit: device major number = 252
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: enabled pci device
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: found WW vender id (0x140a) and WW device id (0x100)
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: addr 00000010 BAR[0] = fffff000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: addr 00000014 BAR[1] = fffc0000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: addr 00000018 BAR[2] = fffff008
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[0], base=0x90000000, size=0x00001000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[0] is memory mapped
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[1], base=0x90040000, size=0x00040000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[1] is memory mapped
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[2], base=0x80000000, size=0x00001000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: region[2] is memory mapped
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: found IRQ 18
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000000, Val=0x0100140a
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000001, Val=0x02a00006
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000002, Val=0x06800001
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000003, Val=0x00008008
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000004, Val=0x90000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000005, Val=0x90040000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000006, Val=0x80000008
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000007, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000008, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x00000009, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000a, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000b, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000c, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000d, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000e, Val=0x00000000
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: SAVE PCI Reg=0x0000000f, Val=0x05020100
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: chr device initialized
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: chr device added
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: ChipRev = 54414f53
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwprobe: pci enable bit set to 0
wwcodec((0.1.1-dev-14-03-12-1405)) -- wwinit: registered pci driver wwcodec
由以上打印信息可以看出,probe函数的调用时机为_init函数里动态申请完设备号后,应该是在执行ret = pci_register_driver(&wwcodec);
函数的时候调用probe函数寻找设备。找到之后才注册驱动。
pci_register_driver()->__pci_register_driver()->driver_register()->bus___pci_device_probeadd_driver()->driver_attach()->__driver_attach()->driver_probe_device()->really_probe()->pci_device_probe()->pci_call_probe->probe
本文详细介绍了PCI设备驱动中probe函数的调用时机。在wwinit()函数中,完成设备号分配后,调用pci_register_driver()注册驱动,此时会触发probe函数,用于搜索并初始化匹配的PCI设备。通过对打印信息的分析,揭示了PCI驱动注册及设备探测的过程。
295

被折叠的 条评论
为什么被折叠?



