補充一下,貼一下open函數(shù)的調(diào)用的筆記:
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
原帖由 Godbach 于 2008-12-16 16:44 發(fā)表
LZ說明一下內(nèi)核版本號吧。我這2.6.18.3,dd.c中沒有really_probe函數(shù)。:wink:
原帖由 Godbach 于 2008-12-16 16:44 發(fā)表
LZ說明一下內(nèi)核版本號吧。我這2.6.18.3,dd.c中沒有really_probe函數(shù)。:wink:
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 發(fā)表
一個小問題:
從內(nèi)核代碼中看到USB設備時使用usb_register注冊USB設備,同時使用usb自身的bus_type。那這意味著USB總線是和PCI總線屬于兩種不同的總線。
但為什么在pci_ids.h中,有這樣的定義:
MS在PCI ...
原帖由 eexplorer 于 2008-12-17 09:19 發(fā)表
這些是usb host controller,是一個pci device(可通過lspci找到), 和usb host controller 通信的usb devices才是掛在usb bus上的
原帖由 qinjiana0786 于 2008-12-16 19:16 發(fā)表
分析的過程是正確的,但是在內(nèi)核的PCI的過程上要是展開下就很好,不要只是用圖片或者函數(shù)的調(diào)用路線來形容,畢竟內(nèi)核的部分不是能用只言片語就能一筆帶過的,核心部分還是圍繞著PCI的過程詳細一下就太精彩了,如 ...
和usb host controller 通信的usb devices才是掛在usb bus上的
原帖由 qinjiana0786 于 2008-12-16 19:16 發(fā)表
分析的過程是正確的,但是在內(nèi)核的PCI的過程上要是展開下就很好,不要只是用圖片或者函數(shù)的調(diào)用路線來形容,畢竟內(nèi)核的部分不是能用只言片語就能一筆帶過的,核心部分還是圍繞著PCI的過程詳細一下就太精彩了,如 ...
原帖由 fly6 于 2009-4-8 11:33 發(fā)表
PCI模塊已加載了, 但在/prco/devices中看不到此模塊的信息
這樣我就沒辦法mknod /dev/mypci 建立設備節(jié)點了,用戶空間程序也就沒辦法訪問了
而模塊的信息如下
/sys/bus/pci/devices/0000:01:02.0/
|-- bus - ...
原帖由 wlp555ren 于 2009-7-21 11:35 發(fā)表
有個問題,device結構中的關于設備的ID信息,必要要求與驅動一致,才能與之對應,那這個設備的ID信息是怎么得到的????
歡迎光臨 Chinaunix (http://72891.cn/) | Powered by Discuz! X3.2 |