Этот чип выглядит как довольно типичный Super I / O контроллер , который в основном является центром, где все «медленные» периферийные устройства объединены в один чипсет.
В Coreboot есть вики-страница, на которой рассказывается о том, как получить доступ к супер I / O .
В архитектуре ПК Port I / O выполняется с использованием специальных инструкций процессора, а именно in
и out
.Это привилегированные инструкции, которые можно использовать только из драйвера режима ядра (кольцо 0) или процесса пользовательского пространства, которому были предоставлены привилегии ввода / вывода.
К счастью, это легко сделать в Linux.Посетите справочную страницу для outb
и друзей .
. Вы используете ioperm (2) или, альтернативно, iopl (2), чтобы сообщить ядру разрешить приложению пространства пользователяполучить доступ к портам ввода / вывода, о которых идет речь.Невыполнение этого условия приведет к тому, что приложение получит ошибку сегментации.
Таким образом, мы можем адаптировать вашу функцию в среде Linux, например:
/* Untested: Use at your own risk! */
#include <sys/io.h>
#include <stdio.h>
#define ReadByte(port) inb(port)
#define WriteByte(port, val) outb(val, port)
int main(void)
{
if (iopl(3) < 0) {
fprintf(stderr, "Failed to get I/O privileges (are you root?)\n");
return 2;
}
/* Your code using ReadByte / WriteByte here */
}
Предупреждение
Вы должны быть очень осторожны при использовании этого метода для непосредственного общения с Super IO, потому что ваша операционная система почти наверняка имеет драйверы устройств, которые также общаются с чипом.
The правильный способ сделать это - написать драйвер устройства, который должным образом координируется с другим кодом ядра, чтобы избежать одновременного доступа к устройству.
Ядро Linux предоставляет GPIO доступ по крайней мере к некоторому Super I /O устройства;должно быть просто перенести один из них на вашу платформу.См. этот запрос на выборку для чипсета IT87xx .