Управление lpt/com/usb портами (Есть ли возможность без написания своей программы?)
Модератор: Модераторы разделов
Управление lpt/com/usb портами
Не знаю куда больше подходит тема. То ли в программирование, то ли сюда. Покопал гугл на предмет управления lpt портом (типа зажигать/гасить светодиоды). Варианты есть, но все они почему-то связаны с написанием своей программы, хотя и не сложной, но все же. А нет ли в линуксе уже готовой возможности для этого (для уставновления значений на контактах данных lpt порта)? что-нить типа echo 1/0 > /dev(proc)/<lpt>
Re: Управление lpt/com/usb портами
похоже, Вы первый, кому это понадобилось....
в основном народ не гнушается написания элементарных программ....
в основном народ не гнушается написания элементарных программ....
слава роботам!
Re: Управление lpt/com/usb портами
Думаю, что я не первый кому понадобилось. Прсто, наверное, нет стандартных средств для этого... так что придется тоже не гнушаться написания элементарных программ
Re: Управление lpt/com/usb портами
Вы не первый. Я тоже пытался раньше играться с lpt, com. Всетаки придется писать прогу, я так думаю. Может кто-нибудь поможет с доками или сорцом с примером?
Linux Registered user #392927
Re: Управление lpt/com/usb портами
Держите, братцы:
И Makefile для нее:
Положить в один каталог и сделать make. Потом chmod +x lptout от рута. Работайте на здоровье B) Я ее написал для одного девайса, на www.masterkit.ru посмотрите, кому интересно, а потом делал цветомузыку восьмиканальную через LPT
Код: Выделить всё
/************************************************************************
* *
* 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
Re: Управление lpt/com/usb портами
Большое спасибо! Опять начну эксперементировать!
Linux Registered user #392927
Re: Управление lpt/com/usb портами
Сделал sudo chmod +x lptout. Все равно могу только из под рута управлять Разрешил запись, результат тот же.
Re: Управление lpt/com/usb портами
Может 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 все прекрасно работает.
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 все прекрасно работает.
Re: Управление lpt/com/usb портами
Все настроил через sudo.
Re: Управление lpt/com/usb портами
Из мана:
The use of ioperm() requires root privileges.
Думаю, что дело в этом... Хотя, можно попробовать воспользоваться setuid, но в этом случае мне судо больше подходит.
PS: разрешения, как я писал выше, пробовал ставить на полный доступ всем - не помогает почему-то.
Re: Управление lpt/com/usb портами
Так это файл устройства, а это порт на прямую. Права к порту в проге ставятся именно иопермом.
Re: Управление lpt/com/usb портами
А еще вот нашел модуль на перле. Для меня получается предпочтительнее, ибо получается более универсальное решение и компилить ничего не надо.
Сайт
Сайт
- esvaf
- Бывший модератор
- Сообщения: 844
- Статус: экс- LinuxForum.Ru team
- ОС: CentOS 5.3
- Контактная информация:
Re: Управление lpt/com/usb портами
А схемы ни у кого нет?
Мне бы хотяб на один канал......
Мне бы хотяб на один канал......
Re: Управление lpt/com/usb портами
Схемы чего? Если просто хочешь что-тот включить/выключить, то там все просто: Схема