Раніше я розробляв апаратне забезпечення PCI-Express, яке вимагало повної підтримки гарячих штекерів апаратного та програмного забезпечення, і це, безумовно, можливо, але це досить задіяно і вимагає широкої програмної підтримки - апаратне забезпечення насправді досить просте. Мені довелося розробити обладнання, потім реалізувати підтримку BIOS (UEFI) та ядра (Linux) для гарячого підключення довільних пристроїв PCIe над волокном і міддю.
З точки зору програмного забезпечення потрібно пам’ятати, що PCIe продовжує розробляти модель програмного забезпечення PCI, включаючи концепції адресації шини, пристрою та функції. Коли шина PCI перераховується, це робиться як пошук вперше:
Перерахування PCIe, як правило, робиться двічі. По-перше, ваш BIOS (UEFI або інше) зробить це, щоб з'ясувати, хто присутній і скільки пам'яті їм потрібно. Потім ці дані можуть бути передані хост-операційній системі, яка може вважати її такою, яка є, але Linux та Windows часто також виконують свою процедуру перерахування. В Linux це робиться за допомогою основної підсистеми PCI, яка здійснює пошук шини, застосовує будь-які примхливості, якщо необхідно, на основі ідентифікатора пристрою, а потім завантажує драйвер, який має відповідний ідентифікатор у своїй функції зондування. Пристрій PCI ідентифікується за допомогою комбінації його ідентифікатора постачальника (16 біт, наприклад, Intel 0x8086) та ідентифікатора пристрою (ще 16 біт) - найпоширеніше джерело Інтернету тут: http://pcidatabase.com / .
Під час цього процесу перерахування входить спеціальна частина програмного забезпечення, і це означає, що ви повинні заздалегідь зарезервувати номери PCI шини та сегменти пам'яті для потенційних майбутніх пристроїв - це іноді називають " прокладкою шини ". Це дозволяє уникнути необхідності повторного перерахування шини в майбутньому, що часто не може бути здійснено без порушення системи. Пристрій PCI має BAR ( регістри базової адреси)), який запитує хосту, скільки і якого типу (пам'яті або простору вводу / виводу) пам'яті потрібен пристрій - ось чому вам більше не потрібні перемички, такі як ISA :) Так само, ядро Linux реалізує гарячу пробку PCIe через pciehp водій. Windows робить різні речі на основі версії - старіші версії (я думаю, що XP) ігнорують все, що говорить BIOS, і роблять це власне зондування. Новіші версії, на мою думку, з повагою ставляться до ACPI DSDT, що надається вбудованим програмним забезпеченням (BIOS / EFI) і включатимуть цю інформацію.
Це може здатися досить задіяним, і це так! Але пам’ятайте, що будь-який ноутбук / пристрій із слотом ExpressCard (який реалізує PCIe, оскільки ви можете мати лише ExpressCards лише для USB), повинен робити це, хоча загалом прокладки досить прості - лише одна шина. Моє старе обладнання було перемикачем PCIe, який мав позаду ще 8 пристроїв, тому набивання дещо складніше.
З апаратної точки зору, це набагато простіше. GND-штифти картки спочатку контактують, і ми розміщуємо IC-контролер гарячої заміни з LTC або подібного на карту для послідовного живлення після того, як з'єднання встановлено. У цей момент бортовий ASIC або FPGA починає свою послідовність включення живлення та починає намагатися тренувати свою посилання PCI Express. Припустимо, що хост підтримує гаряче підключення та PCI Express SLTCAP / SLTCTRLреєструватись (у специфікації: Реєстр можливостей слотів PCI Express, Регістр управління слотами PCI Express. Для цього є також 1 і 2 - достатньо бітів для поділу на два регістри). для цього порту було налаштовано так, щоб порт міг підтримувати гарячу підключення, програмне забезпечення може почати перераховувати новий пристрій. Реєстр статусу слота (SLTSTA, реєстр статусу слота PCI Express) містить біти, які цільовий пристрій може встановлювати із зазначенням несправностей живлення, механічної засувки вивільнення та, звичайно, виявлення присутності + зміна присутності.
Вищезазначені регістри розміщені у "просторі конфігурації PCI (Express)", що є невеликою областю карти пам'яті (4K для PCIe), виділеної кожному потенційному bdf (шина: пристрій: функція). Фактичні регістри зазвичай знаходяться на периферійному пристрої.
Що стосується хоста, ми можемо використовувати PRSNT1 # / PRSNT2 # як прості сигнали постійного струму, які подають активізацію перемикача живлення IC, або бігають до GPIO на чіпсеті / PCH, щоб викликати IRQ і запускати SW 'hey, щось вставлено , іди знайди та налаштуй! ' рутина.
Це багато інформації, яка не відповідає безпосередньо на ваше запитання (див. Нижче для швидкого резюме), але, сподіваємось, це дає вам кращу інформацію в розумінні процесу. Якщо у вас виникли запитання щодо конкретних частин процесу, повідомте мене в коментарях тут або надішліть мені електронний лист, і я можу обговорити далі + оновити цю відповідь цією інформацією.
Підводячи підсумок - периферійний пристрій, мабуть, був розроблений з підтримкою гарячої штекери з урахуванням апаратних POV. Правильно розроблений хост / слот також здатний використовувати гарячу підключення, і на висококласній материнській платі я б очікував, що це буде безпечно. Однак підтримка програмного забезпечення для цього є цілком іншим питанням, і ви, на жаль, належите до BIOS, який постачав вам OEM.
На практиці ви використовуєте цю технологію, коли ви виймаєте / вставляєте PCIe ExpressCard з комп'ютера. Крім того, високопродуктивні лезові системи (телекомунікаційні чи інші) також регулярно використовують цю технологію.
Остаточний коментар - збережіть PDF-файл, який був пов’язаний з базовою специфікацією, PCI-SIG зазвичай за це стягує долари :)