Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
return 0;
}
Итак, устройство найдено. Считываем из конфигурационного пространства код фирмы-производителя и заносим это значение в структуру struct pci_dev_struct pdev:
/* Read VENDOR ID */
idx = 0x00;
if(pci_bios_read(pdev.bus, pdev.dev, pdev.fn, idx, 2, &config_dword) == PCIBIOS_SUCCESSFUL)
pdev.vendor_id = (u16)config_dword;
То же самое – для кода типа устройства и для кода класса устройства:
/* Read DEVICE ID */
idx = 0x02;
if(pci_bios_read(pdev.bus, pdev.dev, pdev.fn, idx, 2, &config_dword) == PCIBIOS_SUCCESSFUL)
pdev.device_id = (u16)config_dword;
/* Read Class Code */
idx = 0x08;
if(pci_bios_read(pdev.bus, pdev.dev, pdev.fn, idx, 4, &config_dword) == PCIBIOS_SUCCESSFUL)
pdev.class_code = config_dword >> 8;
Считываем значение командного регистра:
/* Read Command Register */
idx = 0x04;
if(pci_bios_read(pdev.bus, pdev.dev, pdev.fn, idx, 1, &config_dword) == PCIBIOS_SUCCESSFUL)
command_reg = config_dword;
Считываем значение базового адреса в пространстве I/O. Предварительно проверяем, чтобы бит 0 командного регистра был установлен в единицу. Если это так, то выполняем поиск базового адреса устройства:
/* Read Base Address Registers */
idx = 0x10;
if(command_reg & 0x01) {
for(; idx < 0x28 ;) { // сканируем Base Address Registers в поисках адреса порта I/O
if(pci_bios_read(pdev.bus, pdev.dev, pdev.fn, idx, 4, &config_dword) == PCIBIOS_SUCCESSFUL) {
if(config_dword & 0x01) { // если нулевой бит равен 1, то адрес порта I/O найден
config_dword &= ~0x1;