]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blob - rpp/src/hal/gpio.c
4633ff13e8e679c84c3f959d55f2fc13b69e9703
[pes-rpp/rpp-lib.git] / rpp / src / hal / gpio.c
1 /* Copyright (C) 2012-2013 Czech Technical University in Prague
2  *
3  * Authors:
4  *     - Michal Horn <hornmich@fel.cvut.cz>
5  *
6  * This document contains proprietary information belonging to Czech
7  * Technical University in Prague. Passing on and copying of this
8  * document, and communication of its contents is not permitted
9  * without prior written authorization.
10  *
11  * File : gpio.c
12  *
13  * Abstract:
14  *          This file contains gpio pin configuration functions.
15  *      Some additional function for setting and getting pin values, getting
16  *      descriptors etc. are defined in header file as inline functions.
17  *
18  *      Each pin is defined by its descriptor defined in hal_gpio_platform_def. The descriptor can be obtained
19  *      by hal_gpio_get_pin_dsc by giving a pin name as an argument.
20  */
21
22 #include "hal/hal.h"
23
24 extern gioPORT_t *port_id_map[MAX_PORT_CNT];
25 extern pin_map_element_t pin_map[MAX_PIN_CNT];
26
27 uint8_t hal_gpio_get_pin_cnt() {
28         return MAX_PIN_CNT;
29 }
30
31 pin_map_element_t* hal_gpio_get_pin_map() {
32         return pin_map;
33 }
34
35 gioPORT_t *hal_gpio_get_port_base(uint32_t port_num)
36 {
37         return port_id_map[port_num];
38 }
39
40 uint32_t hal_gpio_pin_get_port_num(uint32_t pin_dsc)
41 {
42
43         return (pin_dsc & ~PORT_CONF_MASK) >> PORT_SHIFT;
44 }
45
46 gioPORT_t *hal_gpio_pin_get_port_base(uint32_t pin_dsc)
47 {
48         return hal_gpio_get_port_base(hal_gpio_pin_get_port_num(pin_dsc));
49 }
50
51
52 uint32_t *hal_gpio_pin_get_dsc(const char *pin_name, int len)
53 {
54         uint32_t i;
55         const char *pin_name_ptr;
56         char pin_name_term[32];
57
58         if (len != -1) {    // pin name not terminated by '\0'
59                 strncpy(pin_name_term, pin_name, len);
60                 pin_name_term[len] = '\0';
61                 pin_name_ptr = pin_name_term;
62         }
63         else pin_name_ptr = pin_name;
64
65         for (i = 0; i < MAX_PIN_CNT; i++) {
66                 if (strcmp(pin_name_ptr, pin_map[i].pin_name) == 0)
67                         return &pin_map[i].pin_desc;
68         }
69         return NULL;
70 }
71
72
73 uint32_t hal_gpio_pin_get_value(uint32_t pin_dsc)
74 {
75         return ((hal_gpio_pin_get_port_base(pin_dsc)->DIN) >> (pin_dsc & 0x1f)) & 1;
76 }
77
78
79 void hal_gpio_pin_set_value(uint32_t pin_dsc, uint32_t value)
80 {
81         if (value)
82                 hal_gpio_pin_get_port_base(pin_dsc)->DSET = 1 << (pin_dsc & 0x1f);
83         else
84                 hal_gpio_pin_get_port_base(pin_dsc)->DCLR = 1 << (pin_dsc & 0x1f);
85 }
86
87
88 int hal_gpio_pin_direction_input(uint32_t pin_dsc)
89 {
90         hal_gpio_pin_get_port_base(pin_dsc)->DIR &= ~(1 << (pin_dsc & 0x1f));
91         return 0;
92 }
93
94 int hal_gpio_pin_direction_output(uint32_t pin_dsc, uint32_t value)
95 {
96         hal_gpio_pin_set_value(pin_dsc, value);
97         hal_gpio_pin_get_port_base(pin_dsc)->DIR |= (1 << (pin_dsc & 0x1f));
98         return 0;
99 }
100
101 int hal_gpio_pin_get_direction(uint32_t pin_dsc)
102 {
103         return (hal_gpio_pin_get_port_base(pin_dsc)->DIR >> (pin_dsc & 0x1f)) & 1;
104 }
105
106
107 uint32_t hal_gpio_pin_conf_mode(uint32_t pin_dsc, uint32_t mode)
108 {
109         gioPORT_t *gioPort = hal_gpio_pin_get_port_base(pin_dsc);
110
111         if (mode & PORT_CONF_MODE_PTYPE_MASK)
112                 gioPort->PSL |= (1 << (pin_dsc & 0x1f));
113         else
114                 gioPort->PSL &= ~(1 << (pin_dsc & 0x1f));
115         if (mode & PORT_CONF_MODE_PEN_MASK)
116                 gioPort->PULDIS |= (1 << (pin_dsc & 0x1f));
117         else
118                 gioPort->PULDIS &= ~(1 << (pin_dsc & 0x1f));
119         return 0;
120 }
121
122
123 uint32_t hal_gpio_pin_conf_od(uint32_t pin_dsc, uint32_t od)
124 {
125         gioPORT_t *gioPort = hal_gpio_pin_get_port_base(pin_dsc);
126
127         if (od & PORT_CONF_OD_ON)
128                 gioPort->PDR |= (1 << (pin_dsc & 0x1f));
129         else
130                 gioPort->PDR &= ~(1 << (pin_dsc & 0x1f));
131         return 0;
132 }
133
134
135 uint32_t hal_gpio_pin_conf_set(uint32_t pin_dsc, uint32_t conf)
136 {
137         pin_dsc &= ~PORT_CONF_MASK;
138         hal_gpio_pin_conf_mode(pin_dsc, conf & PORT_CONF_MODE_MASK);
139         hal_gpio_pin_conf_od(pin_dsc, conf & PORT_CONF_OD_MASK);
140         if (conf & PORT_CONF_SET_DIR) {
141                 if ((conf & PORT_CONF_DIR_MASK) == (PORT_CONF_DIR_IN & PORT_CONF_DIR_MASK))
142                         hal_gpio_pin_direction_input(pin_dsc);
143                 else
144                         hal_gpio_pin_direction_output(pin_dsc, conf & PORT_CONF_INIT_HIGH);
145         }
146
147         return 0;
148 }
149
150 uint32_t hal_gpio_pin_conf(uint32_t pin_dsc)
151 {
152         return hal_gpio_pin_conf_set(pin_dsc, pin_dsc);
153 }