Первый драйвер пространства ядра в - linux
Я смог управлять GPIO, используя системный вызов mmap для управления работой светодиодов непосредственно из пространства пользователя. Теперь я хочу реализовать драйвер в пространстве ядра.
Я пытаюсь написать свой первый драйвер устройства пространства ядра для 16*2 линейки LCD в Linux для контроллера ARM RPi. Теперь мне нужно получить доступ к GPIO для этой цели.
В AVR я использую для доступа к порту, как это.
#define PORTA *(volatile unsigned char*)0x30
Я читал LLD, он говорит использовать функцию inb() & outb() для доступа к порту ввода / вывода.
http://www.makelinux.net/ldd3/chp-9-sect-2
1> Разве мы не можем использовать #define адрес порта для доступа к GPIO?
2> В чем преимущества использования функций inb () и outb () для управления GPIO?
Пожалуйста, предложите.
2 ответа
1) использование определений часто упрощает вашу задачу. Конечно, вы можете не использовать define для вашего порта и использовать эту конструкцию буквально везде, где вам нужно получить доступ к порту. Но тогда вам придется заменить 0x30 везде на другой адрес, если вы измените дизайн вашего устройства, например, если вы решите подключить свой светодиод к порту B. Кроме того, это сделает ваш код менее читаемым. В качестве альтернативы вы можете объявить функцию, которая будет обращаться к вашему порту. Если объявлена такая простая функция inline
(если ваш компилятор поддерживает встроенные функции), то разница в производительности отсутствует.
2) преимущество использования inb()
а также outb()
это переносимость вашей программы. Если это не проблема, тогда можно получить прямой доступ к вашему порту.
В AVR я использую для доступа к порту, как это.
#define PORTA *(volatile unsigned char*)0x30
Это неправильное определение, которое перегружает символ PORTA
,
Помимо определения адреса порта 0x30, вы также разыменовываете это местоположение.
Так что на самом деле это операция чтения, но в названии нет указаний на это, т.е. вы действительно определили макрос для READ_PORTA
,
1> Разве мы не можем использовать #define адрес порта для доступа к GPIO?
Конечно, вы можете (и должны).
#define PORTA (unsigned char *)0x30
Подобные операторы вы найдете в заголовочных файлах для регистров устройств в дереве исходных текстов Linux. При разработке нового драйвера устройства, я ищу файл заголовка #defines
для всех регистров устройства и кодов команд, и начните писать один, если файл уже не доступен.
2> В чем преимущества использования функций inb() и outb() для управления GPIO?
В этом случае код является однозначным утверждением о том, что ввод-вывод выполняется независимо от того, использует ли архитектура порты ввода-вывода или отображение ввода-вывода с отображением в памяти.
Любой, кто читает следующее, должен иметь возможность определить, что происходит:
x = inb(PORTA);
против путаницы при использовании вашего макроса:
x = PORTA;
Вышеприведенное утверждение, использующее перегруженный макрос, не пройдет проверку кода, выполненную компетентными кодировщиками.
Вам также следует ознакомиться со стилем кодирования ядра Linux и использовать его.