summaryrefslogtreecommitdiff
path: root/src/libs/gpio.c
blob: 9d61d85f98389956408903459572f1f6930796d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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++){}
  }
}