pci遍历的顺序,第一个桥的系统号是0,深度优先. pci桥也是一种设备,当遍历到的设备是桥的时候产生系统号1,并且,这个总线上的
设备的系统号就是1,以此类推,当遍历到的设备又是桥的时候产生系统号2,挂载在这个总线设备上的设备的系统号就是2,
不同厂商的pci设备都能处理.和平台总线类似,
基地址是一种物理地址需要做映射,为什么是物理地址呢?我以为是一种编号.
static struct pci_driver hamachi_driver = {
name: DRV_NAME,
id_table: hamachi_pci_tbl,
probe: hamachi_init_one,
remove: __devexit_p(hamachi_remove_one),
};
pci_register_driver(&hamachi_driver)//初始化
static struct pci_device_id hamachi_pci_tbl[] __initdata = {
{ 0x1318, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },
{ 0x3319, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },
}
分别是厂商号,设备号,子厂商号,子设备号,其中子厂商号,子设备号为PCI_ANY_ID,表示支持各种子类型,pci可以支持不同厂
商的同一类型设备.当注册驱动时,pci会遍历所有的总线上所有的设备,如果2者之间的id相同,那么就会调用驱动的probe函数.一个
pci设备有一个2个字节的vendor id 一个2个字节的device id .如果设备和驱动厂商号和设备号匹配,那么调用驱动的probe设备.一
设备的系统号就是1,以此类推,当遍历到的设备又是桥的时候产生系统号2,挂载在这个总线设备上的设备的系统号就是2,
不同厂商的pci设备都能处理.和平台总线类似,
基地址是一种物理地址需要做映射,为什么是物理地址呢?我以为是一种编号.
static struct pci_driver hamachi_driver = {
name: DRV_NAME,
id_table: hamachi_pci_tbl,
probe: hamachi_init_one,
remove: __devexit_p(hamachi_remove_one),
};
pci_register_driver(&hamachi_driver)//初始化
static struct pci_device_id hamachi_pci_tbl[] __initdata = {
{ 0x1318, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },
{ 0x3319, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },
}
分别是厂商号,设备号,子厂商号,子设备号,其中子厂商号,子设备号为PCI_ANY_ID,表示支持各种子类型,pci可以支持不同厂
商的同一类型设备.当注册驱动时,pci会遍历所有的总线上所有的设备,如果2者之间的id相同,那么就会调用驱动的probe函数.一个
pci设备有一个2个字节的vendor id 一个2个字节的device id .如果设备和驱动厂商号和设备号匹配,那么调用驱动的probe设备.一
个pci驱动中可以处理很类型或者不同厂商的设备,hamachi_pci_tbl[] 中可以存放很多厂商号和设备号.
总线这一种驱动模型,就是为了,增加了程序的可移植性,实现热插拔,便于匹配驱动程序,一个输入子系统驱动也是是一个平台驱动, 一个pci总线设备也可以是一个网卡设备