[Gambas-user] Parallel Port - Illegal Seek -
Doriano Blengino
doriano.blengino at ...1909...
Thu Apr 8 10:00:59 CEST 2010
mike ha scritto:
> On 04/07/2010 02:47 PM, nando wrote:
>
>> Seek will not change the address.
>>
>>
>> ---------- Original Message -----------
>> From: Doriano Blengino<doriano.blengino at ...1909...>
>> To: nando_f at ...951..., mailing list for gambas users
>> <gambas-user at lists.sourceforge.net>
>> Sent: Wed, 07 Apr 2010 11:06:42 +0200
>> Subject: Re: [Gambas-user] Parallel Port - Illegal Seek -
>>
>>
>>
>>> nando ha scritto:
>>>
>>>
>>>> Using SEEK is not correct.
>>>> If you think of the parallel port as a file, you cannot seek.
>>>> It doesn't make sense.
>>>> You can only read and write.
>>>> What are you trying to accomplish ?
>>>> -Fernando
>>>>
>>>>
>>>>
>>> He is trying to do low level access to the parallel port, which has 3
>>> hardware addresses.
>>> In that respect, seek() would make sense to select which IO address to
>>> read from/write to.
>>> Whether this works or not, depends on how the kernel driver interprets
>>> the seeks, but the following listing makes it clear that somewhere
>>> (other OSes?) this behavior works.
>>> The error could also arise from other problems: permissions, missing
>>> modules, wrong major/minor numbers and so on...
>>>
>>> Regards,
>>> Doriano
>>>
How already stated in a previous email, it is possible to access I/O
ports in different manners.
After a research, I discovered two viable ways - direct access (I don't
know if gambas has I/O instructions), and /dev/port, which is a device.
In this last case seek() is used to address a port.
From http://tldp.org/HOWTO/IO-Port-Programming-2.html :
>
> Another way to access I/O ports is to |open()| |/dev/port| (a
> character device, major number 1, minor 4) for reading and/or writing
> (the stdio |f*()| functions have internal buffering, so avoid them).
> Then |lseek()| to the appropriate byte in the file (file position 0 =
> port 0x00, file position 1 = port 0x01, and so on), and |read()| or
> |write()| a byte or word from or to it.
>
> Naturally, for this to work your program needs read/write access to
> |/dev/port|. This method is probably slower than the normal method
> above, but does not need compiler optimisation nor |ioperm()|. It
> doesn't need root access either, if you give a non-root user or group
> access to |/dev/port| --- but this is a very bad thing... [about
> security]...
Using /dev/port can be problematic: can gambas do unbuffered I/O?
Other methods would be to use some external program or library (shared
object). If gambas does not have I/O (peek & poke), then an external
library is the most performant way, though not the simpler. Gambas can
interface with external libraries using EXTERNAL declaration.
Googling about this issue, I found some interesting page:
http://tldp.org/HOWTO/IO-Port-Programming-2.html
http://www.epanorama.net/circuits/parallel_output.html
http://www.faqs.org/docs/Linux-mini/IO-Port-Programming.html
http://cyberelk.net/tim/parport/parport.html
http://people.redhat.com/twaugh/parport/html/ppdev.html
The best way would be to write a gambas component, having either
internal I/O instructions (a C component) or relying to an external
library (a gambas component calling an external library; may be there is
something already done somewhere).
Hey, gambas gurus out there... someone has the time? I do not.
Regards,
Doriano
More information about the User
mailing list