Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
Line 677: Line 677:


== '''Функция 62 - пользовательский доступ к PCI.''' ==
== '''Функция 62 - пользовательский доступ к PCI.''' ==
=== Подфункция 0 - получить версию PCI-интерфейса. ===
Параметры:
  * eax = 62 - номер функции
  * bl = 0 - номер подфункции
Возвращаемое значение:
  * eax = -1 - доступ к PCI запрещён; иначе
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
  * старшее слово eax обнулено
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
=== Подфункция 1 - получить номер последней PCI-шины. ===
Параметры:
  * eax = 62 - номер функции
  * bl = 1 - номер подфункции
Возвращаемое значение:
  * eax = -1 - доступ к PCI запрещён; иначе
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Если PCI BIOS не поддерживается, то значение al неопределено.
=== Подфункция 2 - Получить механизм обращения к конфигурационному пространству PCI. ===
Параметры:
  * eax = 62 - номер функции
  * bl = 2 - номер подфункции
Возвращаемое значение:
  * eax = -1 - доступ к PCI запрещён; иначе
  * al = механизм (1 или 2); прочие байты eax разрушаются
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Механизм обращения выбирается в соответствии
    с характеристиками оборудования.
  * Подфункции чтения и записи автоматически работают
    с выбранным механизмом.
=== подфункции 4,5,6 - прочитать PCI-регистр. ===
Параметры:
  * eax = 62 - номер функции
  * bl = 4 - читать байт
  * bl = 5 - читать слово
  * bl = 6 - читать двойное слово
  * bh = номер PCI-шины
  * ch = dddddfff, где ddddd = номер устройства на шине,
    fff = номер функции устройства
  * cl = номер регистра (должен быть чётным для bl=5,
    делиться на 4 для bl=6)
Возвращаемое значение:
  * eax = -1 - ошибка (запрещён доступ к PCI или
    неподдерживаемые параметры); иначе
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
    оставшаяся часть регистра eax разрушается
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
    игнорирует номер функции. Получить механизм доступа можно вызовом
    подфункции 2.
  * Некоторые регистры стандартны и существуют для всех устройств,
    некоторые определяются конкретным устройством. Список первых
    входит, например, в известный Interrupt List by Ralf Brown
    (http://www.pobox.com/~ralf/files.html,
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
    список вторых должен быть указан в документации по устройству.
=== подфункции 8,9,10 - записать в PCI-регистр. ===
Параметры:
  * eax = 62 - номер функции
  * bl = 8 - писать байт
  * bl = 9 - писать слово
  * bl = 10 - писать двойное слово
  * bh = номер PCI-шины
  * ch = dddddfff, где ddddd = номер устройства на шине,
    fff = номер функции устройства
  * cl = номер регистра (должен быть чётным для bl=9,
    делиться на 4 для bl=10)
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
    данные для записи
Возвращаемое значение:
  * eax = -1 - ошибка (запрещён доступ к PCI или
    неподдерживаемые параметры)
  * eax = 0 - успешно
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
    игнорирует номер функции. Получить механизм доступа можно вызовом
    подфункции 2.
  * Некоторые регистры стандартны и существуют для всех устройств,
    некоторые определяются конкретным устройством. Список первых
    входит, например, в известный Interrupt List by Ralf Brown;
    список вторых должен быть указан в документации по устройству.
=== подфункция 11 - инициализировать доступ к MMIO ===
Параметры:
  * eax = 62 - номер функции
  * bl = 11 - номер подфункции
  * cx = адрес PCI-устройства
Возвращаемое значение:
  * eax = -1 - доступ к PCI запрещён;
  * eax = -2 - доступ к MMIO-блокам устройства не разрешён;
  * eax = -3 - ошибка аллокации пользовательской дин. памяти; иначе
  * eax = размер доступной динамической памяти.
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * адрес PCI-устройства должен совпадать с системной переменной
    mmio_pci_addr
=== подфункция 12 - получить линейный адрес MMIO-блока ===
Параметры:
  * eax = 62 - номер функции
  * bl  = 12 - номер подфункции
  * bh  = номер BAR-регистра в конфигурационной зоне PCI
  * ecx = размер MMIO-блока (в байтах)
  * edx = смещение относительно начала MMIO-блока (в 4K-страницах!)
Возвращаемое значение:
  * eax = -1 - доступ к PCI запрещён;
  * eax = -2 - неверный номер BAR-регистра;
  * eax = -3 - BAR не содержит адреса IO;
  * eax = -4 - BAR адресует ''порты'' IO;
  * eax = -5 - ошибка аллокации; иначе
  * eax = начальный адрес MMIO в адресном пространстве приложения.
Замечания:
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
    для приложений подфункцией 12 функции 21.
  * Адрес PCI-устройства задается системной переменной mmio_pci_addr.
  * Предоставленный диапазон линейных адресов должен освобождаться
    посредством вызова функции 62:13
=== подфункция 13 - освободить линейные адреса MMIO ===
Параметры:
  * eax = 62 - номер функции
  * bl  = 12 - номер подфункции
  * ecx = начальный адрес освобождаемого MMIO-блока в адресном
    пространстве приложения
Возвращаемое значение:
  * eax = 1 - блок успешно освобожден;
Замечания:
  * Предварительно приложению должен быть выделен uMMIO-блок (fn62:12)


== Функция 63 - работа с доской отладки. ==
== Функция 63 - работа с доской отладки. ==

Revision as of 15:29, 10 April 2010

СИСТЕМНЫЕ ФУНКЦИИ KolibriOS 0.7.7.0

Номер функции помещается в регистр eax. Вызов системной функции осуществляется командой "int 0x40". Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.