Home | History | Annotate | Download | only in include
      1 /*
      2  * Author: Thomas Ingleby <thomas.c.ingleby (at) intel.com>
      3  * Author: Brendan Le Foll <brendan.le.foll (at) 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 #pragma once
     27 
     28 #include "common.h"
     29 #include "mraa.h"
     30 #include "mraa_adv_func.h"
     31 #include "iio.h"
     32 
     33 // Bionic does not implement pthread cancellation API
     34 #ifndef __BIONIC__
     35 #define HAVE_PTHREAD_CANCEL
     36 #endif
     37 
     38 // general status failures for internal functions
     39 #define MRAA_PLATFORM_NO_INIT -3
     40 #define MRAA_IO_SETUP_FAILURE -2
     41 #define MRAA_NO_SUCH_IO -1
     42 
     43 /**
     44  * A structure representing a gpio pin.
     45  */
     46 struct _gpio {
     47     /*@{*/
     48     int pin; /**< the pin number, as known to the os. */
     49     int phy_pin; /**< pin passed to clean init. -1 none and raw*/
     50     int value_fp; /**< the file pointer to the value of the gpio */
     51     void (* isr)(void *); /**< the interupt service request */
     52     void *isr_args; /**< args return when interupt service request triggered */
     53     pthread_t thread_id; /**< the isr handler thread id */
     54     int isr_value_fp; /**< the isr file pointer on the value */
     55 #ifndef HAVE_PTHREAD_CANCEL
     56     int isr_control_pipe[2]; /**< a pipe used to interrupt the isr from polling the value fd*/
     57 #endif
     58     mraa_boolean_t isr_thread_terminating; /**< is the isr thread being terminated? */
     59     mraa_boolean_t owner; /**< If this context originally exported the pin */
     60     mraa_result_t (*mmap_write) (mraa_gpio_context dev, int value);
     61     int (*mmap_read) (mraa_gpio_context dev);
     62     mraa_adv_func_t* advance_func; /**< override function table */
     63     /*@}*/
     64 };
     65 
     66 /**
     67  * A structure representing a I2C bus
     68  */
     69 struct _i2c {
     70     /*@{*/
     71     int busnum; /**< the bus number of the /dev/i2c-* device */
     72     int fh; /**< the file handle to the /dev/i2c-* device */
     73     int addr; /**< the address of the i2c slave */
     74     unsigned long funcs; /**< /dev/i2c-* device capabilities as per https://www.kernel.org/doc/Documentation/i2c/functionality */
     75     void *handle; /**< generic handle for non-standard drivers that don't use file descriptors  */
     76     mraa_adv_func_t* advance_func; /**< override function table */
     77     /*@}*/
     78 };
     79 
     80 /**
     81  * A structure representing the SPI device
     82  */
     83 struct _spi {
     84     /*@{*/
     85     int devfd;          /**< File descriptor to SPI Device */
     86     uint32_t mode;      /**< Spi mode see spidev.h */
     87     int clock;          /**< clock to run transactions at */
     88     mraa_boolean_t lsb; /**< least significant bit mode */
     89     unsigned int bpw;   /**< Bits per word */
     90     mraa_adv_func_t* advance_func; /**< override function table */
     91     /*@}*/
     92 };
     93 
     94 /**
     95  * A structure representing a PWM pin
     96  */
     97 struct _pwm {
     98     /*@{*/
     99     int pin; /**< the pin number, as known to the os. */
    100     int chipid; /**< the chip id, which the pwm resides */
    101     int duty_fp; /**< File pointer to duty file */
    102     int period;  /**< Cache the period to speed up setting duty */
    103     mraa_boolean_t owner; /**< Owner of pwm context*/
    104     mraa_adv_func_t* advance_func; /**< override function table */
    105     /*@}*/
    106 };
    107 
    108 /**
    109  * A structure representing a Analog Input Channel
    110  */
    111 struct _aio {
    112     /*@{*/
    113     unsigned int channel; /**< the channel as on board and ADC module */
    114     int adc_in_fp; /**< File Pointer to raw sysfs */
    115     int value_bit; /**< 10 bits by default. Can be increased if board */
    116     mraa_adv_func_t* advance_func; /**< override function table */
    117     /*@}*/
    118 };
    119 
    120 /**
    121  * A structure representing a UART device
    122  */
    123 struct _uart {
    124     /*@{*/
    125     int index; /**< the uart index, as known to the os. */
    126     const char* path; /**< the uart device path. */
    127     int fd; /**< file descriptor for device. */
    128     mraa_adv_func_t* advance_func; /**< override function table */
    129     /*@}*/
    130 };
    131 
    132 /**
    133  * A structure representing an IIO device
    134  */
    135 struct _iio {
    136     int num; /**< IIO device number */
    137     char* name; /**< IIO device name */
    138     int fp; /**< IIO device in /dev */
    139     int fp_event;  /**<  event file descriptor for IIO device */
    140     void (* isr)(char* data); /**< the interupt service request */
    141     void *isr_args; /**< args return when interupt service request triggered */
    142     void (* isr_event)(struct iio_event_data* data, void* args); /**< the event interupt service request */
    143     int chan_num;
    144     pthread_t thread_id; /**< the isr handler thread id */
    145     mraa_iio_channel* channels;
    146     int event_num;
    147     mraa_iio_event* events;
    148     int datasize;
    149 };
    150 
    151 /**
    152  * A bitfield representing the capabilities of a pin.
    153  */
    154 typedef struct {
    155     /*@{*/
    156     mraa_boolean_t valid:1;     /**< Is the pin valid at all */
    157     mraa_boolean_t gpio:1;      /**< Is the pin gpio capable */
    158     mraa_boolean_t pwm:1;       /**< Is the pin pwm capable */
    159     mraa_boolean_t fast_gpio:1; /**< Is the pin fast gpio capable */
    160     mraa_boolean_t spi:1;       /**< Is the pin spi capable */
    161     mraa_boolean_t i2c:1;       /**< Is the pin i2c capable */
    162     mraa_boolean_t aio:1;       /**< Is the pin analog input capable */
    163     mraa_boolean_t uart:1;       /**< Is the pin uart capable */
    164     /*@}*/
    165 } mraa_pincapabilities_t;
    166 
    167 /**
    168  * A Structure representing a multiplexer and the required value
    169  */
    170 typedef struct {
    171     /*@{*/
    172     unsigned int pin;   /**< Raw GPIO pin id */
    173     unsigned int value; /**< Raw GPIO value */
    174     /*@}*/
    175 } mraa_mux_t;
    176 
    177 typedef struct {
    178     mraa_boolean_t complex_pin:1;
    179     mraa_boolean_t output_en:1;
    180     mraa_boolean_t output_en_high:1;
    181     mraa_boolean_t pullup_en:1;
    182     mraa_boolean_t pullup_en_hiz:1;
    183 } mraa_pin_cap_complex_t;
    184 
    185 typedef struct {
    186     /*@{*/
    187     unsigned int pinmap; /**< sysfs pin */
    188     unsigned int parent_id; /** parent chip id */
    189     unsigned int mux_total; /** Numfer of muxes needed for operation of pin */
    190     mraa_mux_t mux[6]; /** Array holding information about mux */
    191     unsigned int output_enable; /** Output Enable GPIO, for level shifting */
    192     unsigned int pullup_enable; /** Pull-Up enable GPIO, inputs */
    193     mraa_pin_cap_complex_t complex_cap;
    194     /*@}*/
    195 } mraa_pin_t;
    196 
    197 typedef struct {
    198     /*@{*/
    199     char mem_dev[32]; /**< Memory device to use /dev/uio0 etc */
    200     unsigned int mem_sz; /** Size of memory to map */
    201     unsigned int bit_pos; /** Position of value bit */
    202     mraa_pin_t gpio; /** GPio context containing none mmap info */
    203     /*@}*/
    204 } mraa_mmap_pin_t;
    205 
    206 /**
    207  * A Structure representing a physical Pin.
    208  */
    209 typedef struct {
    210     /*@{*/
    211     char name[MRAA_PIN_NAME_SIZE]; /**< Pin's real world name */
    212     mraa_pincapabilities_t capabilites; /**< Pin Capabiliites */
    213     mraa_pin_t gpio; /**< GPIO structure */
    214     mraa_pin_t pwm;  /**< PWM structure */
    215     mraa_pin_t aio;  /**< Anaglog Pin */
    216     mraa_mmap_pin_t mmap; /**< GPIO through memory */
    217     mraa_pin_t i2c;  /**< i2c bus/pin */
    218     mraa_pin_t spi;  /**< spi bus/pin */
    219     mraa_pin_t uart;  /**< uart module/pin */
    220     /*@}*/
    221 } mraa_pininfo_t;
    222 
    223 /**
    224  * A Structure representing the physical properties of a i2c bus.
    225  */
    226 typedef struct {
    227     /*@{*/
    228     unsigned int bus_id; /**< ID as exposed in the system */
    229     unsigned int scl; /**< i2c SCL */
    230     unsigned int sda; /**< i2c SDA */
    231     // mraa_drv_api_t drv_type; /**< Driver type */
    232     /*@}*/
    233 } mraa_i2c_bus_t;
    234 
    235 /**
    236  * A Structure representing the physical properties of a spi bus.
    237  */
    238 typedef struct {
    239     /*@{*/
    240     unsigned int bus_id; /**< The Bus ID as exposed to the system. */
    241     unsigned int slave_s; /**< Slave select */
    242     mraa_boolean_t three_wire; /**< Is the bus only a three wire system */
    243     unsigned int sclk; /**< Serial Clock */
    244     unsigned int mosi; /**< Master Out, Slave In. */
    245     unsigned int miso; /**< Master In, Slave Out. */
    246     unsigned int cs; /**< Chip Select, used when the board is a spi slave */
    247     /*@}*/
    248 } mraa_spi_bus_t;
    249 
    250 /**
    251  * A Structure representing a uart device.
    252  */
    253 typedef struct {
    254     /*@{*/
    255     unsigned int index; /**< ID as exposed in the system */
    256     int rx; /**< uart rx */
    257     int tx; /**< uart tx */
    258     const char* device_path; /**< To store "/dev/ttyS1" for example */
    259     /*@}*/
    260 } mraa_uart_dev_t;
    261 
    262 /**
    263  * A Structure representing a platform/board.
    264  */
    265 
    266 typedef struct _board_t {
    267     /*@{*/
    268     unsigned int phy_pin_count; /**< The Total IO pins on board */
    269     unsigned int gpio_count; /**< GPIO Count */
    270     unsigned int aio_count;  /**< Analog side Count */
    271     unsigned int i2c_bus_count; /**< Usable i2c Count */
    272     mraa_i2c_bus_t  i2c_bus[12]; /**< Array of i2c */
    273     unsigned int def_i2c_bus; /**< Position in array of default i2c bus */
    274     unsigned int spi_bus_count; /**< Usable spi Count */
    275     mraa_spi_bus_t spi_bus[12];       /**< Array of spi */
    276     unsigned int def_spi_bus; /**< Position in array of defult spi bus */
    277     unsigned int adc_raw; /**< ADC raw bit value */
    278     unsigned int adc_supported; /**< ADC supported bit value */
    279     unsigned int def_uart_dev; /**< Position in array of defult uart */
    280     unsigned int uart_dev_count; /**< Usable spi Count */
    281     mraa_uart_dev_t uart_dev[6]; /**< Array of UARTs */
    282     mraa_boolean_t no_bus_mux; /**< i2c/spi/adc/pwm/uart bus muxing setup not required */
    283     int pwm_default_period; /**< The default PWM period is US */
    284     int pwm_max_period; /**< Maximum period in us */
    285     int pwm_min_period; /**< Minimum period in us */
    286     mraa_platform_t platform_type; /**< Platform type */
    287     const char* platform_name; /**< Platform Name pointer */
    288     const char* platform_version; /**< Platform versioning info */
    289     mraa_pininfo_t* pins;     /**< Pointer to pin array */
    290     mraa_adv_func_t* adv_func;    /**< Pointer to advanced function disptach table */
    291     struct _board_t* sub_platform;     /**< Pointer to sub platform */
    292     /*@}*/
    293 } mraa_board_t;
    294 
    295 typedef struct {
    296     struct _iio* iio_devices; /**< Pointer to IIO devices */
    297     uint8_t iio_device_count; /**< IIO device count */
    298 } mraa_iio_info_t;
    299