PCI总线

pci总线描述

struct pci_driver {
    struct list_head node;
    char*name;
    conststruct pci_device_id *id_table;
    int(*probe)(struct pci_dev *dev,conststruct pci_device_id *id);/* New device inserted */
    void(*remove)(struct pci_dev *dev);/* Device removed (NULL if not a hot-plug capable driver) */
    int(*suspend)(struct pci_dev *dev,pm_message_t state);/* Device suspended */
    int(*suspend_late)(struct pci_dev *dev,pm_message_t state);
    int(*resume_early)(struct pci_dev *dev);
    int(*resume)(struct pci_dev *dev);/* Device woken up */
    void(*shutdown)(struct pci_dev *dev);
    struct pci_error_handlers *err_handler;
    struct device_driver driver;
    struct pci_dynids dynids;
};

 

注册PCI驱动

pci_register_driver(struct pci_driver *drv)

 

当一个驱动注册,通过遍历id_table中所有的厂商id、设备id和系统中存在的PCI设备比对,然后进行probe()函数

(1)使能设备

int pci_enable_device(struct pci_dev *dev)

(2)获取基地址(物理地址)

ioaddr=pci_resource_start(pdev, 0)

(3)申请要使用的地址空间

i = pic_request_regions(pdev, DRV_NAME);

irq = pdev->irq;

ioaddr = (long)ioremap(ioaddr, 0x400);  //物理地址转换虚拟地址

接下来

posted @ 2020-11-24 22:51  11YS  阅读(249)  评论(0)    收藏  举报