]> rtime.felk.cvut.cz Git - lincan.git/blob - embedded/arch/arm/mach-lpc17xx/libs/hal/hal_gpio.c
Contributed support for LCP17xx devices and PiKRON's LMC1 board.
[lincan.git] / embedded / arch / arm / mach-lpc17xx / libs / hal / hal_gpio.c
1 #include <cpu_def.h>
2 #include <LPC17xx.h>
3
4 #include <hal_gpio.h>
5
6 int hal_pin_conf_fnc(unsigned gpio, int fnc)
7 {
8   __IO uint32_t *p = &(PINCON->PINSEL0); 
9   uint32_t mask;
10
11   if(fnc & PORT_CONF_FNC_MASK)
12     fnc = __mfld2val(PORT_CONF_FNC_MASK, fnc);
13
14   p += hal_gpio_get_port_num(gpio)*2;
15   if(gpio & 0x10)
16     p++;
17   gpio &= 0x0f;
18   gpio *= 2;
19   mask = 3 << gpio;
20
21   *p = (*p & ~mask) | ((fnc << gpio) & mask);
22
23   return 0;
24 }
25
26 int hal_pin_conf_mode(unsigned gpio, int mode)
27 {
28   __IO uint32_t *p = &(PINCON->PINMODE0); 
29   uint32_t mask;
30
31   if(mode & PORT_CONF_MODE_MASK)
32     mode = __mfld2val(PORT_CONF_MODE_MASK, mode);
33
34   p += hal_gpio_get_port_num(gpio)*2;
35   if(gpio & 0x10)
36     p++;
37   gpio &= 0x0f;
38   gpio *= 2;
39   mask = 3 << gpio;
40
41   *p = (*p & ~mask) | ((mode << gpio) & mask);
42
43   return 0;
44 }
45
46 int hal_pin_conf_od(unsigned gpio, int od)
47 {
48   uint32_t mask = 1 << (gpio & 0x1f);
49
50   if(od)
51     (&(PINCON->PINMODE_OD0))[hal_gpio_get_port_num(gpio)] |= mask;
52   else
53     (&(PINCON->PINMODE_OD0))[hal_gpio_get_port_num(gpio)] &= ~mask;
54
55   return 0;
56 }
57
58 int hal_pin_conf_set(unsigned gpio, int conf)
59 {
60   gpio &= ~PORT_CONF_MASK;
61   hal_pin_conf_mode(gpio, conf & PORT_CONF_MODE_MASK);
62   hal_pin_conf_od(gpio, conf & PORT_CONF_OD_MASK);
63   if(conf & PORT_CONF_SET_DIR) {
64     if((conf & PORT_CONF_DIR_MASK) == (PORT_CONF_DIR_IN & PORT_CONF_DIR_MASK))
65       hal_gpio_direction_input(gpio);
66     else
67       hal_gpio_direction_output(gpio, conf & PORT_CONF_INIT_HIGH);
68   }
69   hal_pin_conf_fnc(gpio, conf & PORT_CONF_FNC_MASK);
70
71   return 0;
72 }