Go to the first, previous, next, last section, table of contents.


Mjukvara

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.

Kommandon

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.