Linux PCI pci_dev 생 성
3627 단어 linux
struct pci_dev 는 device 의 데이터 구 조 를 설명 합 니 다.
struct pci_driver 는 driver 의 데이터 구 조 를 설명 합 니 다.
struct pci_bus 는 bus 의 데이터 구 조 를 묘사 합 니 다.
device 와 driver 는 모두 bus 에 걸 려 있 습 니 다.
PCI 의 driver 와 device 가 일치 하 는 인증 을 하려 면 vendor, id, class 정 보 를 검증 합 니 다.
static inline const struct pci_device_id * pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
{
if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
(id->device == PCI_ANY_ID || id->device == dev->device) &&
(id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
(id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
!((id->class ^ dev->class) & id->class_mask))
return id;
return NULL;
}
이 함 수 는 pci device 와 driver 가 일치 하 는 최 하층 함수 입 니 다.비 교 된 것 은 vendor, id, class 정 보 를 볼 수 있 습 니 다.호출 경 로 는:
pci_bus_match()->pci_match_device()->pci_match_one_device()
많은 사람들 이 Pci driver 를 어떻게 써 야 하 는 지 소개 했다.pci device 가 언제 만 들 어 졌 는 지 무시 합 니 다.
Pci driver 가 시스템 에 등록 되면 시스템 은 Pci driver 와 Pci device 와 일치 합 니 다.하지만 이 때 는 Pci device 가 만 들 어 졌 기 때문에 match 할 수 있 습 니 다.그럼 pci device 는 언제 만 들 었 나 요?
정 답 은 시스템 초기 화 때.
시스템 초기 화 시 Pci 버스 를 스 캔 하여 위 에 연 결 된 모든 장 치 를 발견 하고 모든 사회 보장 에 struct Pci 를 만 듭 니 다.dev 대상.
pci bus 뿌리 부터 스 캔 합 니 다.
pciscan_slot()
struct pci_bus *pci_scan_root_bus(struct device *parent, int bus,
struct pci_ops *ops, void *sysdata, struct list_head *resources)
{
struct pci_host_bridge_window *window;
bool found = false;
struct pci_bus *b;
int max;
list_for_each_entry(window, resources, list)
if (window->res->flags & IORESOURCE_BUS) {
found = true;
break;
}
b = pci_create_root_bus(parent, bus, ops, sysdata, resources); // pci bus
if (!b)
return NULL;
if (!found) {
dev_info(&b->dev,
"No busn resource found for root bus, will use [bus %02x-ff]
",
bus);
pci_bus_insert_busn_res(b, bus, 255);
}
max = pci_scan_child_bus(b); // pci bus, pci
if (!found)
pci_bus_update_busn_res_end(b, max);
pci_bus_add_devices(b);
return b;
}
unsigned int pci_scan_child_bus(struct pci_bus *bus)
{
unsigned int devfn, pass, max = bus->busn_res.start;
struct pci_dev *dev;
dev_dbg(&bus->dev, "scanning bus
");
/* Go find them, Rover! */
for (devfn = 0; devfn < 0x100; devfn += 8)
pci_scan_slot(bus, devfn); // slot
.
.
.
return max;
}
int pci_scan_slot(struct pci_bus *bus, int devfn)
{
unsigned fn, nr = 0;
struct pci_dev *dev;
if (only_one_child(bus) && (devfn > 0))
return 0; /* Already scanned the entire slot */
dev = pci_scan_single_device(bus, devfn);// ,
if (!dev)
return 0;
if (!dev->is_added)
nr++;
.
.
.
return nr;
}
계속 보기 pciscan_device()
4. 567913. 자, 기본 적 인 절 차 는 바로 이렇다.물론 스 캔 은 pci 다리 가 있 으 면 한 층 더 올 라 가기 때문이다.
핫 플러그 장치 도 있 습 니 다. 꽂 으 면 device 가 생 성 됩 니 다.
struct pci 보고dev 의 생 성 은 Pci 구동 의 구 조 를 더욱 완전 하 게 이해 할 수 있 습 니 다.
On kernel 4.3, the following list shows the sequence of the PCI bus create and scan.
,
The first PCI scan starts from ACPI.
If ACPI is disabled, then it starts from pci_legacy_init().
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.