2012-01-12 3 views
2

После попытки написать простой драйвер устройства char теперь я хочу написать драйвер устройства char для доступа к контактам GPIO на встроенной плате Linux, такой как Beagleboard. Мне интересно написать модуль "mygpiomodule", который при загрузке должен появиться в /dev/mygpiomodule, так что чтение, запись из пользовательского пространства обращается к GPIO. Я не хочу обращаться к GPIO из пользовательского пространства. Я хочу сделать это в качестве первой попытки написать модуль, который может взаимодействовать с некоторыми периферийными устройствами. Я хочу вставить некоторые светодиоды в порт и попытаться включить или выключить их.Доступ GPIO из пространства ядра

Как я должен это делать?

Благодаря
Мир

ответ

5

К счастью написание драйверов Linux не является слишком сложным, хотя и несколько больше, чем можно преподавать в рамках этого форума. Однако хорошая новость заключается в том, что в Интернете доступно много источников, которые отлично справляются с объяснением того, что вы хотите делать. Вот лишь некоторые из них, которые я использовал (даже для создания драйверов управления GPIO/LED), и они предоставляют исходный код, который работает и может использоваться в качестве базы для вашего драйвера.

Free Software Magazine article

Linux Documentation Project article

O'Reilly Linux Drivers book

Linux Journal article

Сама "TinkerToy" природа Linux обеспечивает большую гибкость. Например, вы можете подумать о том, чтобы ваш драйвер подключался к файловой системе «/ proc» (используя API-интерфейс create_proc_entry()), таким образом вы можете получить доступ к своему драйверу без необходимости писать специальное приложение просто «echo YOURSTRING>/proc/mygpiomodule "для вашего водителя. Для чтения из драйвера будет использоваться «cat/proc/mygpiomodule». В приведенных выше ссылках также приводятся примеры того, как это сделать. Это может помочь при тестировании и доступе к вашему драйверу с помощью сценариев запуска, если вам нужно это сделать.

Потратьте некоторое время на обзор статей/книг, которые я перечислил выше, и, конечно же, Google для большего, если вам нужно. Идите вперед, погрузитесь прямо, и скомпилируйте и запустите некоторые из примеров, и вы скоро придете быстрее.

0

Ядро Linux позволяет легко «играть» с GPIO.

Существует включаемый файл для работы с GPIOs:

#include <linux/gpio.h> 

GPIOs должен быть выделен перед использованием, хотя текущая реализация не обеспечивает это требование. Основная функция распределения является:

int gpio_request(unsigned int gpio, const char *label); 

Параметр GPIO указывает, какой требуется GPIO, а метка связывает строку с ним, что впоследствии может появиться в sysfs. Применяется обычное соглашение: код возврата нуля указывает на успех; в противном случае возвращаемое значение будет отрицательным числом ошибок. GPIO может быть возвращен в систему с:

void gpio_free(unsigned int gpio); 

Некоторые GPIOs используются для вывода, другие для ввода. В любом режиме может использоваться подходящий GPIO, хотя только одно направление активно в любой момент времени.Код ядра должен информировать ядро ​​GPIO о том, как использовать строку; это делается с помощью следующих функций:

int gpio_direction_input(unsigned int gpio); 
int gpio_direction_output(unsigned int gpio, int value); 

В любом случае, gpio - номер GPIO. В выходном случае должно быть указано значение GPIO (ноль или один); GPIO будет установлен соответственно как часть вызова. Для обеих функций возвращаемое значение снова равно нулю или отрицательному числу ошибок. Направление (подходящим образом) GPIO может быть изменено в любое время.

Для входных GPIOs, текущее значение может быть прочитано с:

int gpio_get_value(unsigned int gpio); 

Эта функция возвращает значение предоставленной GPIO; он не имеет никаких условий для возврата кода ошибки. Предполагается (правильно во всех случаях), что любые ошибки будут найдены при вызове gpio_direction_input(), поэтому важно проверить возвращаемое значение этой функции.

Установка значения выходных GPIOs всегда может быть сделано с помощью gpio_direction_output(), но, если GPIO, как известно, в режиме вывода уже, gpio_set_value() может быть немного более эффективным:

void gpio_set_value(unsigned int gpio, int value); 

Для получения дополнительной информации проверьте эту ссылку: enter link description here

0

Если вы хотите только переключить несколько бит GPIO из драйвера ядра, то вы, вероятно, не захотите использовать API-интерфейсы gpio_xxx, о которых упоминается пользователь omotto, поскольку это предназначено в основном, чтобы позволить другому драйверу обращаться к GPIO по имени, а также предоставлять доступ к пользовательскому пространству. Быстрое и грязное решение от davroslyrad было бы более подходящим для вас.

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