summaryrefslogtreecommitdiff
path: root/src/libs/gpio.c
diff options
context:
space:
mode:
authorLoïc Guégan <manzerbredes@mailbox.org>2025-03-24 09:33:49 +0100
committerLoïc Guégan <manzerbredes@mailbox.org>2025-03-24 09:33:49 +0100
commit7741f014456df395b655b72d9ebb848af72cc37e (patch)
tree5ddae273929780ac7c0af2a26b64ba1a382e4b05 /src/libs/gpio.c
parentd3ecfe3498d73d3ba924063bc1001cca3f333170 (diff)
Init repository
Diffstat (limited to 'src/libs/gpio.c')
-rw-r--r--src/libs/gpio.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/libs/gpio.c b/src/libs/gpio.c
new file mode 100644
index 0000000..9d61d85
--- /dev/null
+++ b/src/libs/gpio.c
@@ -0,0 +1,39 @@
+#include "addrmap.h"
+#include "utils.h"
+#include "gpio.h"
+
+void gpio_init() { REG_WRITE_BITMAP_CLEAR(RESETS_BASE, 32);} // Reset bank0 (all gpios)
+
+void gpio_set_function(u8 gpio, u8 fn){
+ REG_WRITE(IO_BANK0_GPIO25_CTRL, fn); // Set function as SIO
+}
+
+void gpio_output_enable(u8 gpio){
+ u32 r=REG_READ(SIO_GPIO_OE)|1<<gpio;
+ REG_WRITE(SIO_GPIO_OE, r);
+}
+
+void gpio_toggle_state(u8 gpio){
+ REG_WRITE(SIO_GPIO_OUT_XOR,1<<gpio);
+}
+
+void gpio_toggle_led(){
+ // Ensure led pin is configured
+ u32 fn=REG_READ(IO_BANK0_GPIO25_CTRL);
+ u32 oe=REG_READ(SIO_GPIO_OE)&1<<25;
+ if(fn!=GPIO_FN_SIO || !oe){
+ gpio_set_function(25, GPIO_FN_SIO);
+ gpio_output_enable(25);
+ }
+ gpio_toggle_state(25); // Switch between ON/OFF
+}
+
+
+void gpio_blink_led(int n){
+ for(int i=0;i<n;i++){
+ gpio_toggle_led();
+ for(int j=0;j<5000000;j++){} // These are disgusting but I am lazy..
+ gpio_toggle_led();
+ for(int j=0;j<5000000;j++){}
+ }
+}