[Gambas-user] Parallel Port - Illegal Seek -

Doriano Blengino doriano.blengino at ...1909...
Wed Apr 7 11:06:42 CEST 2010


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

>
>
> ---------- Original Message -----------
> From: Bjorn Macintosh <bjorn.macintosh at ...626...>
> To: gambas-user at lists.sourceforge.net
> Sent: Fri, 2 Apr 2010 21:09:58 +1300
> Subject: [Gambas-user] Parallel Port - Illegal Seek -
>
>   
>> Hi All,
>>
>> I am writing a parallel port interface, however I am struggling with how to
>> write to the parallel port.  Below I have included the code that I have
>> used.  Following that I have included the BASIC code that I am bastardizing.
>>
>> My Gambas version is Gambas2.13
>> I am running Linux Mint 8
>> I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
>> '077a'
>> The error code I am getting is "System error. illegal seek"
>>
>> Thanks in advance for any help anyone can give.
>> ---------------------------------------------------------------------GAMBAS2
>> CODE FOLLOWS------------------------------------------------------
>> ' Gambas module file
>> PUBLIC SUB Main()
>>
>> DIM N AS Integer
>> DIM pin AS Integer
>> DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
>> DIM pump AS Integer
>> DIM Ptime AS Integer
>> DIM Clock AS Integer
>> DIM UClock AS Integer
>> DIM DClock AS Integer
>> DIM commit AS Integer
>> DIM poweron AS Integer
>> DIM switch AS Integer
>> DIM gate AS File
>> DIM base0, base1, base2 AS Integer
>>
>> base0 = 0
>> base1 = 1
>> base2 = 2
>> poweron = 64
>> commit = 144
>> switch = 17
>> UClock = 130
>> DClock = 128
>>   gate = OPEN "/dev/parport0" FOR READ WRITE
>>   SEEK #gate, base0
>>   WRITE #gate, poweron
>>   FOR Ptime = 1 TO 2000 STEP 1
>>   NEXT
>>
>>   SEEK #gate, base2
>>   WRITE #gate, switch
>>
>>   GOTO START
>> CommitChanges:
>>   FOR N = 0 TO 7 STEP 1
>>     pump = CInt(1000000 & pinout[Fix(N)])
>>     Clock = CInt(1000001 & pinout[Fix(N)])
>>     SEEK #gate, base0
>>     WRITE #gate, pump
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>     SEEK #gate, base0
>>     WRITE #gate, Clock
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>     SEEK #gate, base0
>>     WRITE #gate, pump
>>   NEXT
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>
>>   FOR N = 1 TO 16 STEP 1
>>     SEEK #gate, base0
>>     WRITE #gate, UClock
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>     SEEK #gate, base0
>>     WRITE #gate, DClock
>>   NEXT
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>   SEEK #gate, base0
>>   WRITE #gate, commit
>>     FOR Ptime = 1 TO 2000 STEP 1
>>     NEXT
>>   SEEK #gate, base0
>>   WRITE #gate, poweron
>>   GOTO PrintPinout
>>
>> PrintPinout:
>>   FOR N = 0 TO 7 STEP 1
>>     PRINT pinout[Fix(N)]
>>   NEXT
>>   GOTO START
>>
>> PinSelectFail:
>>   PRINT "You have selected a pin that does not exist, careful as this may
>> cause a divide by 0 and end the universe,  Select between pin 0 and pin 7"
>>   GOTO START
>>
>> START:
>>   PRINT "What input do you want to toggle? (pins 0 -> 7 are outputs, Pin 8
>> is the activation sequence)"
>>   INPUT pin
>>   IF pin < 0 OR pin > 8 THEN
>>     GOTO PinSelectFail
>>   ELSE IF pin = 8 THEN
>>     GOTO CommitChanges
>>   ELSE IF pinout[Fix(pin)] = 0 THEN
>>     pinout[Fix(pin)] = 1
>>   ELSE IF pinout[Fix(pin)] = 1 THEN
>>     pinout[Fix(pin)] = 0
>>   ENDIF
>> GOTO PrintPinout
>> END
>> ---------------------------------------------------------------------Gambas2
>> END------------------------------------------------------------------------
>>
>> ---------------------------------------------------------------------BASIC
>> CODE FOLLOWS------------------------------------------------------
>>
>> BASE0=&H378
>>
>> 'SWITCH POWER AND OUTPUTS ON
>> OUT BASE0, &H80
>> OUT BASE0 + 2, 11
>>
>> 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
>> FOR N = 0 TO 7
>>     DOUT(N) = 0
>> NEXT N
>> DOUT=0
>>
>> START:
>>     INPUT "WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7)...."; N
>>     IF N < 0 OR N > 7 THEN GOTO START
>>     N = FIX(N)
>>     DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT
>>
>> 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
>>     FOR N = 0 TO 7
>>         IF DOUT(N) = 0 THEN
>>             DOUT = DOUT AND NOT (2^N)
>>         ELSE
>>             DOUT = DOUT OR 2^N
>>         ENDIF
>>     NEXT N
>>
>> 'SEND 8 CLOCK PULSES AND DIGITAL OUT DATA (ALL ZERO'S)
>>     FOR BIT = 1 TO 8
>>         B = 8 - BIT
>>         BYTE = ((DOUT AND 2^B) / 2^B) OR &H80
>>         OUT BASE0, BYTE
>>         OUT BASE0, BYTE OR 2
>>        OUT BASE0 BYTE
>>     NEXT BIT
>>
>> 'SEND ANOTHER 16 CLOCK PULSES TO SHIFT THE DATA INTO IC3
>> FOR BIT = 9 TO 24
>>     OUT BASE0, &H82
>>     OUT BASE0, &H80
>> NEXT BIT
>>
>> 'LOAD IC3
>> OUT BASE0, &H90
>> OUT BASE0, &h80]
>>
>> ---------------------------------------------------------------------BASIC
>> END------------------------------------------------------------------------
>>
>> Bjorn Macintosh
>> ------------------------------------------------------------------------------
>>     





More information about the User mailing list