Первый драйвер пространства ядра в - 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 и использовать его.

Другие вопросы по тегам