1 /*
2  * Author: Brendan Le Foll <brendan.le.foll@intel.com>
3  * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
4  * Copyright © 2014 Intel Corporation
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22  * IN THE SOFTWARE.
23  */
24 
25 #pragma once
26 
27 #include <stdint.h>
28 #include "types.h"
29 
30 #define MRAA_PLATFORM_NAME_MAX_SIZE 64
31 #define MRAA_PIN_NAME_SIZE 12
32 
33 #define MRAA_SUB_PLATFORM_BIT_SHIFT 9
34 #define MRAA_SUB_PLATFORM_MASK (1<<MRAA_SUB_PLATFORM_BIT_SHIFT)
35 
36 #define MRAA_MAIN_PLATFORM_OFFSET 0
37 #define MRAA_SUB_PLATFORM_OFFSET 1
38 
39 /** Executes function func and returns its result in case of error
40  */
41 #define MRAA_RETURN_FOR_ERROR(func) do { \
42                                       mraa_result_t res; \
43                                       res = func; \
44                                       if (res != MRAA_SUCCESS) \
45                                       return res;} while(0)
46 
47 /** @file
48  *
49  * This file defines the basic shared values for libmraa
50  */
51 
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55 
56 /**
57  * MRAA boolean type
58  * 1 For TRUE
59  */
60 typedef unsigned int mraa_boolean_t;
61 
62 /**
63  * Initialise MRAA
64  *
65  * Detects running platform and attempts to use included pinmap, this is run on
66  * module/library init/load but is handy to rerun to check board initialised
67  * correctly. MRAA_SUCCESS inidicates correct (first time) initialisation
68  * whilst MRAA_ERROR_PLATFORM_ALREADY_INITIALISED indicates the board is
69  * already initialised correctly
70  *
71  * @return Result of operation
72  */
73 #if (defined SWIGPYTHON) || (defined SWIG)
74 mraa_result_t mraa_init();
75 #else
76 // this sets a compiler attribute (supported by GCC & clang) to have mraa_init()
77 // be called as a constructor make sure your libc supports this!  uclibc needs
78 // to be compiled with UCLIBC_CTOR_DTOR
79 mraa_result_t mraa_init() __attribute__((constructor));
80 #endif
81 
82 /**
83  * De-Initilise MRAA
84  *
85  * This is not a strict requirement but useful to test memory leaks and for
86  * people who like super clean code. If dynamically loading & unloading
87  * libmraa you need to call this before unloading the library.
88  */
89 void mraa_deinit();
90 
91 /**
92  * Checks if a pin is able to use the passed in mode.
93  *
94  * @param pin Physical Pin to be checked.
95  * @param mode the mode to be tested.
96  * @return boolean if the mode is supported, 0=false.
97  */
98 mraa_boolean_t mraa_pin_mode_test(int pin, mraa_pinmodes_t mode);
99 
100 /**
101  * Check the board's  bit size when reading the value
102  *
103  * @return raw bits being read from kernel module. zero if no ADC
104  */
105 unsigned int mraa_adc_raw_bits();
106 
107 /**
108  * Check the specified board's bit size when reading the value
109  *
110  * @param specified platform offset; 0 for main platform, 1 foor sub platform
111  * @return raw bits being read from kernel module. zero if no ADC
112  */
113 unsigned int mraa_get_platform_adc_raw_bits(uint8_t platform_offset);
114 
115 /**
116  * Return value that the raw value should be shifted to. Zero if no ADC
117  *
118  * @return return actual bit size the adc value should be understood as.
119  */
120 unsigned int mraa_adc_supported_bits();
121 
122 /**
123  * Return value that the raw value should be shifted to. Zero if no ADC
124  *
125  * @param specified platform offset; 0 for main platform, 1 foor sub platform
126  * @return return actual bit size the adc value should be understood as.
127  */
128 unsigned int mraa_get_platform_adc_supported_bits(int platform_offset);
129 
130 /**
131  * Sets the log level to use from 0-7 where 7 is very verbose. These are the
132  * syslog log levels, see syslog(3) for more information on the levels.
133  *
134  * @return Result of operation
135  */
136 mraa_result_t mraa_set_log_level(int level);
137 
138 /**
139  * Return the Platform's Name, If no platform detected return NULL
140  *
141  * @return platform name
142  */
143 const char* mraa_get_platform_name();
144 
145 /**
146  * Return the platform's versioning info, the information given depends per
147  * platform and can be NULL. platform_offset has to be given. Do not modify
148  * this pointer
149  *
150  * @param specified platform offset; 0 for main platform, 1 for sub platform
151  * @return platform's versioning string
152  */
153 const char* mraa_get_platform_version(int platform_offset);
154 
155 /**
156  * This function attempts to set the mraa process to a given priority and the
157  * scheduler to SCHED_RR. Highest * priority is typically 99 and minimum is 0.
158  * This function * will set to MAX if * priority is > MAX. Function will return
159  * -1 on failure.
160  *
161  * @param priority Value from typically 0 to 99
162  * @return The priority value set
163  */
164 int mraa_set_priority(const unsigned int priority);
165 
166 /** Get the version string of mraa autogenerated from git tag
167  *
168  * The version returned may not be what is expected however it is a reliable
169  * number associated with the git tag closest to that version at build time
170  *
171  * @return version string from version.h
172  */
173 const char* mraa_get_version();
174 
175 /**
176  * Print a textual representation of the mraa_result_t
177  *
178  * @param result the result to print
179  */
180 void mraa_result_print(mraa_result_t result);
181 
182 /**
183  * Get platform type, board must be initialised.
184  *
185  * @return mraa_platform_t Platform type enum
186  */
187 mraa_platform_t mraa_get_platform_type();
188 
189 /**
190  * Get combined platform type, board must be initialised.
191  * The combined type is represented as
192  * (sub_platform_type << 8) | main_platform_type
193  *
194  * @return int combined platform type
195  */
196 int mraa_get_platform_combined_type();
197 
198 /**
199  * Get platform pincount, board must be initialised.
200  *
201  * @return uint of physical pin count on the in-use platform
202  */
203 unsigned int mraa_get_pin_count();
204 
205 /**
206  * Get platform usable I2C bus count, board must be initialised.
207  *
208  * @return number f usable I2C bus count on the current platform. Function will
209  * return -1 on failure
210  */
211 int mraa_get_i2c_bus_count();
212 
213 /**
214  * Get I2C adapter number in sysfs.
215  *
216  * @param i2c_bus the logical I2C bus number
217  * @return I2C adapter number in sysfs. Function will return -1 on failure
218  */
219 int mraa_get_i2c_bus_id(unsigned int i2c_bus);
220 
221 /**
222  * Get specified platform pincount, board must be initialised.
223  *
224  * @param specified platform offset; 0 for main platform, 1 foor sub platform
225  * @return uint of physical pin count on the in-use platform
226  */
227 unsigned int mraa_get_platform_pin_count(uint8_t platform_offset);
228 
229 /**
230 * Get name of pin, board must be initialised.
231 *
232 * @param pin number
233 * @return char* of pin name
234 */
235 char* mraa_get_pin_name(int pin);
236 
237 /**
238  * Get default i2c bus, board must be initialised.
239  *
240  * @return int default i2c bus index
241  */
242 int mraa_get_default_i2c_bus(uint8_t platform_offset);
243 
244 /**
245  * Detect presence of sub platform.
246  *
247  * @return mraa_boolean_t 1 if sub platform is present and initialized, 0 otherwise
248  */
249 mraa_boolean_t mraa_has_sub_platform();
250 
251 
252 /**
253  * Check if pin or bus id includes sub platform mask.
254  *
255  * @param int pin or bus number
256  *
257  * @return mraa_boolean_t 1 if pin or bus is for sub platform, 0 otherwise
258  */
259 mraa_boolean_t mraa_is_sub_platform_id(int pin_or_bus_id);
260 
261 /**
262  * Convert pin or bus index to corresponding sub platform id.
263  *
264  * @param int pin or bus index
265  *
266  * @return int sub platform pin or bus number
267  */
268 int mraa_get_sub_platform_id(int pin_or_bus_index);
269 
270 /**
271  * Convert pin or bus sub platform id to index.
272  *
273  * @param int sub platform pin or bus id
274  *
275  * @return int pin or bus index
276  */
277 int mraa_get_sub_platform_index(int pin_or_bus_id);
278 
279 
280 
281 #ifdef __cplusplus
282 }
283 #endif
284