补充一下,贴一下open函数的调用的笔记:
static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
const struct pci_device_id *id)
{
int error;
/* 省略 */
error = drv->probe(dev, id);
#define PCI_BASE_CLASS_SERIAL 0x0c
#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00
#define PCI_CLASS_SERIAL_ACCESS 0x0c01
#define PCI_CLASS_SERIAL_SSA 0x0c02
#define PCI_CLASS_SERIAL_USB 0x0c03
#define PCI_CLASS_SERIAL_USB_UHCI 0x0c0300
#define PCI_CLASS_SERIAL_USB_OHCI 0x0c0310
#define PCI_CLASS_SERIAL_USB_EHCI 0x0c0320
#define PCI_CLASS_SERIAL_FIBER 0x0c04
#define PCI_CLASS_SERIAL_SMBUS 0x0c05
int driver_probe_device(struct device_driver * drv, struct device * dev)
{
int ret = 0;
if (drv->bus->match && !drv->bus->match(dev, drv))
goto Done;
pr_debug("%s: Matched Device %s with Driver %s\n",
drv->bus->name, dev->bus_id, drv->name);
dev->driver = drv;
if (dev->bus->probe) {
ret = dev->bus->probe(dev);
if (ret) {
dev->driver = NULL;
goto ProbeFailed;
}
} else if (drv->probe) {
ret = drv->probe(dev);
if (ret) {
dev->driver = NULL;
goto ProbeFailed;
}
}
device_bind_driver(dev);
ret = 1;
pr_debug("%s: Bound Device %s to Driver %s\n",
drv->bus->name, dev->bus_id, drv->name);
goto Done;
ProbeFailed:
if (ret == -ENODEV || ret == -ENXIO) {
/* Driver matched, but didn't support device
* or device not found.
* Not an error; keep going.
*/
ret = 0;
} else {
/* driver matched but the probe failed */
printk(KERN_WARNING
"%s: probe of %s failed with error %d\n",
drv->name, dev->bus_id, ret);
}
Done:
return ret;
}
static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
const struct pci_device_id *id)
{
int error;
#ifdef CONFIG_NUMA
/* Execute driver initialization on node where the
device's bus is attached to. This way the driver likely
allocates its local memory on the right node without
any need to change it. */
struct mempolicy *oldpol;
cpumask_t oldmask = current->cpus_allowed;
int node = pcibus_to_node(dev->bus);
if (node >= 0 && node_online(node))
set_cpus_allowed(current, node_to_cpumask(node));
/* And set default memory allocation policy */
oldpol = current->mempolicy;
current->mempolicy = &default_policy;
mpol_get(current->mempolicy);
#endif
error = drv->probe(dev, id);
#ifdef CONFIG_NUMA
set_cpus_allowed(current, oldmask);
mpol_free(current->mempolicy);
current->mempolicy = oldpol;
#endif
return error;
}
原帖由 Godbach 于 2008-12-16 14:33 发表
一个小问题:
从内核代码中看到USB设备时使用usb_register注册USB设备,同时使用usb自身的bus_type。那这意味着USB总线是和PCI总线属于两种不同的总线。
但为什么在pci_ids.h中,有这样的定义:
MS在PCI ...
原帖由 eexplorer 于 2008-12-17 09:19 发表
这些是usb host controller,是一个pci device(可通过lspci找到), 和usb host controller 通信的usb devices才是挂在usb bus上的
原帖由 qinjiana0786 于 2008-12-16 19:16 发表
分析的过程是正确的,但是在内核的PCI的过程上要是展开下就很好,不要只是用图片或者函数的调用路线来形容,毕竟内核的部分不是能用只言片语就能一笔带过的,核心部分还是围绕着PCI的过程详细一下就太精彩了,如 ...
和usb host controller 通信的usb devices才是挂在usb bus上的
原帖由 qinjiana0786 于 2008-12-16 19:16 发表
分析的过程是正确的,但是在内核的PCI的过程上要是展开下就很好,不要只是用图片或者函数的调用路线来形容,毕竟内核的部分不是能用只言片语就能一笔带过的,核心部分还是围绕着PCI的过程详细一下就太精彩了,如 ...
原帖由 fly6 于 2009-4-8 11:33 发表
PCI模块已加载了, 但在/prco/devices中看不到此模块的信息
这样我就没办法mknod /dev/mypci 建立设备节点了,用户空间程序也就没办法访问了
而模块的信息如下
/sys/bus/pci/devices/0000:01:02.0/
|-- bus - ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |