KOS API | Содержание DocPack
Функция 62, подфункция 12 - получить линейный адрес MMIO-блока.
Параметры:
- eax = 62 - номер функции
- bl = 12 - номер подфункции
- bh = номер BAR-регистра в конфигурационной зоне PCI
- ecx = размер запрашиваемого MMIO-блока (в байтах)
- edx = смещение (в 4K-страницах!) в физическом MMIO-блоке
Возвращаемое значение:
- eax = -1 - доступ к PCI запрещён;
- eax = -2 - неверный номер BAR-регистра;
- eax = -3 - BAR не содержит адреса IO;
- eax = -4 - BAR адресует порты IO;
- eax = -5 - ошибка аллокации; иначе
- eax = начальный адрес MMIO в адресном пространстве приложения.
Замечания:
- Предварительно должен быть разрешён низкоуровневый доступ к PCI
для приложений подфункцией 12 функции 21.
- Адрес PCI-устройства задается системной константой (в embedded-версии
ядра - системной переменной) mmio_pci_addr.
- Предоставленный диапазон линейных адресов должен освобождаться
посредством вызова подфункции 13
Cпециальная подподфункция 12-DA - получить линейный адрес статического
DMA-буфера:
Вызов подфункции 12 с bh=0xDA используется в embedded-версиях КолибриОС
для тестирования высокоскоростных PCI-устройств в режиме прямого доступа к
памяти (DMA).
Поскольку для PCI-устройств нет единого, четко определенного стандарта
DMA-операций, программист предварительно должен обеспечить контроль и
организацию режимов захвата системной шины в соответствии с техническим
описанием и регистровой моделью конкретного устройства.
В частности, регистр DMA-адреса устройства должен указывать на блок
адресов в пределах системной области STATIC_DMA_BUFFER. Данная
подподфункция открывает доступ приложению к этой области.
Параметры:
- eax = 62 - номер функции
- bx = 0xDA0C - номер под+подфункции
- ecx = размер запрашиваемого DMA-блока (в байтах)
- edx = смещение (в 4K-страницах!) относительно начала системной области
STATIC_DMA_BUFFER
Возвращаемое значение:
- eax = -1 - доступ к PCI запрещён;
- eax = -2 - пользовательский ПДП не поддерживается в этой версии ядра;
- eax = -3 - недопустимое смещение (попытка доступа к "закрытой"
странице ядерной памяти);
- eax = -4 - недопустимый размер блока (пересекает верхнюю границу
области STATIC_DMA_BUFFER);
- eax = -5 - ошибка аллокации; иначе
- eax = начальный адрес DMA-блока в адресном пространстве приложения.
Замечания:
- Пользовательский ПДП-сервис используется исключительно для отладки драйверов
новых устройств и не включен в стандартное ядро KolibriOS.
- Предоставленный диапазон линейных адресов должен освобождаться посредством
вызова подфункции 13
KOS API | Содержание DocPack
Pterox' DocPack R6. Last Edition: 29.05.2010. История выпусков