Hardware Support/ru
KolibriOS частично обеспечивает поддержку оборудования персонального компьютера. Часть оборудования поддерживается ядром ОС, часть динамически загружаемыми драйверами, мало того система предоставляет возможность прямого доступа к оборудованию прямо из пользовательского режима! Т.е. вы можете написать программу, которая сможет работать с оборудованием используя соответсвующий системный сервис. Правда этот подход лучше использовать исключительно в отладочных или исследовательских целях, а для "нормальной" поддержки оборудования всё-таки писать драйвера. Также нужно понимать, что существуют два вида драйверов:
- Драйвер являющейся частью ядра, т.е. весь его код может находиться в отдельном модуле, но после компиляции ядра он станет частью кода ядра системы (например: hd_drv.inc).
- Драйвер динамически подгружаемый в адресное пространство ядра уже после загрузки системы (например: sound.asm), эти драйвера находятся в специальной системной директории (/rd/1/drivers/).
Состав аппаратного обеспечения ПК
Итак из чего же состоит компьютер? Большинство пользователей, вспомнив уроки информатики, тут же назовут: системный блок, монитор, клавиатура, мышь. Многие подумав добавят HDD, CD/DVD, Floppy приводы, видео, аудио и сетевую карты. А если заглянуть поглубже?
В системном блоке основным элементом является материнская плата, а на ней находится сердце компьютера - центральный процессор (ЦПУ) и оперативная память (ОП). Программиста же решившего написать драйвер для поддержки какого-то устройства в KolibriOS, больше всего заинтересует Южный Мост, чип где сходятся большинство ниточек, контролирующих оборудование. Существует также Северный Мост, посредством которого Южный Мост и связан с ЦПУ и ОП, но его мы пока подробно рассматривать не будем ввиду его небольшой функциональности с точки зрения программиста.
Компоненты южного моста
Большинство устройств представлены в Южном Мосту в качестве так называемых контроллеров - программно-доступных электронных блоков, управляющих работой конкретного оборудования. Из-за огромного разнообразия, многофункциональности и слабой стандартизации современного компьютерного "железа", каждому такому контроллеру требуется уникальный драйвер - специальная системная программа, обеспечивающая инициализацию, конфигурирование, эффективное управление оборудованием в реальной системной среде, и (самое главное!-) быстрый и надежный ввод/вывод потоков информации через данное устройство.
Функционально южный мост включает в себя:
- стандартный контроллер шины PCI;
- контроллер шины PCI Express;
- шина ISA, которая используется достаточно редко, но тем не менее остается неотъемлемой частью любого южного моста.
- контроллер шины SMBus или I2C для связи с другими устройствами на материнской плате (например, для управления вентиляторами);
- DMA контроллер с поддержкой древних ISA и LPC-протоколов прямого доступ к оперативной памяти без участия ЦПУ;
- контроллеры прерываний: старый PIC и "продвинутый" APIC;
- PATA (IDE) и SATA контроллеры;
- контроллер шины LPC для передачи данных и управления SIO (это такие устройства, как клавиатура, мышь, параллельный, последовательный порт, инфракрасный порт и флоппи-контроллер) и BIOS ROM (флэш);
- часы реального времени (Real Time Clock);
- управление питанием (Power management (APM и ACPI) позволяющие переводить компьютер в «спящий режим» или выключать его;
- энергонезависимую память BIOS (CMOS) с независимым электропитанием от батареи, включающая небольшую по область памяти для хранения системных настроек;
- звуковой контроллер (обычно AC97 или Intel HDA).
Опционально южный мост также может включать в себя контроллер Ethernet, RAID-контроллеры, контроллеры USB, контроллеры FireWire и аудио-кодек.
Некоторые южные мосты также включают поддержку клавиатуры, мыши и последовательных портов. Однако, на большинстве системных плат эти устройства подключены через другой чип — Super I/O (контроллер ввода-вывода).
Возникает резонный вопрос: если все эти электронные фишки такие разные, как вообще возможен нормальный старт компьютера и загрузка операционной системы - ведь никаких драйверов в этот момент еще нет, а каждое устройство по-своему уникально и нестандартно?
Во-первых, кое-какая стандартизация всё-таки имеется. Пожалуй, главный и наиболее последовательный стандарт, общий для всех современных ПК-платформ - спецификация шины PCI, включающая единообразные средства идентификации, конфигурации и (в определенных рамках) диагностики устройств. Кроме него, имеется де-факто стандарт древней (legacy) архитектуры IBM PC/AT, низкоуровневая совместимость с которой до сих пор требуется от всех х86-платформ.
Во-вторых, существует ряд спецификаций базовой системы ввода-вывода BIOS, определяющих основные протоколы и структуры данных для работы с контроллерами устройств. После включения питания специальная программа POST (power-on self test) диагностирует и конфигурирует конкретное "железо" в соответствии с их требованиями; по завершении своей работы BIOS осуществляет загрузку операционной системы согласно BIOS Boot Specification.
Примитивный и медленный (но - надёжный и универсальный!) сервис BIOS в той или иной мере используется всеми операционными системами. Особенно велика его роль на этапе загрузки, пока ядро не успело обрасти драйверами и сконфигурировать свои собственные, быстрые и эффективные процедуры взаимодействия с имеющимся оборудованием.
Зависимость КолибриОС от сервиса BIOS очень высока, а специализированные системные драйверы - пока очень немногочисленны.
Поддержка аппаратного обеспечения в KolibriOS
Рассмотрим как же работает с оборудованием KolibriOS.
Список оборудования
- Контроллер шины PCI - поддерживается ядром ОС на вполне удовлетворительном уровне(kernel/bus/pci32.inc)
- Контроллер шины PCI Express - прямой поддержки нет; однако для AMD-процессоров реализовано определение важнейшей PCIe-фичи: адреса расширенного конфигурационного пространства. Для других процессоров этот адрес можно установить вручную (см. kernel/bus/PCIe.inc)
- Контроллер шины PCI-X - не поддерживается
- Контроллер шины SMBus или I2C - не поддерживается
- DMA контроллер - поддерживается ядром ОС
- Контроллер прерываний PIC - поддерживается ядром ОС
- Контроллер прерываний APIC - не поддерживается
- Контроллер PATA (IDE) - поддерживается драйверами соответствующих устройств в ядре (папка /kernel/blkdev).
Системой поддерживаются следующие IDE устройства:
- Floppy привод (flp_drv.inc)
- CD/DVD привод (cd_drv.inc)
- HDD привод (hd_drv.inc)
- SATA контроллеры - системой не поддерживаются; однако в ряде случаев система может работать с SATA- и USB-дисками через BIOS Fn13h в виртуальном V86-режиме (скорость чтения/записи при этом оставляет желать лучшего).
- Контроллер шины LPC - не поддерживается
- Часы реального времени (Real Time Clock) - поддерживается ядром ОС
- Управление питанием APM - поддерживается ядром ОС
- Управление питанием ACPI - поддерживается драйвером ACPICA
- Энергонезависимая память BIOS (CMOS) - поддерживается ядром ОС
- Звуковой контроллер AC97 - поддерживается драйверами соответствующих устройств. Поскольку AC97 стандарт стандартизует только функции кодека и AC-Link, отвечающего за взаимодействие контроллера и кодека, то для различных контроллеров AC97 требуются разные драйвера. В настоящее время система поддерживает контроллеры следующих Южных Мостов:
- Intel Corporation
- ICH0
- ICH1
- ICH2
- ICH3
- ICH4
- ICH5
- ICH6
- NVidia
- NForce
- NForce2
- NForce3
- NForce4
- NForce 500
- Silicon Integrated Systems
- SIS7012
- ForteMedia
- FM801
- VIA
- VT8231
- VT8233
- VT8233C
- VT8235
- VT8237
- VT8237R
- VT8237R Plus
- Intel Corporation
Также контроллер AC97 и аудиокодек могут находиться не на материнской плате компьютера, а на внешней аудиокарте, которая вставляется в слот расширения PCI или ISA. Поддерживаются следующие ISA аудиокарты:
- Creative
- Sound Blaster 16
- Sound Blaster 16 ASP
- Sound Blaster 16 PnP
Поддерживаются следующие PCI аудиокарты:
- Creative
- EMU10K1X
- Звуковой контроллер Intel HDA - системой пока не поддерживается, работа над драйвером ведётся в настоящее время.
- Контроллер USB - частичная поддержка, с помощью драйвера. Поддерживается работа с контроллером, а также с мышью.
- Контроллер FireWire - не поддерживается
- Контроллер RAID - не поддерживается
- Последовательный порт - поддерживается ядром ОС
- Параллельный порт - поддерживается ядром ОС
- Контроллеры Ethernet - в настоящее время поддерживаются драйверами в составе ядра ОС, но ведётся активная работа по выносу кода в динамически подгружаемые драйвера и созданию нового сетевого стека в рамках Net ветки KolibriOS. В настоящее время системой поддерживаются следующие сетевые контроллеры:
- 3Com Corporation
- 3c59x
- 3c900
- 3c905
- 3c980
- 3cSOHO100
- 3c555
- 3c556
- 3c595
- 3c575
- 3cCFE575BT
- 3cCFE575CT
- 3cCFE656
- 3c450
- Realtek Semiconductor Co., Ltd.
- rtl8029 (RTL-8029(AS))
- rtl8139 (RTL-8139/8139C/8139C+, RT8139 (B/C) Cardbus Fast Ethernet Adapter)
- rtl8168 (RTL8111/8168B PCI Express Gigabit Ethernet controller) (rtl8169)
- rtl8169 (RTL-8169 Gigabit Ethernet, RTL-8110SC/8169SC Gigabit Ethernet)
- Accton Technology Corporation
- SMC2-1211TX (rtl8139)
- DELTA Electronics, Inc
- RTL81xx RealTek Ethernet (rtl8139)
- Addtron Technology Co, Inc.
- RTL8139 Ethernet (rtl8139)
- D-Link System Inc
- RTL8139 Ethernet (rtl8139)
- DGE-528T Gigabit Ethernet Adapter (rtl8169)
- DFE-690TXD CardBus PC Card (rtl8139)
- Abocom Systems Inc
- RTL8139 (FE2000VX) CardBus Fast Ethernet Attached Port Adapter (rtl8139)
- Allied Telesyn International
- RTL81xx Fast Ethernet (rtl8139)
- Planex Communications, Inc
- FNW-3603-TX CardBus Fast Ethernet (rtl8139)
- RTL81xx RealTek Ethernet (rtl8139)
- Sega Enterprises Ltd
- RTL81xx Fast Ethernet (rtl8139)
- Edimax Computer Co.
- RTL81xx Fast Ethernet (rtl8139)
- SpeedStream
- 1012 PCMCIA 10/100 Ethernet Card (RTL81xx) (rtl8139)
- LevelOne
- FPC-0106TX misprogrammed (RTL81xx) (rtl8139)
- Northern Telecom
- 10/100BaseTX (RTL81xx) (rtl8139)
- Peppercon AG
- ROL/F-100 Fast Ethernet Adapter with ROL (rtl8139)
- Compaq Computer Corporation
- HNE-300 (RealTek RTL8139c) (iPaq Networking) (rtl8139)
- U.S. Robotics
- USR997902 10/100/1000 Mbps PCI Network Card (rtl8169)
- Intel Corporation
- i8255x
- i82801
- Silicon Integrated Systems
- SIS900
- SIS7016
- AMD
- pcnet32 (79c970 (PCnet32 LANCE), 79c978 (HomePNA))
- NVidia
- NForce
- NForce2
- NForce3
- MCP2A
- CK8S
- CK804
- MCP04
- MCP51
- MCP55
- MCP61
- MCP65
- MCP67
- MCP73
- MCP77
- MCP79
- MCP89
- MYSON Technology Inc
- mtd80x (SURECOM EP-320X-S, MTD-8xx)
- 3Com Corporation
- Устройства ввода - поддерживаются либо ядром ОС, либо драйверами, либо не поддерживаются.
- Устройства ввода графической информации
- Сканер - не поддерживается
- Видео- и Веб-камера - не поддерживается
- Цифровой фотоаппарат - не поддерживается
- Плата видеозахвата - не поддерживается
- Устройства ввода звука
- Микрофон - не поддерживается
- Цифровой диктофон - не поддерживается
- Модем - поддерживается ядром ОС
- Устройства ввода текстовой информации
- Клавиатура (PS/2) - поддерживается ядром ОС
- Клавиатура (USB) - не поддерживается
- Указательные (координатные) устройства с относительным указанием позиции (перемещения)
- Мышь (PS/2) - поддерживается ядром ОС
- Мышь (Com) - поддерживается драйвером
- Мышь (USB) - поддерживается драйвером
- Тачпад - поддерживается ядром ОС в режиме эмуляции мыши (PS/2)
- Трекбол - ?
- Трекпоинт - ?
- Джойстик (LPT) - поддерживается драйвером
- Джойстик (USB) - не поддерживается
- Указательные (координатные) устройства с возможностью указания абсолютной позиции
- Графический планшет - не поддерживается
- Световое перо - не поддерживается
- Игровые устройства ввода
- Педаль - не поддерживается
- Геймпад - не поддерживается
- Руль - не поддерживается
- Рычаг для симуляторов полёта - не поддерживается
- Устройства ввода общего назначения
- Сенсорный экран - не поддерживается
- Устройства ввода графической информации
- Видеокарты - поддерживаются драйверами. Следует отметить, что основным видеодрайвером Колибри является драйвер стандартизованной графики VESA, которая поддерживается абсолютным большинством современных компьютеров. Поддержка VESA осуществляется ядром ОС. Но есть возможность использовать также специализированные драйвера для видеокарт. Первым и на настоящее время единственным специализированным видеодрайвером в Колибри является драйвер для всех моделей ATI Radeon, который поддерживает аппаратный курсор мыши, смену видеорежимом и акселерацию двумерной графики.
Ресурсы предоставляемые системой для контроля оборудования
Для контроля оборудования используются обработчики аппаратных прерываний (IRQ), диапазоны адресного пространства памяти PCI и/или адресного пространства ввода-вывода PCI (memory mapped IO (mmio) или, иначе говоря, порты) настроенные BIOS для конкретного оборудования. Некоторые устройства не нуждаются в тех или иных системных ресурсах. Так как большинство устройств использующих системные ресурсы относятся к PCI устройствам, то доступ к ним и осуществляется через эту шину. Следует заметить, что шина PCI Express обратно совместима с PCI и с операциями с PCI Express без проблем справляется системный код PCI в ядре Колибри. Любое PCI устройство необходимо найти на шине, определить параметры его конфигурационного пространства и инициализировать, т.е. подготовить устройство для дальнейшей работы. PCI устройства могут существенно отличаться друг от друга по используемым ресурсам и методам инициализации оборудования, но часть конфигурационного пространства является стандартной для всех устройств, что и позволяет точно идентифицировать имеющееся оборудование на шине. Пример поиска оборудования на шине PCI см. в файле /drivers/sceleton.asm, этот файл является основой (фундаментом) для написания новых драйверов.
Системой поддерживается только контроллер прерываний PIC, который предоставляет 16 аппаратных прерываний, при этом на одно прерывание в Колибри пока можно повесить только один обработчик. Таким образом если прерывание, которое использует какое-то устройство уже занято другим устройством, то для того чтобы оба устройства корректно работали нужно сделать так чтобы BIOS переназначил прерывание, использовав ещё не занятое (обычно это достигается отключением-включением устройств через BIOS или в более сложных случаях физически, но некоторые BIOS позволяют вручную задать используемое устройством прерывание IRQ). Также нужно учитывать, что часть прерываний уже зарезервирована системой. Учитывая всё это, нужно грамотно раздать прерывания устройствам, чтобы никого "не обидить".
Адреса диапазонов адресного пространства памяти PCI и/или адресного пространства ввода-вывода PCI содержаться в соответствующих полях конфигурационного пространства конкретного устройства. С помощью этих системных ресурсов программистом и контролируется состояние устройства. Вся разница между этими ресурсами с точки зрения программиста состоит в способе чтения и записи данных in/out для mmio и обычная пересылка данных между регистрами и памятью с помощью команды mov для диапазонов памяти.
Что необходимо для того, чтобы написать драйвер
Больше всего потребуется непреклонное желание добиться поставленной цели не смотря ни на какие сложности возникающие по ходу работы, это может быть основное, что вам понадобиться, как в принципе и при решении любой другой задачи. Кроме этого вам необходимо:
- Прочитать статью ["Пишем драйвер для КолибриОС"]
- Достать спецификацию (datasheet) на конкретный Южный Мост и/или конкретное устройство на которое пишется драйвер
- Если уже существуют в Колибри драйвера аналогичных устройств, то неплохо было бы почитать их код (посмотреть "как это делается")
- Очень желательно смотреть исходный код драйверов нужного устройства для других ОС для понимания в общем и целом способов управления устройством
- Уметь искать необходимую для разработки информацию, чем больше полезной информации тем лучше
- Не будет лишним также общаться с другими разработчиками драйвером, в случае возникновения сложных вопросов