clang-format: run clang-format on C/C++ code
[contrib/mraa.git] / src / x86 / intel_galileo_rev_g.c
1 /*
2  * Author: Brendan Le Foll <brendan.le.foll@intel.com>
3  * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
4  * Copyright (c) 2014 Intel Corporation.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25
26 #include <stdlib.h>
27 #include <string.h>
28 #include <sys/mman.h>
29
30 #include "common.h"
31 #include "x86/intel_galileo_rev_g.h"
32
33 #define MAX_SIZE 64
34 #define SYSFS_CLASS_GPIO "/sys/class/gpio"
35 #define PLATFORM_NAME "Intel Galileo Gen 2"
36
37 #define UIO_PATH "/dev/uio0"
38
39 static uint8_t* mmap_reg = NULL;
40 static int mmap_fd = 0;
41 static int mmap_size = 0x1000;
42 static unsigned int mmap_count = 0;
43
44 static unsigned int pullup_map[] = { 33, 29, 35, 17, 37, 19, 21, 39, 41, 23,
45                                      27, 25, 43, 31, 49, 51, 53, 55, 57, 59 };
46
47 static mraa_gpio_context agpioOutputen[MRAA_INTEL_GALILEO_GEN_2_PINCOUNT];
48
49 mraa_result_t
50 mraa_intel_galileo_gen2_dir_pre(mraa_gpio_context dev, gpio_dir_t dir)
51 {
52     if (dev->phy_pin >= 0) {
53         int pin = dev->phy_pin;
54         if (plat->pins[pin].gpio.complex_cap.complex_pin != 1)
55             return MRAA_SUCCESS;
56
57         if (plat->pins[pin].gpio.complex_cap.output_en == 1) {
58             if (!agpioOutputen[pin]) {
59                 agpioOutputen[pin] = mraa_gpio_init_raw(plat->pins[pin].gpio.output_enable);
60                 if (agpioOutputen[pin] == NULL) {
61                     return MRAA_ERROR_INVALID_RESOURCE;
62                 }
63                 if (mraa_gpio_dir(agpioOutputen[pin], MRAA_GPIO_OUT) != MRAA_SUCCESS) {
64                     return MRAA_ERROR_INVALID_RESOURCE;
65                 }
66             }
67
68             int output_val = 1;
69             if (dir == MRAA_GPIO_OUT) {
70                 output_val = 0;
71             }
72             if (mraa_gpio_write(agpioOutputen[pin], output_val) != MRAA_SUCCESS) {
73                 return MRAA_ERROR_INVALID_RESOURCE;
74             }
75         }
76     }
77     return MRAA_SUCCESS;
78 }
79
80 mraa_result_t
81 mraa_intel_galileo_gen2_gpio_close_pre(mraa_gpio_context dev)
82 {
83     if (dev->phy_pin >= 0) {
84         int pin = dev->phy_pin;
85         if (agpioOutputen[pin]) {
86             mraa_gpio_close(agpioOutputen[pin]);
87             agpioOutputen[pin] = NULL;
88         }
89     }
90     return MRAA_SUCCESS;
91 }
92
93 mraa_result_t
94 mraa_intel_galileo_gen2_i2c_init_pre(unsigned int bus)
95 {
96     mraa_gpio_context io18 = mraa_gpio_init_raw(57);
97     int status = 0;
98
99     if (io18 == NULL) {
100         return MRAA_ERROR_UNSPECIFIED;
101     }
102     status += mraa_gpio_dir(io18, MRAA_GPIO_IN);
103     status += mraa_gpio_mode(io18, MRAA_GPIO_HIZ);
104     mraa_gpio_close(io18);
105
106     mraa_gpio_context io19 = mraa_gpio_init_raw(59);
107     if (io19 == NULL) {
108         return MRAA_ERROR_UNSPECIFIED;
109     }
110     status += mraa_gpio_dir(io19, MRAA_GPIO_IN);
111     status += mraa_gpio_mode(io19, MRAA_GPIO_HIZ);
112     mraa_gpio_close(io19);
113
114     if (status > 0) {
115         return MRAA_ERROR_UNSPECIFIED;
116     }
117     return MRAA_SUCCESS;
118 }
119
120 mraa_result_t
121 mraa_intel_galileo_gen2_pwm_period_replace(mraa_pwm_context dev, int period)
122 {
123     char bu[MAX_SIZE];
124     snprintf(bu, MAX_SIZE, "/sys/class/pwm/pwmchip%d/device/pwm_period", dev->chipid);
125
126     int period_f = open(bu, O_RDWR);
127     if (period_f == -1) {
128         syslog(LOG_ERR, "galileo2: Failed to open period for writing!");
129         return MRAA_ERROR_INVALID_RESOURCE;
130     }
131     char out[MAX_SIZE];
132     int length = snprintf(out, MAX_SIZE, "%d", period);
133     if (write(period_f, out, length * sizeof(char)) == -1) {
134         close(period_f);
135         return MRAA_ERROR_INVALID_RESOURCE;
136     }
137
138     close(period_f);
139     return MRAA_SUCCESS;
140 }
141
142 mraa_result_t
143 mraa_intel_galileo_gen2_gpio_mode_replace(mraa_gpio_context dev, gpio_mode_t mode)
144 {
145     if (dev->value_fp != -1) {
146         close(dev->value_fp);
147         dev->value_fp = -1;
148     }
149
150     mraa_gpio_context pullup_e;
151     pullup_e = mraa_gpio_init_raw(pullup_map[dev->phy_pin]);
152     if (pullup_e == NULL) {
153         return MRAA_ERROR_INVALID_RESOURCE;
154     }
155     if (mraa_gpio_dir(pullup_e, MRAA_GPIO_IN) != MRAA_SUCCESS) {
156         mraa_gpio_close(pullup_e);
157         syslog(LOG_ERR, "galileo2: Failed to set gpio pullup");
158         return MRAA_ERROR_INVALID_RESOURCE;
159     }
160
161     char filepath[MAX_SIZE];
162     snprintf(filepath, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/drive", pullup_map[dev->phy_pin]);
163
164     int drive = open(filepath, O_WRONLY);
165     if (drive == -1) {
166         syslog(LOG_ERR, "galileo2: Failed to open drive for writing");
167         return MRAA_ERROR_INVALID_RESOURCE;
168     }
169
170     char bu[MAX_SIZE];
171     int length;
172     int value = -1;
173     switch (mode) {
174         case MRAA_GPIO_STRONG:
175             length = snprintf(bu, sizeof(bu), "hiz");
176             break;
177         case MRAA_GPIO_PULLUP:
178             length = snprintf(bu, sizeof(bu), "strong");
179             value = 1;
180             break;
181         case MRAA_GPIO_PULLDOWN:
182             length = snprintf(bu, sizeof(bu), "pulldown");
183             value = 0;
184             break;
185         case MRAA_GPIO_HIZ:
186             close(drive);
187             return MRAA_SUCCESS;
188             break;
189         default:
190             close(drive);
191             return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
192     }
193     if (write(drive, bu, length * sizeof(char)) == -1) {
194         syslog(LOG_ERR, "galileo2: Failed to write to drive mode");
195         close(drive);
196         mraa_gpio_close(pullup_e);
197         return MRAA_ERROR_INVALID_RESOURCE;
198     }
199     if (value != -1) {
200         mraa_result_t ret = mraa_gpio_dir(pullup_e, MRAA_GPIO_OUT);
201         ret += mraa_gpio_write(pullup_e, value);
202         if (ret != MRAA_SUCCESS) {
203             syslog(LOG_ERR, "galileo2: Error Setting pullup");
204             close(drive);
205             return MRAA_ERROR_INVALID_RESOURCE;
206         }
207     }
208
209     mraa_gpio_close(pullup_e);
210     close(drive);
211     return MRAA_SUCCESS;
212 }
213
214 mraa_result_t
215 mraa_intel_galileo_gen2_uart_init_pre(int index)
216 {
217     mraa_gpio_context io0_output = mraa_gpio_init_raw(32);
218     if (io0_output == NULL) {
219         return MRAA_ERROR_INVALID_RESOURCE;
220     }
221     mraa_gpio_context io1_output = mraa_gpio_init_raw(28);
222     if (io1_output == NULL) {
223         mraa_gpio_close(io0_output);
224         return MRAA_ERROR_INVALID_RESOURCE;
225     }
226
227     int status = 0;
228     status += mraa_gpio_dir(io0_output, MRAA_GPIO_OUT);
229     status += mraa_gpio_dir(io1_output, MRAA_GPIO_OUT);
230
231     status += mraa_gpio_write(io0_output, 1);
232     status += mraa_gpio_write(io1_output, 0);
233
234     mraa_gpio_close(io0_output);
235     mraa_gpio_close(io1_output);
236
237     if (status > 0) {
238         return MRAA_ERROR_UNSPECIFIED;
239     }
240     return MRAA_SUCCESS;
241 }
242
243 static mraa_result_t
244 mraa_intel_galileo_g2_mmap_unsetup()
245 {
246     if (mmap_reg == NULL) {
247         syslog(LOG_ERR, "mmap: null register cant unsetup");
248         return MRAA_ERROR_INVALID_RESOURCE;
249     }
250     munmap(mmap_reg, mmap_size);
251     mmap_reg = NULL;
252     close(mmap_fd);
253     return MRAA_SUCCESS;
254 }
255
256 mraa_result_t
257 mraa_intel_galileo_g2_mmap_write(mraa_gpio_context dev, int value)
258 {
259     int bitpos = plat->pins[dev->phy_pin].mmap.bit_pos;
260     if (value) {
261         *((unsigned*) mmap_reg) |= (1 << bitpos);
262         return MRAA_SUCCESS;
263     }
264     *((unsigned*) mmap_reg) &= ~(1 << bitpos);
265
266     return MRAA_SUCCESS;
267 }
268
269 mraa_result_t
270 mraa_intel_galileo_g2_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
271 {
272     if (dev == NULL) {
273         syslog(LOG_ERR, "Galileo mmap: context not valid");
274         return MRAA_ERROR_INVALID_HANDLE;
275     }
276
277     if (mraa_pin_mode_test(dev->phy_pin, MRAA_PIN_FAST_GPIO) == 0) {
278         syslog(LOG_ERR, "Galileo mmap: mmap not on this pin");
279         return MRAA_ERROR_NO_RESOURCES;
280     }
281     if (en == 0) {
282         if (dev->mmap_write == NULL) {
283             syslog(LOG_ERR, "mmap: can't disable disabled mmap gpio");
284             return MRAA_ERROR_INVALID_PARAMETER;
285         }
286         dev->mmap_write = NULL;
287         mmap_count--;
288         if (mmap_count == 0) {
289             return mraa_intel_galileo_g2_mmap_unsetup();
290         }
291         return MRAA_SUCCESS;
292     }
293
294     if (dev->mmap_write != NULL) {
295         syslog(LOG_ERR, "mmap: can't enable enabled mmap gpio");
296         return MRAA_ERROR_INVALID_PARAMETER;
297     }
298     if (mmap_reg == NULL) {
299         if ((mmap_fd = open(UIO_PATH, O_RDWR)) < 0) {
300             syslog(LOG_ERR, "mmap: Unable to open UIO device");
301             return MRAA_ERROR_INVALID_RESOURCE;
302         }
303         mmap_reg = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0);
304
305         if (mmap_reg == MAP_FAILED) {
306             syslog(LOG_ERR, "mmap: failed to mmap");
307             mmap_reg = NULL;
308             close(mmap_fd);
309             return MRAA_ERROR_NO_RESOURCES;
310         }
311     }
312     if (mraa_setup_mux_mapped(plat->pins[dev->phy_pin].mmap.gpio) != MRAA_SUCCESS) {
313         syslog(LOG_ERR, "mmap: unable to setup required multiplexers");
314         return MRAA_ERROR_INVALID_RESOURCE;
315     }
316     dev->mmap_write = &mraa_intel_galileo_g2_mmap_write;
317     return MRAA_SUCCESS;
318 }
319
320 mraa_board_t*
321 mraa_intel_galileo_gen2()
322 {
323     mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
324     if (b == NULL) {
325         return NULL;
326     }
327
328     b->platform_name = PLATFORM_NAME;
329     b->phy_pin_count = 20;
330     b->gpio_count = 14;
331     b->aio_count = 6;
332     b->adc_raw = 12;
333     b->adc_supported = 10;
334     b->pwm_default_period = 5000;
335     b->pwm_max_period = 41666;
336     b->pwm_min_period = 666;
337
338     advance_func->gpio_close_pre = &mraa_intel_galileo_gen2_gpio_close_pre;
339     advance_func->gpio_dir_pre = &mraa_intel_galileo_gen2_dir_pre;
340     advance_func->i2c_init_pre = &mraa_intel_galileo_gen2_i2c_init_pre;
341     advance_func->pwm_period_replace = &mraa_intel_galileo_gen2_pwm_period_replace;
342     advance_func->gpio_mode_replace = &mraa_intel_galileo_gen2_gpio_mode_replace;
343     advance_func->uart_init_pre = &mraa_intel_galileo_gen2_uart_init_pre;
344     advance_func->gpio_mmap_setup = &mraa_intel_galileo_g2_mmap_setup;
345
346     b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * MRAA_INTEL_GALILEO_GEN_2_PINCOUNT);
347     if (b->pins == NULL) {
348         goto error;
349     }
350
351     strncpy(b->pins[0].name, "IO0", 8);
352     b->pins[0].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 1, 0, 0, 0, 1 };
353     b->pins[0].gpio.pinmap = 11;
354     b->pins[0].gpio.parent_id = 0;
355     b->pins[0].gpio.mux_total = 0;
356     b->pins[0].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
357     b->pins[0].gpio.output_enable = 32;
358     b->pins[0].gpio.pullup_enable = 33;
359     b->pins[0].mmap.gpio.pinmap = 11;
360     strncpy(b->pins[0].mmap.mem_dev, "/dev/uio0", 12);
361     b->pins[0].mmap.gpio.mux_total = 2;
362     b->pins[0].mmap.gpio.mux[0].pin = 32;
363     b->pins[0].mmap.gpio.mux[0].value = 0;
364     b->pins[0].mmap.gpio.mux[1].pin = 11;
365     b->pins[0].mmap.gpio.mux[1].value = 0;
366     b->pins[0].mmap.mem_sz = 0x1000;
367     b->pins[0].mmap.bit_pos = 3;
368     b->pins[0].uart.parent_id = 0;
369     b->pins[0].uart.mux_total = 0;
370
371     strncpy(b->pins[1].name, "IO1", 8);
372     b->pins[1].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 1, 0, 0, 0, 1 };
373     b->pins[1].gpio.pinmap = 12;
374     b->pins[1].gpio.parent_id = 0;
375     b->pins[1].gpio.mux_total = 1;
376     b->pins[1].gpio.mux[0].pin = 45;
377     b->pins[1].gpio.mux[0].value = 0;
378     b->pins[1].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
379     b->pins[1].gpio.output_enable = 28;
380     b->pins[1].gpio.pullup_enable = 29;
381     b->pins[1].mmap.gpio.pinmap = 12;
382     strncpy(b->pins[1].mmap.mem_dev, "/dev/uio0", 12);
383     b->pins[1].mmap.gpio.mux_total = 3;
384     b->pins[1].mmap.gpio.mux[0].pin = 45;
385     b->pins[1].mmap.gpio.mux[0].value = 0;
386     b->pins[1].mmap.gpio.mux[1].pin = 28;
387     b->pins[1].mmap.gpio.mux[1].value = 0;
388     b->pins[1].mmap.gpio.mux[2].pin = 12;
389     b->pins[1].mmap.gpio.mux[2].value = 0;
390     b->pins[1].mmap.mem_sz = 0x1000;
391     b->pins[1].mmap.bit_pos = 4;
392     b->pins[1].uart.parent_id = 0;
393     b->pins[1].uart.mux_total = 1;
394     b->pins[1].uart.mux[0].pin = 45;
395     b->pins[1].uart.mux[0].value = 1;
396
397     strncpy(b->pins[2].name, "IO2", 8);
398     b->pins[2].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 1, 0, 0, 0 };
399     b->pins[2].gpio.pinmap = 13;
400     b->pins[2].gpio.parent_id = 0;
401     b->pins[2].gpio.mux_total = 1;
402     b->pins[2].gpio.mux[0].pin = 77;
403     b->pins[2].gpio.mux[0].value = 0;
404     b->pins[2].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
405     b->pins[2].gpio.output_enable = 34;
406     b->pins[2].gpio.pullup_enable = 35;
407     b->pins[2].mmap.gpio.pinmap = 13;
408     strncpy(b->pins[2].mmap.mem_dev, "/dev/uio0", 12);
409     b->pins[2].mmap.gpio.mux_total = 3;
410     b->pins[2].mmap.gpio.mux[0].pin = 77;
411     b->pins[2].mmap.gpio.mux[0].value = 0;
412     b->pins[2].mmap.gpio.mux[1].pin = 34;
413     b->pins[2].mmap.gpio.mux[1].value = 0;
414     b->pins[2].mmap.gpio.mux[2].pin = 13;
415     b->pins[2].mmap.gpio.mux[2].value = 0;
416     b->pins[2].mmap.mem_sz = 0x1000;
417     b->pins[2].mmap.bit_pos = 5;
418
419     strncpy(b->pins[3].name, "IO3", 8);
420     b->pins[3].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 1, 0, 0, 0 };
421     b->pins[3].gpio.pinmap = 14;
422     b->pins[3].gpio.parent_id = 0;
423     b->pins[3].gpio.mux_total = 2;
424     b->pins[3].gpio.mux[0].pin = 76;
425     b->pins[3].gpio.mux[0].value = 0;
426     b->pins[3].gpio.mux[1].pin = 64;
427     b->pins[3].gpio.mux[1].value = 0;
428     b->pins[3].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
429     b->pins[3].gpio.output_enable = 16;
430     b->pins[3].gpio.pullup_enable = 17;
431     b->pins[3].pwm.pinmap = 1;
432     b->pins[3].pwm.parent_id = 0;
433     b->pins[3].pwm.mux_total = 3;
434     b->pins[3].pwm.mux[0].pin = 76;
435     b->pins[3].pwm.mux[0].value = 0;
436     b->pins[3].pwm.mux[1].pin = 64;
437     b->pins[3].pwm.mux[1].value = 1;
438     b->pins[3].pwm.mux[2].pin = 16;
439     b->pins[3].pwm.mux[2].value = 0;
440     b->pins[3].mmap.gpio.pinmap = 14;
441     strncpy(b->pins[3].mmap.mem_dev, "/dev/uio0", 12);
442     b->pins[3].mmap.gpio.mux_total = 4;
443     b->pins[3].mmap.gpio.mux[0].pin = 76;
444     b->pins[3].mmap.gpio.mux[0].value = 0;
445     b->pins[3].mmap.gpio.mux[1].pin = 64;
446     b->pins[3].mmap.gpio.mux[1].value = 0;
447     b->pins[3].mmap.gpio.mux[2].pin = 16;
448     b->pins[3].mmap.gpio.mux[2].value = 0;
449     b->pins[3].mmap.gpio.mux[3].pin = 14;
450     b->pins[3].mmap.gpio.mux[3].value = 0;
451     b->pins[3].mmap.mem_sz = 0x1000;
452     b->pins[3].mmap.bit_pos = 6;
453
454     strncpy(b->pins[4].name, "IO4", 8);
455     b->pins[4].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
456     b->pins[4].gpio.pinmap = 6;
457     b->pins[4].gpio.parent_id = 0;
458     b->pins[4].gpio.mux_total = 0;
459     b->pins[4].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
460     b->pins[4].gpio.output_enable = 36;
461     b->pins[4].gpio.pullup_enable = 37;
462
463     strncpy(b->pins[5].name, "IO5", 8);
464     b->pins[5].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
465     b->pins[5].gpio.pinmap = 0;
466     b->pins[5].gpio.parent_id = 0;
467     b->pins[5].gpio.mux_total = 1;
468     b->pins[5].gpio.mux[0].pin = 66;
469     b->pins[5].gpio.mux[0].value = 0;
470     b->pins[5].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
471     b->pins[5].gpio.output_enable = 18;
472     b->pins[5].gpio.pullup_enable = 19;
473     b->pins[5].pwm.pinmap = 3;
474     b->pins[5].pwm.parent_id = 0;
475     b->pins[5].pwm.mux_total = 2;
476     b->pins[5].pwm.mux[0].pin = 66;
477     b->pins[5].pwm.mux[0].value = 1;
478     b->pins[5].pwm.mux[1].pin = 18;
479     b->pins[5].pwm.mux[1].value = 0;
480
481     strncpy(b->pins[6].name, "IO6", 8);
482     b->pins[6].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
483     b->pins[6].gpio.pinmap = 1;
484     b->pins[6].gpio.parent_id = 0;
485     b->pins[6].gpio.mux_total = 1;
486     b->pins[6].gpio.mux[0].pin = 68;
487     b->pins[6].gpio.mux[0].value = 0;
488     b->pins[6].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
489     b->pins[6].gpio.output_enable = 20;
490     b->pins[6].gpio.pullup_enable = 21;
491     b->pins[6].pwm.pinmap = 5;
492     b->pins[6].pwm.parent_id = 0;
493     b->pins[6].pwm.mux_total = 2;
494     b->pins[6].pwm.mux[0].pin = 68;
495     b->pins[6].pwm.mux[0].value = 1;
496     b->pins[6].pwm.mux[1].pin = 20;
497     b->pins[6].pwm.mux[1].value = 0;
498
499     strncpy(b->pins[7].name, "IO7", 8);
500     b->pins[7].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
501     b->pins[7].gpio.pinmap = 38;
502     b->pins[7].gpio.parent_id = 0;
503     b->pins[7].gpio.mux_total = 0;
504     b->pins[7].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
505     b->pins[7].gpio.pullup_enable = 39;
506
507     strncpy(b->pins[8].name, "IO8", 8);
508     b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0 };
509     b->pins[8].gpio.pinmap = 40;
510     b->pins[8].gpio.parent_id = 0;
511     b->pins[8].gpio.mux_total = 0;
512     b->pins[8].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
513     b->pins[8].gpio.pullup_enable = 41;
514
515     strncpy(b->pins[9].name, "IO9", 8);
516     b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0 };
517     b->pins[9].gpio.pinmap = 4;
518     b->pins[9].gpio.parent_id = 0;
519     b->pins[9].gpio.mux_total = 1;
520     b->pins[9].gpio.mux[0].pin = 70;
521     b->pins[9].gpio.mux[0].value = 0;
522     b->pins[9].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
523     b->pins[9].gpio.output_enable = 22;
524     b->pins[9].gpio.pullup_enable = 23;
525     b->pins[9].pwm.pinmap = 7;
526     b->pins[9].pwm.parent_id = 0;
527     b->pins[9].pwm.mux_total = 2;
528     b->pins[9].pwm.mux[0].pin = 70;
529     b->pins[9].pwm.mux[0].value = 1;
530     b->pins[9].pwm.mux[1].pin = 22;
531     b->pins[9].pwm.mux[1].value = 0;
532
533     strncpy(b->pins[10].name, "IO10", 8);
534     b->pins[10].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 1, 1, 0, 0 };
535     b->pins[10].gpio.pinmap = 10;
536     b->pins[10].gpio.parent_id = 0;
537     b->pins[10].gpio.mux_total = 1;
538     b->pins[10].gpio.mux[0].pin = 74;
539     b->pins[10].gpio.mux[0].value = 0;
540     b->pins[10].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
541     b->pins[10].gpio.output_enable = 26;
542     b->pins[10].gpio.pullup_enable = 27;
543     b->pins[10].pwm.pinmap = 11;
544     b->pins[10].pwm.parent_id = 0;
545     b->pins[10].pwm.mux_total = 2;
546     b->pins[10].pwm.mux[0].pin = 74;
547     b->pins[10].pwm.mux[0].value = 1;
548     b->pins[10].pwm.mux[1].pin = 26;
549     b->pins[10].pwm.mux[1].value = 0;
550     b->pins[10].mmap.gpio.pinmap = 10;
551     strncpy(b->pins[10].mmap.mem_dev, "/dev/uio0", 12);
552     b->pins[10].mmap.gpio.mux_total = 3;
553     b->pins[10].mmap.gpio.mux[0].pin = 74;
554     b->pins[10].mmap.gpio.mux[0].value = 0;
555     b->pins[10].mmap.gpio.mux[1].pin = 26;
556     b->pins[10].mmap.gpio.mux[1].value = 0;
557     b->pins[10].mmap.gpio.mux[2].pin = 10;
558     b->pins[10].mmap.gpio.mux[2].value = 0;
559     b->pins[10].mmap.mem_sz = 0x1000;
560     b->pins[10].mmap.bit_pos = 2;
561     b->pins[10].spi.parent_id = 1;
562     b->pins[10].spi.mux_total = 1;
563     b->pins[10].spi.mux[0].pin = 74;
564     b->pins[10].spi.mux[0].value = 0;
565
566     strncpy(b->pins[11].name, "IO11", 8);
567     b->pins[11].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 1, 0, 0 };
568     b->pins[11].gpio.pinmap = 5;
569     b->pins[11].gpio.parent_id = 0;
570     b->pins[11].gpio.mux_total = 2;
571     b->pins[11].gpio.mux[0].pin = 72;
572     b->pins[11].gpio.mux[0].value = 0;
573     b->pins[11].gpio.mux[1].pin = 44;
574     b->pins[11].gpio.mux[1].value = 0;
575     b->pins[11].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
576     b->pins[11].gpio.output_enable = 24;
577     b->pins[11].gpio.pullup_enable = 25;
578     b->pins[11].pwm.pinmap = 9;
579     b->pins[11].pwm.parent_id = 0;
580     b->pins[11].pwm.mux_total = 3;
581     b->pins[11].pwm.mux[0].pin = 72;
582     b->pins[11].pwm.mux[0].value = 1;
583     b->pins[11].pwm.mux[1].pin = 44;
584     b->pins[11].pwm.mux[1].value = 0;
585     b->pins[11].pwm.mux[2].pin = 24;
586     b->pins[11].pwm.mux[2].value = 0;
587     b->pins[11].spi.pinmap = 1;
588     b->pins[11].spi.mux_total = 3;
589     b->pins[11].spi.mux[0].pin = 72;
590     b->pins[11].spi.mux[0].value = 0;
591     b->pins[11].spi.mux[1].pin = 44;
592     b->pins[11].spi.mux[1].value = 1;
593     b->pins[11].spi.mux[2].pin = 24;
594     b->pins[11].spi.mux[2].value = 0;
595
596     strncpy(b->pins[12].name, "IO12", 8);
597     b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 1, 1, 0, 0 };
598     b->pins[12].gpio.pinmap = 15;
599     b->pins[12].gpio.parent_id = 0;
600     b->pins[12].gpio.mux_total = 0;
601     b->pins[12].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
602     b->pins[12].gpio.output_enable = 42;
603     b->pins[12].gpio.pullup_enable = 43;
604     b->pins[12].spi.pinmap = 1;
605     b->pins[12].spi.mux_total = 1;
606     b->pins[12].spi.mux[0].pin = 42;
607     b->pins[12].spi.mux[0].value = 1;
608     b->pins[12].mmap.gpio.pinmap = 15;
609     strncpy(b->pins[12].mmap.mem_dev, "/dev/uio0", 12);
610     b->pins[12].mmap.gpio.mux_total = 2;
611     b->pins[12].mmap.gpio.mux[0].pin = 42;
612     b->pins[12].mmap.gpio.mux[0].value = 0;
613     b->pins[12].mmap.gpio.mux[1].pin = 15;
614     b->pins[12].mmap.gpio.mux[1].value = 0;
615     b->pins[12].mmap.mem_sz = 0x1000;
616     b->pins[12].mmap.bit_pos = 7;
617
618     strncpy(b->pins[13].name, "IO13", 8);
619     b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0 };
620     b->pins[13].gpio.pinmap = 7;
621     b->pins[13].gpio.parent_id = 0;
622     b->pins[13].gpio.mux_total = 1;
623     b->pins[13].gpio.mux[0].pin = 46;
624     b->pins[13].gpio.mux[0].value = 0;
625     b->pins[13].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 1, 0, 1, 1 };
626     b->pins[13].gpio.output_enable = 30;
627     b->pins[13].gpio.pullup_enable = 31;
628     b->pins[13].spi.pinmap = 1;
629     b->pins[13].spi.mux_total = 2;
630     b->pins[13].spi.mux[0].pin = 46;
631     b->pins[13].spi.mux[0].value = 1;
632     b->pins[13].spi.mux[1].pin = 30;
633     b->pins[13].spi.mux[1].value = 0;
634
635     // ANALOG
636     strncpy(b->pins[14].name, "A0", 8);
637     b->pins[14].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1 };
638     b->pins[14].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
639     b->pins[14].gpio.pullup_enable = 49;
640     b->pins[14].aio.pinmap = 0;
641     b->pins[14].aio.mux_total = 1;
642     b->pins[14].aio.mux[0].pin = 49;
643     b->pins[14].aio.mux[0].value = 1;
644     b->pins[14].gpio.pinmap = 48;
645     b->pins[14].gpio.mux_total = 0;
646
647     strncpy(b->pins[15].name, "A1", 8);
648     b->pins[15].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1 };
649     b->pins[15].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
650     b->pins[15].gpio.pullup_enable = 51;
651     b->pins[15].aio.pinmap = 1;
652     b->pins[15].aio.mux[0].pin = 51;
653     b->pins[15].aio.mux[0].value = 1;
654     b->pins[15].aio.mux_total = 0;
655     b->pins[15].gpio.pinmap = 50;
656     b->pins[15].gpio.mux_total = 0;
657
658     strncpy(b->pins[16].name, "A2", 8);
659     b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1 };
660     b->pins[16].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
661     b->pins[16].gpio.pullup_enable = 53;
662     b->pins[16].aio.pinmap = 2;
663     b->pins[16].aio.mux_total = 1;
664     b->pins[16].aio.mux[0].pin = 53;
665     b->pins[16].aio.mux[0].value = 1;
666     b->pins[16].gpio.pinmap = 52;
667     b->pins[16].gpio.mux_total = 0;
668
669     strncpy(b->pins[17].name, "A3", 8);
670     b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 1 };
671     b->pins[17].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
672     b->pins[17].gpio.pullup_enable = 55;
673     b->pins[17].aio.pinmap = 3;
674     b->pins[17].aio.mux_total = 1;
675     b->pins[17].aio.mux[0].pin = 55;
676     b->pins[17].aio.mux[0].value = 1;
677     b->pins[17].gpio.pinmap = 54;
678     b->pins[17].gpio.mux_total = 0;
679
680     strncpy(b->pins[18].name, "A4", 8);
681     b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 1 };
682     b->pins[18].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
683     b->pins[18].gpio.pullup_enable = 57;
684     b->pins[18].i2c.pinmap = 1;
685     b->pins[18].i2c.mux_total = 1;
686     b->pins[18].i2c.mux[0].pin = 60;
687     b->pins[18].i2c.mux[0].value = 0;
688     b->pins[18].aio.pinmap = 4;
689     b->pins[18].aio.mux_total = 3;
690     b->pins[18].aio.mux[0].pin = 60;
691     b->pins[18].aio.mux[0].value = 1;
692     b->pins[18].aio.mux[1].pin = 78;
693     b->pins[18].aio.mux[1].value = 0;
694     b->pins[18].aio.mux[2].pin = 57;
695     b->pins[18].aio.mux[2].value = 0;
696     b->pins[18].gpio.pinmap = 56;
697     b->pins[18].gpio.mux_total = 2;
698     b->pins[18].gpio.mux[0].pin = 60;
699     b->pins[18].gpio.mux[0].value = 1;
700     b->pins[18].gpio.mux[1].pin = 78;
701     b->pins[18].gpio.mux[1].value = 1;
702
703     strncpy(b->pins[19].name, "A5", 8);
704     b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 1 };
705     b->pins[19].gpio.complex_cap = (mraa_pin_cap_complex_t){ 1, 0, 0, 1, 1 };
706     b->pins[19].gpio.pullup_enable = 59;
707     b->pins[19].i2c.pinmap = 1;
708     b->pins[19].i2c.mux_total = 1;
709     b->pins[19].i2c.mux[0].pin = 60;
710     b->pins[19].i2c.mux[0].value = 0;
711     b->pins[19].aio.pinmap = 5;
712     b->pins[19].aio.mux_total = 3;
713     b->pins[19].aio.mux[0].pin = 60;
714     b->pins[19].aio.mux[0].value = 1;
715     b->pins[19].aio.mux[1].pin = 79;
716     b->pins[19].aio.mux[1].value = 0;
717     b->pins[19].aio.mux[2].pin = 59;
718     b->pins[19].aio.mux[2].value = 1;
719     b->pins[19].gpio.pinmap = 58;
720     b->pins[19].gpio.mux_total = 2;
721     b->pins[19].gpio.mux[0].pin = 60;
722     b->pins[19].gpio.mux[0].value = 1;
723     b->pins[19].gpio.mux[1].pin = 79;
724     b->pins[19].gpio.mux[1].value = 1;
725
726     // BUS DEFINITIONS
727     b->i2c_bus_count = 1;
728     b->def_i2c_bus = 0;
729     b->i2c_bus[0].bus_id = 0;
730     b->i2c_bus[0].sda = 18;
731     b->i2c_bus[0].scl = 19;
732
733     b->spi_bus_count = 1;
734     b->def_spi_bus = 0;
735     b->spi_bus[0].bus_id = 1;
736     b->spi_bus[0].slave_s = 0;
737     b->spi_bus[0].cs = 10;
738     b->spi_bus[0].mosi = 11;
739     b->spi_bus[0].miso = 12;
740     b->spi_bus[0].sclk = 13;
741
742     b->uart_dev_count = 1;
743     b->def_uart_dev = 0;
744     b->uart_dev[0].rx = 0;
745     b->uart_dev[0].tx = 1;
746     b->uart_dev[0].device_path = "/dev/ttyS0";
747
748     return b;
749 error:
750     syslog(LOG_CRIT, "galileo2: Platform failed to initialise");
751     free(b);
752     return NULL;
753 }