Управление lpt/com/usb портами (Есть ли возможность без написания своей программы?)

Выбор и настройка HardWare

Модератор: Модераторы разделов

Ответить
Den001
Сообщения: 666
ОС: Suse 11

Управление lpt/com/usb портами

Сообщение Den001 »

Не знаю куда больше подходит тема. То ли в программирование, то ли сюда. Покопал гугл на предмет управления lpt портом (типа зажигать/гасить светодиоды). Варианты есть, но все они почему-то связаны с написанием своей программы, хотя и не сложной, но все же. А нет ли в линуксе уже готовой возможности для этого (для уставновления значений на контактах данных lpt порта)? что-нить типа echo 1/0 > /dev(proc)/<lpt>
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Управление lpt/com/usb портами

Сообщение elide »

похоже, Вы первый, кому это понадобилось....
в основном народ не гнушается написания элементарных программ....
слава роботам!
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Думаю, что я не первый кому понадобилось. Прсто, наверное, нет стандартных средств для этого... так что придется тоже не гнушаться написания элементарных программ :)
Спасибо сказали:
KriK
Сообщения: 90
ОС: Ubuntu 7.04
Контактная информация:

Re: Управление lpt/com/usb портами

Сообщение KriK »

Вы не первый. Я тоже пытался раньше играться с lpt, com. Всетаки придется писать прогу, я так думаю. Может кто-нибудь поможет с доками или сорцом с примером?
Linux Registered user #392927
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Управление lpt/com/usb портами

Сообщение Liksys »

Держите, братцы:

Код: Выделить всё

/************************************************************************
*                                    *
*    lptout - vkluchaet ili vyklychaet ukazannyy kanal v        *
*        portu LPT. Programma sozdana dlya raboty s        *
*        ustroystvom NK150 ot Master Kit.            *
*                                    *
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/io.h>
/***********************************************************************/
#define MYNAME "lptout"

#define LPT_PORT 0x378

#define CHANNEL_1 0x1
#define CHANNEL_2 0x2
#define CHANNEL_3 0x4
#define CHANNEL_4 0x8
#define CHANNEL_5 0x10
#define CHANNEL_6 0x20
#define CHANNEL_7 0x40
#define CHANNEL_8 0x80
#define ALL_CHANNELS_ON 0xff
#define ALL_CHANNELS_OFF 0x0
/***********************************************************************/
void init_port(unsigned long port);
void close_port(unsigned long port);
void send_signal(unsigned char signal, unsigned long port);
unsigned char channel_to_signal(int ch);
unsigned char load_signal(unsigned long port);
/***********************************************************************/
/***********************************************************************/
int main(int argc, char **argv)
{
    ////////////////////////
    int ch;               // Nomer kanala
    unsigned char signal; // Signal
    ////////////////////////

    if ( argc != 2 )
    {
        fprintf(stderr, "usage: %s \"channel\"\n", MYNAME );
        exit(1);
    }

    if ( !isdigit( (int) argv[1][0]) )
    {
        fprintf(stderr, "usage: %s \"channel\"\n", MYNAME );
        exit(1);
    }

    ch = atoi(argv[1]); // Poluchaem nomer kanala

    if ( ch < 0 || ch > 9 )
    {
        fprintf(stderr, "%s 0 <= channel <= 9\n", MYNAME );
        exit(1);
    }

    signal = channel_to_signal(ch); // Delaem signal iz kanala

    init_port(LPT_PORT); // Otkryvaem port

    if ( (signal != ALL_CHANNELS_OFF) && (signal != ALL_CHANNELS_ON) )
        signal ^= load_signal(LPT_PORT); // Dobavlyaem k signalu starye znacheniya

    send_signal(signal, LPT_PORT); // Otpravlyaem signal

    close_port(LPT_PORT); // Zakryvaem port

    return 0;
}
/***********************************************************************/
void init_port(unsigned long port)
{
    if ( ioperm(port, 1, 1) != 0 )
    {
        fprintf(stderr, "%s: cannot get port 0x%x: %s\n",
            MYNAME, port, strerror(errno) );
        exit(1);
    }
}
/***********************************************************************/
void close_port(unsigned long port)
{
    if ( ioperm(port, 1, 0) != 0 )
    {
        fprintf(stderr, "%s: cannot close port 0x%x: %s\n",
            MYNAME, port, strerror(errno) );
        exit(1);
    }
}
/***********************************************************************/
void send_signal(unsigned char signal, unsigned long port)
{
    outb(signal, port);
}
/***********************************************************************/
unsigned char channel_to_signal(int ch)
{
    switch (ch)
    {
        case 1 : return CHANNEL_1;
        case 2 : return CHANNEL_2;
        case 3 : return CHANNEL_3;
        case 4 : return CHANNEL_4;
        case 5 : return CHANNEL_5;
        case 6 : return CHANNEL_6;
        case 7 : return CHANNEL_7;
        case 8 : return CHANNEL_8;
        case 9 : return ALL_CHANNELS_ON;
        case 0 : return ALL_CHANNELS_OFF;
    }

    return ALL_CHANNELS_OFF;
}
/***********************************************************************/
unsigned char load_signal(unsigned long port)
{
    return inb(port);
}
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/

И Makefile для нее:

Код: Выделить всё

##
# Makefile
CC=gcc
#
PROG=lptout
OBJ=lptout.o
SRC=lptout.c
#
#
lptout: $(OBJ)
    $(CC) -o $(PROG) $(SRC)

clean:
    rm -f $(OBJ) $(PROG)

Положить в один каталог и сделать make. Потом chmod +x lptout от рута. Работайте на здоровье B) Я ее написал для одного девайса, на www.masterkit.ru посмотрите, кому интересно, а потом делал цветомузыку восьмиканальную через LPT :)
Спасибо сказали:
KriK
Сообщения: 90
ОС: Ubuntu 7.04
Контактная информация:

Re: Управление lpt/com/usb портами

Сообщение KriK »

Большое спасибо! Опять начну эксперементировать!
Linux Registered user #392927
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Сделал sudo chmod +x lptout. Все равно могу только из под рута управлять :( Разрешил запись, результат тот же.
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Может Liksys все же откликнется? Вот разрешения выставленные на параллельный порт:
ls -l /dev/lp0
crwxrwxrwx 1 root lp 6, 0 2007-01-08 22:08 /dev/lp0

Вот результаты запуска программы:
./lptout 1
lptout: cannot get port 0x378: Operation not permitted

Из под su все прекрасно работает.
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Все настроил через sudo.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Управление lpt/com/usb портами

Сообщение Liksys »

Den001 писал(а):
08.01.2007 20:09
Может Liksys все же откликнется?

Я тут. Заглянул на пару сек. У меня завтра экзамен, поэтому и не смог быстро откликнуться. Завтра вечером выду в сеть и отвечу на любые твои вопросы, ок? :)
Надо не из-под судо, а из под чистого рута чмод делать...
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Liksys писал(а):
09.01.2007 23:18
Den001 писал(а):
08.01.2007 20:09

Может Liksys все же откликнется?

Я тут. Заглянул на пару сек. У меня завтра экзамен, поэтому и не смог быстро откликнуться. Завтра вечером выду в сеть и отвечу на любые твои вопросы, ок? :)
Надо не из-под судо, а из под чистого рута чмод делать...

Из мана:
The use of ioperm() requires root privileges.

Думаю, что дело в этом... Хотя, можно попробовать воспользоваться setuid, но в этом случае мне судо больше подходит.
PS: разрешения, как я писал выше, пробовал ставить на полный доступ всем - не помогает почему-то.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Управление lpt/com/usb портами

Сообщение Liksys »

Так это файл устройства, а это порт на прямую. Права к порту в проге ставятся именно иопермом.
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

А еще вот нашел модуль на перле. Для меня получается предпочтительнее, ибо получается более универсальное решение и компилить ничего не надо.
Сайт
Спасибо сказали:
Аватара пользователя
esvaf
Бывший модератор
Сообщения: 844
Статус: экс- LinuxForum.Ru team
ОС: CentOS 5.3
Контактная информация:

Re: Управление lpt/com/usb портами

Сообщение esvaf »

А схемы ни у кого нет?
Мне бы хотяб на один канал......
Спасибо сказали:
Den001
Сообщения: 666
ОС: Suse 11

Re: Управление lpt/com/usb портами

Сообщение Den001 »

Схемы чего? Если просто хочешь что-тот включить/выключить, то там все просто: Схема
Спасибо сказали:
Ответить