]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blob - rpp/src/drv/_tms570_rpp/digital_io_def.c
Merge port and gpio definitions into one file in the DRV layer
[pes-rpp/rpp-lib.git] / rpp / src / drv / _tms570_rpp / digital_io_def.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  * Abstract:
12  *          This file contains gpio pins definitions
13  *
14  *      On TMS570 MCU pins can operates as GIO on ports DMM, GIOA, GIOB,
15  *      HET1 and HET2. Those pins, that are defined in this file, can be
16  *      accessed directly as GPIO by hal_gpio_set_value and
17  *      hal_gpio_get_value. Pin configuration can be modified by functions
18  *      defined in hal_gpio_tms570 source and header files.
19  *
20  *      NOTE: Although the configuration functions are implemented and
21  *      should be ready to use, they were only slightly tested and are not
22  *      used by the RPP software yet.
23  */
24
25 #include "drv/_tms570_rpp/digital_io_def.h"
26 #include "drv/digital_io.h"
27 #include "drv/spi.h"
28 #include "drv/_tms570_rpp/adc.h"
29
30
31 #define PORT_PIN(p,n,conf)  (((p)<<DIO_PORT_SHIFT) | (n) | (conf))
32
33 #define PORT_CONF_GPIO_OUT_HI_PD_PEN_ODOFF      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_HIGH|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_OFF
34 #define PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_OFF
35 #define PORT_CONF_GPIO_OUT_LO_PU_PEN_ODOFF      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PU|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_OFF
36 #define PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON       DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_ON
37 #define PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODON      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_ON
38 #define PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF     DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_OFF
39 #define PORT_CONF_GPIO_OUT_LO_PU_PDIS_ODOFF     DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_OUT|DIO_PORT_CONF_MODE_PU|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_OFF
40 #define PORT_CONF_GPIO_IN_HI_PU_PEN_ODON        DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_HIGH|DIO_PORT_CONF_DIR_IN|DIO_PORT_CONF_MODE_PU|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_ON
41 #define PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON       DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_HIGH|DIO_PORT_CONF_DIR_IN|DIO_PORT_CONF_MODE_PU|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_ON
42 #define PORT_CONF_GPIO_IN_LO_PD_PDIS_ODOFF      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_IN|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_OFF
43 #define PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF       DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_IN|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PEN|DIO_PORT_CONF_OD_OFF
44 #define PORT_CONF_GPIO_IN_LO_PU_PDIS_ODOFF      DIO_PORT_CONF_FNC_GPIO|DIO_PORT_CONF_INIT_LOW|DIO_PORT_CONF_DIR_IN|DIO_PORT_CONF_MODE_PD|DIO_PORT_CONF_MODE_PDIS|DIO_PORT_CONF_OD_OFF
45
46 /* Pins descriptors */
47 #define PIN_DSC_FANCTRL     PORT_PIN(DIO_PORT_ID_DMM, 0, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
48 #define PIN_DSC_ETHRST      PORT_PIN(DIO_PORT_ID_DMM, 1, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
49 #define PIN_DSC_VBAT1EN     PORT_PIN(DIO_PORT_ID_DMM, 2, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON)
50 #define PIN_DSC_VBAT2EN     PORT_PIN(DIO_PORT_ID_DMM, 3, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON)
51 #define PIN_DSC_VBAT3EN     PORT_PIN(DIO_PORT_ID_DMM, 4, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON)
52 #define PIN_DSC_VBATEN      PORT_PIN(DIO_PORT_ID_DMM, 5, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
53 #define PIN_DSC_SPICSA      PORT_PIN(DIO_PORT_ID_DMM, 7, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
54 #define PIN_DSC_SPICSB      PORT_PIN(DIO_PORT_ID_DMM, 8, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
55 #define PIN_DSC_MOUT1EN     PORT_PIN(DIO_PORT_ID_DMM, 11, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
56 #define PIN_DSC_MOUT2EN     PORT_PIN(DIO_PORT_ID_DMM, 12, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
57 #define PIN_DSC_CANNSTB     PORT_PIN(DIO_PORT_ID_DMM, 13, PORT_CONF_GPIO_OUT_HI_PD_PEN_ODOFF)
58 #define PIN_DSC_CANEN       PORT_PIN(DIO_PORT_ID_DMM, 15, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
59 #define PIN_DSC_LIN2NSLP    PORT_PIN(DIO_PORT_ID_DMM, 16, PORT_CONF_GPIO_OUT_HI_PD_PEN_ODOFF)
60 #define PIN_DSC_LIN1NSLP    PORT_PIN(DIO_PORT_ID_DMM, 17, PORT_CONF_GPIO_OUT_HI_PD_PEN_ODOFF)
61 #define PIN_DSC_DININT      PORT_PIN(DIO_PORT_ID_DMM, 18, PORT_CONF_GPIO_IN_LO_PD_PDIS_ODOFF)
62 #define PIN_DSC_DIN8        PORT_PIN(DIO_PORT_ID_GIOA, 0, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
63 #define PIN_DSC_DIN9        PORT_PIN(DIO_PORT_ID_GIOA, 1, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
64 #define PIN_DSC_DIN10       PORT_PIN(DIO_PORT_ID_GIOA, 2, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
65 #define PIN_DSC_DIN11       PORT_PIN(DIO_PORT_ID_GIOA, 3, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
66 #define PIN_DSC_DIN12       PORT_PIN(DIO_PORT_ID_GIOA, 4, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
67 #define PIN_DSC_DIN13       PORT_PIN(DIO_PORT_ID_GIOA, 5, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
68 #define PIN_DSC_DIN14       PORT_PIN(DIO_PORT_ID_GIOA, 6, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
69 #define PIN_DSC_DIN15       PORT_PIN(DIO_PORT_ID_GIOA, 7, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
70 #define PIN_DSC_MOUT6EN     PORT_PIN(DIO_PORT_ID_GIOB, 0, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
71 #define PIN_DSC_MOUT5EN     PORT_PIN(DIO_PORT_ID_GIOB, 1, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
72 #define PIN_DSC_MOUT6IN     PORT_PIN(DIO_PORT_ID_GIOB, 2, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
73 #define PIN_DSC_MOUT5IN     PORT_PIN(DIO_PORT_ID_GIOB, 3, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
74 #define PIN_DSC_MOUT4EN     PORT_PIN(DIO_PORT_ID_GIOB, 4, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
75 #define PIN_DSC_MOUT3EN     PORT_PIN(DIO_PORT_ID_GIOB, 5, PORT_CONF_GPIO_IN_HI_PU_PDIS_ODON)
76 #define PIN_DSC_MOUT4IN     PORT_PIN(DIO_PORT_ID_GIOB, 6, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
77 #define PIN_DSC_MOUT3IN     PORT_PIN(DIO_PORT_ID_GIOB, 7, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
78 #define PIN_DSC_HBREN       PORT_PIN(DIO_PORT_ID_HET1, 1, PORT_CONF_GPIO_OUT_LO_PU_PDIS_ODOFF)
79 #define PIN_DSC_HBRDIR      PORT_PIN(DIO_PORT_ID_HET1, 4, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON)
80 #define PIN_DSC_HBRPWM      PORT_PIN(DIO_PORT_ID_HET1, 7, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODON)
81 #define PIN_DSC_MOUT1IN     PORT_PIN(DIO_PORT_ID_HET1, 9, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
82 #define PIN_DSC_MOUT2IN     PORT_PIN(DIO_PORT_ID_HET1, 14, PORT_CONF_GPIO_OUT_LO_PD_PDIS_ODOFF)
83 #define PIN_DSC_HOUT1IN     PORT_PIN(DIO_PORT_ID_HET1, 16, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
84 #define PIN_DSC_HOUT1DIAG   PORT_PIN(DIO_PORT_ID_HET1, 17, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
85 #define PIN_DSC_HOUT2IN     PORT_PIN(DIO_PORT_ID_HET1, 18, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
86 #define PIN_DSC_HOUT2DIAG   PORT_PIN(DIO_PORT_ID_HET1, 19, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
87 #define PIN_DSC_HOUT3IN     PORT_PIN(DIO_PORT_ID_HET1, 20, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
88 #define PIN_DSC_HOUT3DIAG   PORT_PIN(DIO_PORT_ID_HET1, 21, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
89 #define PIN_DSC_HOUT4IN     PORT_PIN(DIO_PORT_ID_HET1, 22, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
90 #define PIN_DSC_HOUT4DIAG   PORT_PIN(DIO_PORT_ID_HET1, 23, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
91 #define PIN_DSC_HOUT5IN     PORT_PIN(DIO_PORT_ID_HET1, 25, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
92 #define PIN_DSC_HOUT5DIAG   PORT_PIN(DIO_PORT_ID_HET1, 27, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
93 #define PIN_DSC_HOUT6IN     PORT_PIN(DIO_PORT_ID_HET1, 29, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
94 #define PIN_DSC_HOUT6DIAG   PORT_PIN(DIO_PORT_ID_HET1, 31, PORT_CONF_GPIO_IN_LO_PD_PEN_ODOFF)
95 #define PIN_DSC_DMM_UNUSED(b)   PORT_PIN(DIO_PORT_ID_HET2, b, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
96 #define PIN_DSC_GIOA_UNUSED(b)   PORT_PIN(DIO_PORT_ID_HET2, b, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
97 #define PIN_DSC_GIOB_UNUSED(b) PORT_PIN(DIO_PORT_ID_HET2, b, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
98 #define PIN_DSC_HET1_UNUSED(b) PORT_PIN(DIO_PORT_ID_HET2, b, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
99 #define PIN_DSC_HET2_UNUSED(b) PORT_PIN(DIO_PORT_ID_HET2, b, PORT_CONF_GPIO_OUT_LO_PD_PEN_ODOFF)
100
101 /**
102  * Array of ports used as GPIO. Thanks to that array, we can
103  * determine port just by index in pin_desc at 5th bit */
104 gioPORT_t *dio_port_id_map[DIO_MAX_PORT_CNT] = {
105         (gioPORT_t *)dmmPORT,
106         (gioPORT_t *)gioPORTA,
107         (gioPORT_t *)gioPORTB,
108         (gioPORT_t *)hetPORT1,
109         (gioPORT_t *)hetPORT2
110 };
111
112 /**
113  * Map of pin names to pin descriptors. Each pin can be then easily
114  * found just by its name given as a string to hal_gpio_get_pin_dsc
115  * function*/
116 dio_pin_map_element_t dio_pin_map[DIO_MAX_PIN_CNT] = {
117         /* DMM pins */
118         { .pin_name = DIO_PIN_NAME_FANCTRL, .pin_desc = PIN_DSC_FANCTRL },
119         { .pin_name = DIO_PIN_NAME_ETHRST,  .pin_desc = PIN_DSC_ETHRST },
120         { .pin_name = DIO_PIN_NAME_VBAT1EN, .pin_desc = PIN_DSC_VBAT1EN },
121         { .pin_name = DIO_PIN_NAME_VBAT2EN, .pin_desc = PIN_DSC_VBAT2EN },
122         { .pin_name = DIO_PIN_NAME_VBAT3EN, .pin_desc = PIN_DSC_VBAT3EN },
123         { .pin_name = DIO_PIN_NAME_VBATEN,  .pin_desc = PIN_DSC_VBATEN },
124         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_DMM_UNUSED(6) },
125         { .pin_name = DIO_PIN_NAME_SPICSA,  .pin_desc = PIN_DSC_SPICSA },
126         { .pin_name = DIO_PIN_NAME_SPICSB,  .pin_desc = PIN_DSC_SPICSB },
127         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_DMM_UNUSED(9)},
128         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_DMM_UNUSED(10) },
129         { .pin_name = DIO_PIN_NAME_MOUT1EN, .pin_desc = PIN_DSC_MOUT1EN },
130         { .pin_name = DIO_PIN_NAME_MOUT2EN, .pin_desc = PIN_DSC_MOUT2EN },
131         { .pin_name = DIO_PIN_NAME_CANNSTB, .pin_desc = PIN_DSC_CANNSTB },
132         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_DMM_UNUSED(14) },
133         { .pin_name = DIO_PIN_NAME_CANEN,   .pin_desc = PIN_DSC_CANEN },
134         { .pin_name = DIO_PIN_NAME_LIN2NSLP,.pin_desc = PIN_DSC_LIN2NSLP },
135         { .pin_name = DIO_PIN_NAME_LIN1NSLP,.pin_desc = PIN_DSC_LIN1NSLP },
136         { .pin_name = DIO_PIN_NAME_DININT,  .pin_desc = PIN_DSC_DININT },
137         /* GIOA pins */
138         { .pin_name = DIO_PIN_NAME_DIN8,    .pin_desc = PIN_DSC_DIN8 },
139         { .pin_name = DIO_PIN_NAME_DIN9,    .pin_desc = PIN_DSC_DIN9 },
140         { .pin_name = DIO_PIN_NAME_DIN10,   .pin_desc = PIN_DSC_DIN10 },
141         { .pin_name = DIO_PIN_NAME_DIN11,   .pin_desc = PIN_DSC_DIN11 },
142         { .pin_name = DIO_PIN_NAME_DIN12,   .pin_desc = PIN_DSC_DIN12 },
143         { .pin_name = DIO_PIN_NAME_DIN13,   .pin_desc = PIN_DSC_DIN13 },
144         { .pin_name = DIO_PIN_NAME_DIN14,   .pin_desc = PIN_DSC_DIN14 },
145         { .pin_name = DIO_PIN_NAME_DIN15,   .pin_desc = PIN_DSC_DIN15 },
146         /* GIOB pins */
147         { .pin_name = DIO_PIN_NAME_MOUT6EN, .pin_desc = PIN_DSC_MOUT6EN },
148         { .pin_name = DIO_PIN_NAME_MOUT5EN, .pin_desc = PIN_DSC_MOUT5EN },
149         { .pin_name = DIO_PIN_NAME_MOUT6IN, .pin_desc = PIN_DSC_MOUT6IN },
150         { .pin_name = DIO_PIN_NAME_MOUT5IN, .pin_desc = PIN_DSC_MOUT5IN },
151         { .pin_name = DIO_PIN_NAME_MOUT4EN, .pin_desc = PIN_DSC_MOUT4EN },
152         { .pin_name = DIO_PIN_NAME_MOUT3EN, .pin_desc = PIN_DSC_MOUT3EN },
153         { .pin_name = DIO_PIN_NAME_MOUT4IN, .pin_desc = PIN_DSC_MOUT4IN },
154         { .pin_name = DIO_PIN_NAME_MOUT3IN, .pin_desc = PIN_DSC_MOUT3IN },
155         /* HET1 pins */
156         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(0) },
157         { .pin_name = DIO_PIN_NAME_HBREN,    .pin_desc = PIN_DSC_HBREN },
158         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(2) },
159         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(3) },
160         { .pin_name = DIO_PIN_NAME_HBRDIR,   .pin_desc = PIN_DSC_HBRDIR },
161         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(5) },
162         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(6) },
163         { .pin_name = DIO_PIN_NAME_HBRPWM,   .pin_desc = PIN_DSC_HBRPWM },
164         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(8) },
165         { .pin_name = DIO_PIN_NAME_MOUT1IN,  .pin_desc = PIN_DSC_MOUT1IN },
166         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(10) },
167         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(11) },
168         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(12) },
169         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(13) },
170         { .pin_name = DIO_PIN_NAME_MOUT2IN,  .pin_desc = PIN_DSC_MOUT2IN },
171         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(15) },
172         { .pin_name = DIO_PIN_NAME_HOUT1IN,  .pin_desc = PIN_DSC_HOUT1IN },
173         { .pin_name = DIO_PIN_NAME_HOUT1DIAG,.pin_desc = PIN_DSC_HOUT1DIAG },
174         { .pin_name = DIO_PIN_NAME_HOUT2IN,  .pin_desc = PIN_DSC_HOUT2IN },
175         { .pin_name = DIO_PIN_NAME_HOUT2DIAG,.pin_desc = PIN_DSC_HOUT2DIAG },
176         { .pin_name = DIO_PIN_NAME_HOUT3IN,  .pin_desc = PIN_DSC_HOUT3IN },
177         { .pin_name = DIO_PIN_NAME_HOUT3DIAG,.pin_desc = PIN_DSC_HOUT3DIAG },
178         { .pin_name = DIO_PIN_NAME_HOUT4IN,  .pin_desc = PIN_DSC_HOUT4IN },
179         { .pin_name = DIO_PIN_NAME_HOUT4DIAG,.pin_desc = PIN_DSC_HOUT4DIAG },
180         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(22) },
181         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(23) },
182         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(24) },
183         { .pin_name = DIO_PIN_NAME_HOUT5IN,  .pin_desc = PIN_DSC_HOUT5IN },
184         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(26) },
185         { .pin_name = DIO_PIN_NAME_HOUT5DIAG,.pin_desc = PIN_DSC_HOUT5DIAG },
186         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(28) },
187         { .pin_name = DIO_PIN_NAME_HOUT6IN,  .pin_desc = PIN_DSC_HOUT6IN },
188         { .pin_name = DIO_PIN_NAME_UNUSED,   .pin_desc = PIN_DSC_HET1_UNUSED(30) },
189         { .pin_name = DIO_PIN_NAME_HOUT6DIAG,.pin_desc = PIN_DSC_HOUT6DIAG },
190         /* HET2 pins */
191         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(0) },
192         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(1) },
193         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(2) },
194         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(3) },
195         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(4) },
196         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(5) },
197         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(6) },
198         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(7) },
199         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(8) },
200         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(9) },
201         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(10) },
202         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(11) },
203         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(12) },
204         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(13) },
205         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(14) },
206         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(15) },
207         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(16) },
208         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(17) },
209         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(18) },
210         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(19) },
211         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(20) },
212         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(21) },
213         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(22) },
214         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(23) },
215         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(24) },
216         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(25) },
217         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(26) },
218         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(27) },
219         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(28) },
220         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(29) },
221         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(30) },
222         { .pin_name = DIO_PIN_NAME_UNUSED,  .pin_desc = PIN_DSC_HET2_UNUSED(31) }
223 };
224
225 // FIXME Upper layer dependency/coupling
226 // Declared in drv/adc.h
227 extern uint32_t adc_get_port_val(uint32_t *config, uint32_t num_channels, uint32_t *values);
228
229
230 // Lists of pins assigned to the ports
231 static uint32_t port_cfg_dinmcu[] = {
232                 PIN_DSC_DIN8, PIN_DSC_DIN9, PIN_DSC_DIN10, PIN_DSC_DIN11,
233                 PIN_DSC_DIN12, PIN_DSC_DIN13, PIN_DSC_DIN14, PIN_DSC_DIN15
234 };
235 static uint32_t port_cfg_dinspi[] = { 1, 0 };
236 static uint32_t port_cfg_houtdiag[] = {
237                 PIN_DSC_HOUT1DIAG, PIN_DSC_HOUT2DIAG, PIN_DSC_HOUT3DIAG,
238                 PIN_DSC_HOUT4DIAG, PIN_DSC_HOUT5DIAG, PIN_DSC_HOUT6DIAG
239 };
240 static uint32_t port_cfg_houtin[] = {
241                 PIN_DSC_HOUT1IN, PIN_DSC_HOUT2IN, PIN_DSC_HOUT3IN,
242                 PIN_DSC_HOUT4IN, PIN_DSC_HOUT5IN, PIN_DSC_HOUT6IN
243 };
244 static uint32_t port_cfg_houtifbk[] = { (uint32_t)adcREG2, adcGROUP1, 0 };
245 static uint32_t port_cfg_adc[] = { (uint32_t)adcREG1, adcGROUP1, 1 };
246 static uint32_t port_cfg_lout[] = { 1, 1 };
247 static uint32_t port_cfg_dac1_2[] = { 3, 0 };
248 static uint32_t port_cfg_dac3_4[] = { 3, 1 };
249 static uint32_t port_cfg_dacdref[] = { 3, 2 };
250 static uint32_t port_cfg_hbr[] = { 4, 0 };
251 static uint32_t port_cfg_fray1[] = { 4, 1 };
252 static uint32_t port_cfg_fray2[] = { 4, 2 };
253 static uint32_t port_cfg_mouten[] = {
254                 PIN_DSC_MOUT1EN, PIN_DSC_MOUT2EN, PIN_DSC_MOUT3EN,
255                 PIN_DSC_MOUT4EN, PIN_DSC_MOUT5EN, PIN_DSC_MOUT6EN
256 };
257 static uint32_t port_cfg_moutin[] = {
258                 PIN_DSC_MOUT1IN, PIN_DSC_MOUT2IN, PIN_DSC_MOUT3IN,
259                 PIN_DSC_MOUT4IN, PIN_DSC_MOUT5IN, PIN_DSC_MOUT6IN
260 };
261
262 // Port descriptors
263 static dio_port_desc_t port_desc_dinmcu = {
264  .config = port_cfg_dinmcu,
265  .numValues = 8,
266  .interfaceType = GPIO,
267  .port_getfnc_ptr = &dio_gpio_port_get_val,
268  .port_setfnc_ptr = ((void *)0),
269 };
270 static dio_port_desc_t port_desc_dinspi = {
271  .config = port_cfg_dinspi,
272  .numValues = 3,
273  .interfaceType = SPI,
274  .port_getfnc_ptr = ((void *)0),
275  .port_setfnc_ptr = &dio_spi_port_transfer_command,
276 };
277 static dio_port_desc_t port_desc_houtdiag = {
278  .config = port_cfg_houtdiag,
279  .numValues = 6,
280  .interfaceType = GPIO,
281  .port_getfnc_ptr = &dio_gpio_port_get_val,
282  .port_setfnc_ptr = ((void *)0),
283 };
284 static dio_port_desc_t port_desc_houtin = {
285  .config = port_cfg_houtin,
286  .numValues = 6,
287  .interfaceType = GPIO,
288  .port_getfnc_ptr = &dio_gpio_port_get_val,
289  .port_setfnc_ptr = &dio_gpio_port_set_val,
290 };
291 static dio_port_desc_t port_desc_houtifbk = {
292  .config = port_cfg_houtifbk,
293  .numValues = 6,
294  .interfaceType = ADC,
295  .port_getfnc_ptr = &adc_get_port_val,
296  .port_setfnc_ptr = ((void *)0),
297 };
298 static dio_port_desc_t port_desc_adc = {
299  .config = port_cfg_adc,
300  .numValues = 12,
301  .interfaceType = ADC,
302  .port_getfnc_ptr = &adc_get_port_val,
303  .port_setfnc_ptr = ((void *)0),
304 };
305 static dio_port_desc_t port_desc_lout = {
306  .config = port_cfg_lout,
307  .numValues = 4,
308  .interfaceType = SPI,
309  .port_getfnc_ptr = ((void *)0),
310  .port_setfnc_ptr = &dio_spi_port_transfer_command,
311 };
312 static dio_port_desc_t port_desc_dac1_2 = {
313  .config = port_cfg_dac1_2,
314  .numValues = 2,
315  .interfaceType = SPI,
316  .port_getfnc_ptr = ((void *)0),
317  .port_setfnc_ptr = &dio_spi_port_transfer_command,
318 };
319 static dio_port_desc_t port_desc_dac3_4 = {
320  .config = port_cfg_dac3_4,
321  .numValues = 2,
322  .interfaceType = SPI,
323  .port_getfnc_ptr = ((void *)0),
324  .port_setfnc_ptr = &dio_spi_port_transfer_command,
325 };
326 static dio_port_desc_t port_desc_dacdref = {
327  .config = port_cfg_dacdref,
328  .numValues = 2,
329  .interfaceType = SPI,
330  .port_getfnc_ptr = ((void *)0),
331  .port_setfnc_ptr = &dio_spi_port_transfer_command,
332 };
333 static dio_port_desc_t port_desc_hbr = {
334  .config = port_cfg_hbr,
335  .numValues = 2,
336  .interfaceType = SPI,
337  .port_getfnc_ptr = ((void *)0),
338  .port_setfnc_ptr = &dio_spi_port_transfer_command,
339 };
340 static dio_port_desc_t port_desc_fray1 = {
341  .config = port_cfg_fray1,
342  .numValues = 2,
343  .interfaceType = SPI,
344  .port_getfnc_ptr = ((void *)0),
345  .port_setfnc_ptr = &dio_spi_port_transfer_command,
346 };
347 static dio_port_desc_t port_desc_fray2 = {
348  .config = port_cfg_fray2,
349  .numValues = 2,
350  .interfaceType = SPI,
351  .port_getfnc_ptr = ((void *)0),
352  .port_setfnc_ptr = &dio_spi_port_transfer_command,
353 };
354 static dio_port_desc_t port_desc_mouten = {
355  .config = port_cfg_mouten,
356  .numValues = 6,
357  .interfaceType = GPIO,
358  .port_getfnc_ptr = &dio_gpio_port_get_val,
359  .port_setfnc_ptr = ((void *)0),
360 };
361 static dio_port_desc_t port_desc_moutin = {
362  .config = port_cfg_moutin,
363  .numValues = 6,
364  .interfaceType = GPIO,
365  .port_getfnc_ptr = &dio_gpio_port_get_val,
366  .port_setfnc_ptr = &dio_gpio_port_set_val,
367 };
368
369 // Maps of port names to port descriptors
370 dio_port_def_t dio_port_definition[DIO_PORT_CNT] = {
371         {.name = DIO_PORT_NAME_DINMCU,      .desc = &port_desc_dinmcu},
372         {.name = DIO_PORT_NAME_DINSPI,      .desc = &port_desc_dinspi},
373         {.name = DIO_PORT_NAME_HOUTDIAG,    .desc = &port_desc_houtdiag},
374         {.name = DIO_PORT_NAME_HOUTIN,      .desc = &port_desc_houtin},
375         {.name = DIO_PORT_NAME_HOUTIFBK,    .desc = &port_desc_houtifbk},
376         {.name = DIO_PORT_NAME_ADC,         .desc = &port_desc_adc},
377         {.name = DIO_PORT_NAME_LOUT,        .desc = &port_desc_lout},
378         {.name = DIO_PORT_NAME_DAC1_2,      .desc = &port_desc_dac1_2},
379         {.name = DIO_PORT_NAME_DAC3_4,      .desc = &port_desc_dac3_4},
380         {.name = DIO_PORT_NAME_DACDREF,     .desc = &port_desc_dacdref},
381         {.name = DIO_PORT_NAME_HBR,         .desc = &port_desc_hbr},
382         {.name = DIO_PORT_NAME_FRAY1,       .desc = &port_desc_fray1},
383         {.name = DIO_PORT_NAME_FRAY2,       .desc = &port_desc_fray2},
384         {.name = DIO_PORT_NAME_MOUTEN,      .desc = &port_desc_mouten},
385         {.name = DIO_PORT_NAME_MOUTIN,      .desc = &port_desc_moutin}
386 };