Mjukvaran består av en drivrutin för AmigaOS, vilket gör det möjligt att använda serieporten från vilket annat program som helst. See section ber_serial.a för källkoden
Det känns ganska så onödigt att försöka förklara hur drivrutiner för serieportar fungerar under AmigaOS i den här rapporten, men några få intressanta rutiner kommer att presenteras.
iu_findcard()
Den här rutiner används för att ta reda på var vårt kort hamnade i
minnet. Först anropas systemfunktionen FindConfigDev()
, med
vårt tillverkar- och produktnummer som argument. Om något instickskort med
dessa parametrar påträffades, får vi tillbaka en pekare till en struktur
som innehåller information om kortet. Om kortet inte var installerat, eller
om det inte kunde mappas in vid start (see section AUTOCONFIG och systemstart),
returneras NULL
. Fältet cd_BoardAddr
i den returnerade strukturen
pekar på kortets basadress.
De bortkommenterade raderna innehåller dels kod för att hantera fler kort med samma drivrutin, samt ett liten självtest.
När ett program vill få en viss uppgift utförd, anropar det en av
systemfunktionerna DoIO()
eller SendIO()
, beroende på om uppgiften
ska utföras synkront eller asynkront. DoIO()
och SendIO()
anropar
i sin tur drivrutinens funtion BeginIO()
, som anropar någon av funtionerna
Invalid()
, Reset()
, Read()
, Write()
, Update()
,
Clear()
, Stop()
, Start()
, Flush()
, Query()
,
Break()
eller SetParams()
.
Reset()
Reset()
återställer hårdvaran i det skick den var i när
strömmen slogs på.
Read()
Read()
startar läsning från serieporten. När ett önskat antal tecken
är överförda, signalleras operativsystemet.
Write()
Write()
startar skrivning till serieporten. När ett önskat antal tecken
är överförda, signalleras operativsystemet.
Clear()
Clear()
rensar bufferten som håller inkommna men inte lästa tecken.
Stop()
& Start()
Stop()
och Start()
används för flödeskontroll.
Flush()
Flush()
används för att avbryta alla överföringar som pågår för tillfället.
Query()
Med Query()
kan man läsa serieportens status, och hur många tecken som
finns i läsbufferten.
Break()
Break()
skickar en avbrottssignal till utrustningen i andra änden av
seriesnöret.
SetParams()
SetParams()
(och SetTheParams()
) används för att kontrollera
hårdvarans inställningar, exempelvis antal start-, stopp- och databitar,
hastighet, paritet, buffertstorlek, flödesprotokoll, med mera.
InterruptCode()
Funktionen InterruptCode()
är den rutin som körs när serieporten genererar
ett avbrott. Orsaker till ett avbrott kan vara att ett tecken har mottagits,
att ett tecken har skickats iväg eller att någon av kontrollsignalerna har bytt
tillstånd. Beroende på vad som hände anropas en av följande rutiner.
ic_read()
Om ett nytt tecken just har kommit in, sparar den här rutinen tecknet i lämplig
buffert. Om det redan finns ett program som väntar på indata, sparas tecknet
direkt i programmets mottagarbuffert. Skulle bufferten råka bli full signalleras
operativsystemet, och nästa program i tur får ta emot data. Om inget program
väntade på ett tecken, sparas tecknet i en egen privat cirkulär buffert.
Om denna buffert skulle råka bli full sätts felflaggan berdu_ErrorCode
.
ic_write()
När ett tecken just har skickats iväg genererar UART:en ett avbrott för att tala om att det går bra att skicka nästa tecken nu. Om det finns ett program som vill skriva, skickas nästa tecken iväg, och om det var det sista tecknet kontrolleras om det finns fler program som vill skriva. Gör det inte det gör rutinen ingenting, och UART:en kommer inte heller att generera fler interrupt.
GetStatus()
GetStatus()
läser UART:ens statusregister, konverterar datat till rätt
format och returnerar det.
InitHW()
InitHW()
anropas av SeTheParams()
och är den rutin som fipplar med
hårdvaruregistrena för att ställa in kretsen i önskat tillstånd.
Go to the first, previous, next, last section, table of contents.