$ sudo apt install build-essential git gcc g++ flex groff texinfo wget $ sudo apt install patch flex rsync libgmp3-dev python3-dev gawk bison
$ git clone https://github.com/gaiusm/m2-cross $ mkdir build-m2-cross $ cd build-m2-cross $ ../m2-cross/configure $ make
MODULE ledtest ; (* Flash the onboard green LED of the RPI4 using Modula-2. The tiny onboard green LED is located next to the red power LED (also known as the ACT LED which flashes during bootup). Author: Gaius Mulley 31/8/2021. *) FROM SYSTEM IMPORT ADDRESS ; CONST GPIO_BASE = 0FE200000H ; GPIO_MAX = LED_GPCLR1 ; (* GPIO bitset offsets. *) GPIO_GPFSEL = 4 ; LED_GPSET1 = 8 ; LED_GPCLR1 = 11 ; (* BIT positions. *) LED_GPFBIT = 6 ; LED_GPIO_BIT = 10 ;
VAR
gpio[GPIO_BASE] : ARRAY [0..GPIO_MAX] OF BITSET ;
PROCEDURE waste_time ;
CONST
delay = 800000 ;
VAR
i: CARDINAL ;
BEGIN
FOR i := 0 TO delay DO
ASM VOLATILE ("nop")
END
END waste_time ;
BEGIN
(* Set this bit to TRUE to enable the LED as an output. *)
INCL (gpio[GPIO_GPFSEL], LED_GPFBIT) ;
LOOP
(* set the bit (led on). *)
gpio[LED_GPSET1] := BITSET {LED_GPIO_BIT} ;
waste_time ;
(* clear the bit (led off). *)
gpio[LED_GPCLR1] := BITSET {LED_GPIO_BIT} ;
waste_time
END
END ledtest.
$ cd ../m2-cross/bare-metal-m2 $ ./buildm2 ledtest
GPIO4 330 ohm led GND
<PIN7> ------/\/\/\/----|>|---<PIN14>
long short
MODULE ledtest2 ; (* Flash an offboard LED of the RPI4 using Modula-2 You will need to install an LED and resister between PIN 7 (GPIO4) and ground. Author: Gaius Mulley 31/8/2021. *) FROM SYSTEM IMPORT ADDRESS ; CONST GPIO_BASE = 0FE200000H ; GPIO_MAX = 32 ; GPIO_GPFSEL = 4 ; LED_GPFBIT = 6 ; LED_GPIO_BIT = 10 ; LED_GPCLR0 = 10 ; LED_GPSET0 = 7 ; LED_GPCLR1 = 11 ; LED_GPSET1 = 8 ;
VAR gpio[GPIO_BASE] : ARRAY [0..GPIO_MAX] OF BITSET ; PROCEDURE inp_gpio (pin: CARDINAL) ; VAR value : BITSET ; position: CARDINAL ; BEGIN position := (pin MOD 10) * 3 ; short_delay ; value := gpio[pin DIV 10] ; EXCL (value, position) ; EXCL (value, position + 1) ; EXCL (value, position + 2) ; short_delay ; gpio[pin DIV 10] := value END inp_gpio ;
PROCEDURE out_gpio (pin: CARDINAL) ; VAR value : BITSET ; position: CARDINAL ; BEGIN position := (pin MOD 10) * 3 ; short_delay ; value := gpio[pin DIV 10] ; INCL (value, position) ; EXCL (value, position + 1) ; EXCL (value, position + 2) ; short_delay ; gpio[pin DIV 10] := value END out_gpio ;
PROCEDURE short_delay ;
CONST
delay = 10000 ;
VAR
i: CARDINAL ;
BEGIN
FOR i := 0 TO delay DO
ASM VOLATILE ("nop")
END
END short_delay ;
PROCEDURE waste_time ;
CONST
delay = 500000 ;
VAR
i: CARDINAL ;
BEGIN
FOR i := 0 TO delay DO
ASM VOLATILE ("nop")
END
END waste_time ;
CONST
LED_EXTERNAL_BIT = 4 ; (* pin 7 *)
BEGIN
(* Set this bit to TRUE to enable the LED as an output. *)
inp_gpio (LED_EXTERNAL_BIT) ;
out_gpio (LED_EXTERNAL_BIT) ;
LOOP
(* set the bit (led on). *)
gpio[LED_GPSET0] := BITSET {LED_EXTERNAL_BIT} ;
waste_time ;
(* clear the bit (led off). *)
gpio[LED_GPCLR0] := BITSET {LED_EXTERNAL_BIT} ;
waste_time
END
END ledtest2.
$ ./buildm2 ledtest2
This document was produced using groff-1.22.