From 2a1e3a41dab989abb80662a79acaf215ccc89c9b Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Wed, 1 Jan 2025 12:19:50 +0100 Subject: [PATCH] Fix `gpio_set_mode` masking --- build/final.elf | Bin 55028 -> 55028 bytes build/gpio.S | 10 +++++----- build/gpio.i | 4 ++-- build/gpio.o | Bin 42252 -> 42252 bytes src/gpio.c | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build/final.elf b/build/final.elf index 933203eea664e6c1e395aa953781e7fb8d58e74a..e72a153aacc5ac8c29265488c6b6c9d9f949c7d1 100755 GIT binary patch delta 44 zcmeyemifzC<_#wV8JRbq6g=cFrl7|vsmCg0!^*F~%5KXlp~tFj!>X`(VPbG807bqG ANdN!< delta 44 zcmeyemifzC<_#wV83i|=6g=cFrliLzt;Z^4!^*F~%5KXlp~tFW!>YJ>VPbG807wrE AT>t<8 diff --git a/build/gpio.S b/build/gpio.S index 9af46bc..0b828f1 100644 --- a/build/gpio.S +++ b/build/gpio.S @@ -61,11 +61,11 @@ gpio_set_mode: .loc 1 9 7 ldr r3, [r7, #12] ldr r3, [r3] - .loc 1 9 34 + .loc 1 9 32 ldr r2, [r7, #8] lsls r2, r2, #1 - .loc 1 9 27 - movs r1, #17 + .loc 1 9 25 + movs r1, #3 lsl r2, r1, r2 .loc 1 9 18 mvns r2, r2 @@ -79,10 +79,10 @@ gpio_set_mode: .loc 1 10 24 ldrb r2, [r7, #5] @ zero_extendqisi2 and r1, r2, #3 - .loc 1 10 40 + .loc 1 10 39 ldr r2, [r7, #8] lsls r2, r2, #1 - .loc 1 10 33 + .loc 1 10 32 lsl r2, r1, r2 .loc 1 10 15 orrs r2, r2, r3 diff --git a/build/gpio.i b/build/gpio.i index 8601f4c..348afd2 100644 --- a/build/gpio.i +++ b/build/gpio.i @@ -2028,8 +2028,8 @@ void gpio_write(uint16_t pin, void gpio_set_mode(uint16_t pin, GPIO_MODE mode) { struct gpio *gpio = ((struct gpio*)(uintptr_t)((0x40020000U) + ((0x400U) * (pin >> 8)))); int pn = (pin & 0b1111); - gpio->MODER &= ~(0x0011 << (pn * 2)); - gpio->MODER |= (mode & 0b011) << (pn * 2); + gpio->MODER &= ~(0b11 << (pn * 2)); + gpio->MODER |= (mode & 0b11) << (pn * 2); } void gpio_write(uint16_t pin, diff --git a/build/gpio.o b/build/gpio.o index c02e7ce305bc89b98f8db677db92d2e225480f79..3483ab30e4fcccecb037b8edf334d7dd19e928c3 100644 GIT binary patch delta 44 zcmeA<#nf|(X#)=R delta 44 zcmeA<#nf|(X#)=MODER &= ~(0x0011 << (pn * 2)); // Clear existing setting. Each pin uses 2 bits - gpio->MODER |= (mode & 0b011) << (pn * 2); // Set new mode. Each pin uses 2 bits + gpio->MODER &= ~(0b11 << (pn * 2)); // Clear existing setting. Each pin uses 2 bits + gpio->MODER |= (mode & 0b11) << (pn * 2); // Set new mode. Each pin uses 2 bits } void gpio_write(uint16_t pin, bool val) {