Code: Select all
@-----------------------------------------
@ Configure GPIO16 as output
@-----------------------------------------
.globl RPI_LED_INIT
RPI_LED_INIT:
ldr r0,=0x20200004
mov r1,#1
lsl r1,#18
str r1,[r0]
bx lr
@-----------------------------------------
@ Turn LED off
@-----------------------------------------
.globl RPI_LED_OFF
RPI_LED_OFF:
ldr r0,=0x2020001c
mov r1,#1
lsl r1,#16
str r1,[r0]
bx lr
@-----------------------------------------
@ Turn LED on
@-----------------------------------------
.globl RPI_LED_ON
RPI_LED_ON:
ldr r0,=0x20200028
mov r1,#1
lsl r1,#16
str r1,[r0]
bx lr
@-----------------------------------------
@ Read level of GPIO16
@-----------------------------------------
.globl RPI_PIN_LEVEL
RPI_PIN_LEVEL:
ldr r0,=0x20200034
lsr r0,#16
and r0,r0,#1
bx lr
Code: Select all
extern void RPI_LED_INIT(void);
extern void RPI_LED_OFF(void);
extern void RPI_LED_ON(void);
extern unsigned int RPI_PIN_LEVEL(void);
extern void RPI_LED_BLINK(void);
void notmain(void) {
RPI_LED_INIT();
RPI_LED_OFF();
if (RPI_PIN_LEVEL() == 1)
RPI_LED_BLINK();
}
The two functions RPI_LED_OFF() and RPI_LED_ON() works as expected by turning the LED off and on. The problem is that according to the manual, GPIO pin 16 should be high when setting bit 16 to 1 at address 0x2020001c, like I do in the RPI_LED_OFF() function. However, when reading the pin level after calling RPI_LED_OFF() it's always low.
Why is the pin level not high?