pci设备probe函数的调用时机

本文详细介绍了PCI设备驱动中probe函数的调用时机。在wwinit()函数中,完成设备号分配后,调用pci_register_driver()注册驱动,此时会触发probe函数,用于搜索并初始化匹配的PCI设备。通过对打印信息的分析,揭示了PCI驱动注册及设备探测的过程。

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值