( GetBoard)
( 21st September 2016 June 2026)
CR ." GetBoard"
( Info on register addresses: ***********)
( Note: Rev 1 Pi uses BSC0 on pins 3 & 5; Rev 2 uses BSC1)
( Rev 1: &2020_0000; Rev 2: 2080_0000 for base address of registers
Pi2: &3F200000 for GPIO base address)
( board nos: 12 for Rev2; 17 for B+)
HEX
7A CONSTANT OS_Hardware
68 CONSTANT OS_Memory
0 VARIABLE qrevision ( 3 for B+, 6 for Pi 2)
0 VARIABLE qboard ( 0 for Pi)
0 VARIABLE qprocessor ( 2 for Pi)
0 VARIABLE qPi2
0 VARIABLE qPi4 ( Mod June 2026 - default is no Pi4 unless other Pi's not found))
( get bus addr for SPI control/status register)
CODE SPI_reg ( space,addr,reason code{13} .... bus addr)
R0 POP, ( 13 to r0)
R1 POP, ( eg &20204000 to r1)
R2 POP, ( space to r2 - say &200)
OS_Memory SWI,
R3 PUSH,
PC R14 MOV,
END-CODE
CODE OSHardware ( r0,r1,r8...r1,r2)
R8 POP,
R1 POP,
R0 POP,
OS_Hardware SWI,
R2 PUSH, ( pointer to device descriptor address)
R1 PUSH, ( -1 if no more devices of this type)
PC R14 MOV,
END-CODE
DECIMAL
: get_info
[ HEX 403 ] LITERAL 0 4 OSHardware ;
DECIMAL
: revision 68 + @ ; ( R2...n)
: board 64 + @ ; ( R2...n)
: processor 2 + C@ ; ( R2...n)
: qPi_data ( ...)
get_info ( 2DUP ." R2=" . SPACE HEX ." R1=" . CR)
DROP
DECIMAL
DUP processor qprocessor ! ( CR ." processor: " qprocessor ?)
qprocessor @ 2 = IF
DUP revision qrevision ! ( CR ." revision: " qrevision ?)
board qboard ! ( CR ." board: " qboard ?)
ELSE ( DROP CR ." This isn't a Pi !" ABORT )
TRUE qPi4 ! ( ****Assume Pi4 **** July 2026)
ENDIF ;
: qPi_type
qPi_data
qboard @ 0= IF
qrevision @ DUP 3 = IF 1 qPi2 ! DROP ( B+, so not a Pi2)
ELSE
6 = IF 2 qPi2 ! ENDIF ( Pi2)
ENDIF
ENDIF ;
: setbasereg
qPi4 IF HEX [ HEX FE2000000 ] LITERAL ( for Pi4)
DUP CR BINARY . DUP CR U. KEY DROP
ELSE
qPi_type
qPi2 @ 2 = IF [ HEX 3F200000 ] LITERAL ( for Pi2)
ELSE [ HEX 20200000 ] LITERAL ( for B,B+)
ENDIF
ENDIF ;
HEX
setbasereg HEX ( DUP CR U.)
200 SWAP DECIMAL 13 SPI_reg
CR ." GPIForth: GPIO base address: " HEX DUP U. CR KEY DROP
CONSTANT GPIOsel_fn