Как управлять светодиодом, подключенным к LPT порту?
Управлять светодиодами в Linux можно с помощью библиотеки parportled
. Однако качество кода у библиотеки низкое и в качестве примера приводить её неправильно. Будем писать свой правильный велосипед, тем более, что это очень просто. Примеры кода на языке C.
Выводы LPT порта со 2 по 9 управляются через порт 0x378. Выводу 2 соответствует 0 бит, выводу 3 соответствует 1 бит, и т.д. Для чтения и записи байта в порт используются функции inb()
и outb()
. Как правило эти функции объявлены в sys/io.h
.
Подключаем заголовочные файлы:
#include <sys/io.h> #include <stdio.h> |
Так как магия (magic-numbers) в коде не приветствуется, сразу объявляем константу BASEPORT:
#define BASEPORT 0x378 |
По умолчанию запись для пользовательских программ в порт запрещена. С помощью функции ioperm()
можно получить доступ к порту, но её выполнение требует привилегий суперпользователя.
int led_init() { return ioperm(BASEPORT,1,1); } |
Функция, которая включает все светодиоды:
void led_on_all() { outb(0xff, BASEPORT); } |
Записывает все единицы в порт. Соответственно, включает все выводы со 2 по 9.
Функция, которая отключает все светодиоды:
void led_off_all() { outb(0x00, BASEPORT); } |
Записывает в порт все нули, тем самым выключает выводы со 2 по 9.
А вот функции, управляющие конкретным светодиодом:
void led_on(unsigned int led) { unsigned char leds = inb(BASEPORT); leds |= 1 << led; outb(leds, BASEPORT); } void led_off(unsigned int led) { unsigned char leds = inb(BASEPORT); leds &= ~(1 << led); outb(leds, BASEPORT); } |
В качестве параметра им передается номер светодиода, от 0 до 7.
Теперь можно добавить функцию main():
int main() { int i; if (led_init() != 0) { fprintf(stderr, "Cannot get permissions to LPT port.\n"); fprintf(stderr, "Program must be run with root privilegies.\n"); return 1; } for (i = 0; i < 8; i++) { led_on(i); sleep(1); led_off(i); } return 0; } |
Компилируем:
gcc lptled.c -o lptled |
Запускаем:
sudo ./lptled |
Светодиоды должны по очереди загореться на секунду и погаснуть.
Нет обратных ссылок на эту запись.
Апрель 9th, 2012 - 23:00
А можете подробнее описать команды?