1 /* Copyright (C) 2012-2013 Czech Technical University in Prague
4 * - Michal Horn <hornmich@fel.cvut.cz>
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.
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.
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.
24 extern gioPORT_t *port_id_map[MAX_PORT_CNT];
25 extern pin_map_element_t pin_map[MAX_PIN_CNT];
27 uint8_t hal_gpio_get_pin_cnt() {
31 pin_map_element_t* hal_gpio_get_pin_map() {
35 gioPORT_t *hal_gpio_get_port_base(uint32_t port_num)
37 return port_id_map[port_num];
40 uint32_t hal_gpio_pin_get_port_num(uint32_t pin_dsc)
43 return (pin_dsc & ~PORT_CONF_MASK) >> PORT_SHIFT;
46 gioPORT_t *hal_gpio_pin_get_port_base(uint32_t pin_dsc)
48 return hal_gpio_get_port_base(hal_gpio_pin_get_port_num(pin_dsc));
52 uint32_t *hal_gpio_pin_get_dsc(const char *pin_name, int len)
55 const char *pin_name_ptr;
56 char pin_name_term[32];
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;
63 else pin_name_ptr = pin_name;
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;
73 uint32_t hal_gpio_pin_get_value(uint32_t pin_dsc)
75 return ((hal_gpio_pin_get_port_base(pin_dsc)->DIN) >> (pin_dsc & 0x1f)) & 1;
79 void hal_gpio_pin_set_value(uint32_t pin_dsc, uint32_t value)
82 hal_gpio_pin_get_port_base(pin_dsc)->DSET = 1 << (pin_dsc & 0x1f);
84 hal_gpio_pin_get_port_base(pin_dsc)->DCLR = 1 << (pin_dsc & 0x1f);
88 int hal_gpio_pin_direction_input(uint32_t pin_dsc)
90 hal_gpio_pin_get_port_base(pin_dsc)->DIR &= ~(1 << (pin_dsc & 0x1f));
94 int hal_gpio_pin_direction_output(uint32_t pin_dsc, uint32_t value)
96 hal_gpio_pin_set_value(pin_dsc, value);
97 hal_gpio_pin_get_port_base(pin_dsc)->DIR |= (1 << (pin_dsc & 0x1f));
101 int hal_gpio_pin_get_direction(uint32_t pin_dsc)
103 return (hal_gpio_pin_get_port_base(pin_dsc)->DIR >> (pin_dsc & 0x1f)) & 1;
107 uint32_t hal_gpio_pin_conf_mode(uint32_t pin_dsc, uint32_t mode)
109 gioPORT_t *gioPort = hal_gpio_pin_get_port_base(pin_dsc);
111 if (mode & PORT_CONF_MODE_PTYPE_MASK)
112 gioPort->PSL |= (1 << (pin_dsc & 0x1f));
114 gioPort->PSL &= ~(1 << (pin_dsc & 0x1f));
115 if (mode & PORT_CONF_MODE_PEN_MASK)
116 gioPort->PULDIS |= (1 << (pin_dsc & 0x1f));
118 gioPort->PULDIS &= ~(1 << (pin_dsc & 0x1f));
123 uint32_t hal_gpio_pin_conf_od(uint32_t pin_dsc, uint32_t od)
125 gioPORT_t *gioPort = hal_gpio_pin_get_port_base(pin_dsc);
127 if (od & PORT_CONF_OD_ON)
128 gioPort->PDR |= (1 << (pin_dsc & 0x1f));
130 gioPort->PDR &= ~(1 << (pin_dsc & 0x1f));
135 uint32_t hal_gpio_pin_conf_set(uint32_t pin_dsc, uint32_t conf)
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);
144 hal_gpio_pin_direction_output(pin_dsc, conf & PORT_CONF_INIT_HIGH);
150 uint32_t hal_gpio_pin_conf(uint32_t pin_dsc)
152 return hal_gpio_pin_conf_set(pin_dsc, pin_dsc);