( GetBoard)

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

( 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 
                         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 qPi_type
    qPi2 @ 2 = IF   [ HEX 3F200000 ] LITERAL    ( for Pi2)
               ELSE [ HEX 20200000 ] LITERAL    ( for B,B+)
               ENDIF ;

HEX
setbasereg
200 SWAP DECIMAL 13 SPI_reg
( CR ." GPIForth: GPIO base address: " HEX DUP U. CR)
CONSTANT GPIOsel_fn





