Justworks.ru

18Янв/111

Как управлять светодиодом, подключенным к 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

Светодиоды должны по очереди загореться на секунду и погаснуть.


Комментарии (1) Пинги (0)
  1. А можете подробнее описать команды?


Оставить комментарий

Нет обратных ссылок на эту запись.