2013-02-19 3 views
1

Мне удалось управлять GPIO с помощью системного вызова mmap для управления работой светодиода непосредственно из пользовательского пространства. Теперь я хочу реализовать драйвер в пространстве ядра.первый драйвер пространства ядра in - linux

Я пытаюсь написать свой первый драйвер устройства пространства ядра для 16 * 2 линии ЖК-дисплея в Linux для контроллера ARM контроллера RPi. Теперь мне нужно получить доступ к GPIO для этой цели.

В AVR я использую для доступа к порту, как это.

#define PORTA *(volatile unsigned char*)0x30 

Я читал LLD он говорит использовать МОП) функция (& OUTB() для доступа к I/O порт.
http://www.makelinux.net/ldd3/chp-9-sect-2

1> Можем ли мы использовать #define адрес порта для доступа к GPIO?

2> В чем преимущества использования inb() & функции outb() для управления GPIO?

Просьба предложить.

ответ

0

1) использование определений часто упрощает задачу. Конечно, вы не можете использовать определение для своего порта и использовать эту конструкцию буквально везде, где вам нужно получить доступ к порту. Но тогда вам придется заменять 0x30 повсюду другим адресом, если вы измените дизайн своего устройства, например, если вы решите подключить свой светодиод к порту B. Также он сделает ваш код менее читаемым. В качестве альтернативы вы можете объявить функцию, которая будет обращаться к вашему порту. Если такая простая функция объявлена ​​inline (если ваш компилятор поддерживает встроенные линии), то нет никакой разницы в производительности.

2) преимуществом использования inb() и outb() является переносимость вашей программы. Если это не проблема, то это нормально для доступа к вашему порту напрямую.

+1

Я думаю, что inb() использует адресное пространство ввода/вывода для чтения порта вместо использования памяти. – Katoch

+0

Я не спорю, обратитесь к компилятору и документам платформы – Serge

+0

Что вы подразумеваете под переносимостью программы? – Katoch

1

В 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 kernel coding style.

 Смежные вопросы

  • Нет связанных вопросов^_^