SII писал(а):
А вообще, попробуйте для интереса построить полное дерево периферии на PCI и вывести его куда-нибудь, чтобы потом спокойно проанализировать, какие устройства были обнаружены и всё такое.
Нашел такой список, написано в linux используется (но видимо старый он) с именами устройств по id, в qemu нашлись все устройства, а на реальном ни одно.. Но все равно спасибо за подсказку)
И да, список оказался полным.. Ну по крайней мере количество совпало. Мог и не учесть чего либо.
Himik писал(а):
grenders22 писал(а):
И если да, то все до типы устройств так найти могу?
Да, по Class Code и Subclass определяются типы всех стандартных устройств.
SII писал(а):
и будешь искать, где ты ошибаешься.
Я так понял, что список цифр есть, и осталось в них разобраться.
Так точно, список есть. Разбирательством и занимаюсь))
Что-то белиберда получается. То ли я не верно определяю классы, то ли у него список узкий.. В QEMU попытался определить у контроллера AHCI, а получил не существующее.. Приложил код, чувствую я где-то по глупости своей наерундил..
Код:
uint16_t getProgIf(uint8_t bus, uint8_t slot)
{
return pciReadWord(bus, slot, 0, 0x09);
}
uint16_t getSubClass(uint8_t bus, uint8_t slot)
{
return pciReadWord(bus, slot, 0, 0x0a);
}
uint16_t getClassCode(uint8_t bus, uint8_t slot)
{
return pciReadWord(bus, slot, 0, 0x0b);
}
uint32_t pciReadWord (uint32_t bus, uint32_t slot, uint32_t func, uint8_t offset)
{
address = (uint32_t)((bus << 16) | (slot << 11) |
(func << 8) | (offset & 0xfc) | ((uint32_t)0x80000000));
outportl (0xCF8, address);
if (offset == 0x24)
return inportl(0xCFC) ;
else
return (uint16_t)( (inportl(0xCFC) >> ((offset & 2) * 8) ) & 0xffff);
}