Проблема с LPT

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

Ответить
TechnoMan
Сообщения: 10
ОС: Mandriva Linux

Проблема с LPT

Сообщение TechnoMan »

Доброго времени суток. Надо железкой управлять через LPT, стал пробовать в него что-то писать, а тут такая проблема...
В /dev есть parport0 и lp0
Когда я пытаюсь что-то писать в parport0 никаких ошибок не возникает, однако в порт ничего не выводится (диодик не горит).
Когда пишу в lp0 под root, например так:

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

#include "fcntl.h"
#include "unistd.h"
main()
    {
    int descriptor = open ("/dev/lp0", O_RDWR);
    unsigned short int data;

    if(descriptor<0)
        return;

    data=255;
    write (descriptor,&data, 1);
    sleep(3);
     data=0;
    write (descriptor,&data, 1);
    close(descriptor);
    }

Светодиодик загорается, но при этом программа почему-то виснет на первой функции write().
Пр этом dmesg выдаёт

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

parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,ECP,DMA]
lp0: using parport0 (interrupt-driven).
parport0: BUSY timeout (-4) in compat_write_block_pio
parport0: FIFO is stuck
parport0: BUSY timeout (1) in compat_write_block_pio
parport0: BUSY timeout (-4) in compat_write_block_pio

Через outb() всё работает.
Дистрибутив - Mandriva 2008.1, ядро 2.6.24.7
Может кто подскажет как с этим справиться?
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Проблема с LPT

Сообщение AestheteAnimus »

TechnoMan писал(а):
23.07.2009 01:19
Доброго времени суток. Надо железкой управлять через LPT, стал пробовать в него что-то писать, а тут такая проблема...
В /dev есть parport0 и lp0

В Линуксе нужен именно parport*. Но для управления надо использовать ioctl, а не операции чтения записи. Гляньте, например, как здесь реализовано: http://svn.berlios.de/svnroot/repos/openoc.../jtag/parport.c
Спасибо сказали:
TechnoMan
Сообщения: 10
ОС: Mandriva Linux

Re: Проблема с LPT

Сообщение TechnoMan »

Тот же результат. Работает, но физически ничего не выводится.

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

#include "unistd.h"
#include <sys/ioctl.h>
#include <linux/ppdev.h>

main()
    {
    int descriptor = open ("/dev/parport0", O_RDWR);
    unsigned short int data;

    if(descriptor<0)
        return;
    data=255;
    ioctl(descriptor, PPWDATA, &data);
    sleep(3);
     data=0;
    ioctl(descriptor, PPWDATA, &data);
    close(descriptor);
    }

А ioctl(descriptor, PPWDATA, &data) и write(descriptor,&data) не одно и тоже по смыслу (механизм один)?
Спасибо сказали:
Galaxy Master
Сообщения: 142
ОС: Debian GNU/Linux

Re: Проблема с LPT

Сообщение Galaxy Master »

я делаю так... и LPT-девайс отлично работает у меня...

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

int cio_driver_lpt::open_device( void )
{

        parport = open( dev_name, O_RDWR );

        if( parport == -1 )
        {
                return 1;
        }

        if( ioctl( parport,PPCLAIM ) )
        {
                close( parport );
                return 2;
        }

        pp_mode = IEEE1284_MODE_COMPAT;
        if( ioctl( parport, PPNEGOT, &pp_mode) )
        {
                close( parport );
                return 3;
        }

        // Down all pins
        write_data( 0x0 );

 return 0;
}


void cio_driver_lpt::close_device( void )
{
        // Down all pins
        write_data( 0x0 );

        ioctl( parport, PPRELEASE );
        close( parport );

        parport = -1;
}


void cio_driver_lpt::write_data( unsigned int dByte )
{
 unsigned int mapped;

        mapped = bit_map_encoder[ (u_char)dByte ];

        ioctl( parport, PPWDATA, &mapped );
}
Спасибо сказали:
Ответить