Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
case 2: // считываем слово
*value = inw(0xCFC + (reg & 2));
break;
case 4: // считываем двойное слово
*value = inl(0xCFC);
break;
}
return 0;
}
Функция pci_direct_find_class() выполняет поиск устройства заданного класса, используя Configuration Mechanism #1, и возвращает его координаты – номер шины, номер устройства на шине и номер функции:
int pci_direct_find_class(u32 class_code, struct pci_dev_struct *pd)
{
Параметры функции – код класса устройства и структура struct pci_dev_struct *pd, в которую необходимо записать координаты устройства.
int bus, dev, fn = 0, idx = 0x08;
u32 config_dword, code;
Переменная idx – это смещение в конфигурационном пространстве устройства, и указывает оно на поле Revision ID, за которым следуют три байта поля Class Code. Для считывания Class Code достаточно считать двойное слово, находящееся по смещению idx, и сдвинуть результат на 8 бит в сторону младших разрядов.
Для поиска устройства по коду класса необходимо просканировать все шины, все устройства на каждой шине и все функции устройства – до тех пор, пока не найдем устройство соответствующего класса (или пока не закончатся шины). С этой целью организуем цикл:
printk(KERN_INFO "Looking for device with class code 0x%X ", class_code);
memset(pd, 0, sizeof(struct pci_dev_struct));
for(bus = 0; bus < 256; bus++) { // сканируем все шины
for(dev = 0; dev < 32; dev++) { // сканируем все устройства на каждой шине
for(fn = 0; fn < 8; fn++) { // сканируем все функции
Считываем двойное слово, находящееся по смещению idx, и получаем код класса:
pci_direct_read(bus, dev, fn, idx, 4, &config_dword);
code = config_dword >> 8;
Сравниваем полученный код класса с искомым. При совпадении сохраняем координаты устройства
if(code == class_code) {
printk(KERN_INFO "OK. Device found. ");