require ./linux.fs $10010000 Constant IO-HWBASE \ physikalische Basis-Adresse 0 Value io-base \ enstprechende logische Adresse (von IO-INIT gesetzt) 0 Value mem \ Filedeskriptor der '/dev/mem' Gerätedatei : io-init ( -- ) \ Einblenden der HW-Register in den logischen Adressbereich s" /dev/mem" R/W OPEN-FILE THROW fileno TO mem IO-HWBASE mem 0 4096 \ 4096 bytes ab IO-HWBASE einblenden PROT_READ PROT_WRITE OR MAP_SHARED mmap TO io-base ; : io-port: ( n "name" -- ) \ Definition v. Adresskonstanten relativ zu IO-BASE CREATE , DOES> ( a-addr1 -- a-addr2) @ io-base + ; $000 io-port: port-a $100 io-port: port-b $200 io-port: port-c $300 io-port: port-d struct \ Datenstruktur der Register zu einem der IO-Ports A/B/C/D cell% field PXPIN ( PIN Level Register ) cell% field Reserved0 cell% field Reserved1 cell% field Reserved2 cell% field PXDAT ( Port Data Register ) cell% field PXDATS ( Port Data Set Register ) cell% field PXDATC ( Port Data Clear Register ) cell% field Reserved3 cell% field PXIM ( Interrupt Mask Register ) cell% field PXIMS ( Interrupt Mask Set Reg ) cell% field PXIMC ( Interrupt Mask Clear Reg ) cell% field Reserved4 cell% field PXPE ( Pull Enable Register ) cell% field PXPES ( Pull Enable Set Reg. ) cell% field PXPEC ( Pull Enable Clear Reg. ) cell% field Reserved5 cell% field PXFUN ( Function Register ) cell% field PXFUNS ( Function Set Register ) cell% field PXFUNC ( Function Clear Register ) cell% field Reserved6 cell% field PXSEL ( Select Register ) cell% field PXSELS ( Select Set Register ) cell% field PXSELC ( Select Clear Register ) cell% field Reserved7 cell% field PXDIR ( Direction Register ) cell% field PXDIRS ( Direction Set Register ) cell% field PXDIRC ( Direction Clear Register ) cell% field Reserved8 cell% field PXTRG ( Trigger Register ) cell% field PXTRGS ( Trigger Set Register ) cell% field PXTRGC ( Trigger Set Register ) cell% field Reserved9 cell% field PXFLG ( Port Flag Register ) cell% field PXFLGC ( Port Flag clear Register ) end-struct jz_pio% \ Konstanten zur Programmierung der Richtung eines I/O Ports mit IO-DIRECTION 0 CONSTANT #input 1 CONSTANT #output : io-direction { n direction pio-addr -- } \ Richtung eines Ports setzen 1 n lshift \ Bit-Maske für Pin n DUP pio-addr PXFUNC ! DUP pio-addr PXSELC ! \ FUN/SEL auf 0 pio-addr direction if PXDIRS else PXDIRC then ! ; \ Richtung setzen : io-1pin! ( n pio-addr -- ) \ pin 'n' auf 1 setzen 1 rot lshift swap PXDATS ! ; : io-0pin! ( n pio-addr -- ) \ pin 'n' auf 0 setzen 1 rot lshift swap PXDATC ! ; : io-pin@ ( n pio-addr -- flag ) \ pin 'n' auslesen PXPIN @ 1 rot lshift AND 0<> ; \ Vor Verwendung der io-* Routinen, erst IO-INIT aufrufen !