/*
 * Copyright (c) 2015-2016, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*!*****************************************************************************
 *  @file       PIN.h
 *  @brief      Generic PIN & GPIO driver
 *
 *  To use the PIN driver ensure that the correct TI-RTOS driver library for your
 *  device is linked in and include this header file:
 *    @code
 *    #include <ti/drivers/PIN.h>
 *    @endcode
 *
 *  In order to use device-specific functionality or to use the size/speed-
 *  optimized versions of some of the PIN driver functions that circumvent error
 *  and resource checking, link in the correct TI-RTOS driver library for your
 *  device and include the device-specific PIN driver header file (which in turn
 *  includes PIN.h). As an example for the CC26xx family of devices:
 *    @code
 *    #include <ti/drivers/pin/PINCC26xx.h>
 *    @endcode
 *
 *  # Overview #
 *  The PIN driver allows clients (applications or other drivers) to allocate
 *  and control the I/O pins on the device. The pins can either be software-
 *  controlled general-purpose I/O (GPIO) or connected to hardware peripherals.
 *  Furthermore, the PIN driver allows clients to configure interrupt
 *  functionality on the pins to receive callbacks (and potentially wake up from
 *  the standby or idle power modes) on configurable signal edges.
 *
 *  Most other drivers rely on functionality in the PIN driver.
 *
 *  ## Structure ##
 *  In order to provide a generic driver interface, this file (PIN.h) only
 *  defines the API and some common data types and macros of the driver. A PIN
 *  client (application or driver) can in most cases only use the generic PIN
 *  API, however, for more advanced usage where device-specific pin
 *  configuration is used or device-specific PIN driver API extensions are
 *  used must use the device-specific PIN driver API.
 *
 *  The device-independent API is implemented as function calls with pin
 *  access control based on the PIN client handle. For time-critical
 *  applications the device-specific API can be used directly, as these
 *  API functions are implemented as inlined functions without access control.
 *
 *  ## Functionality ##
 *  The PIN module provides the following functionality:
 *  - Initialize I/O pins upon boot to a default configuration (possibly
 *    user-generated)
 *  - Provides atomic manipulation of I/O pin hardware registers to allow safe
 *    simultaneous use of I/O pin resources
 *  - I/O pin allocation
 *    - A set of pins can be allocated receiving a pin set handle.
 *      Typically each peripheral driver will allocate a set of pins and an
 *      application must allocate the pins it uses too
 *    - When a pin set is deallocated all the pins in it revert to the state
 *      they were initialized to at boot
 *  - General-purpose I/O (GPIO) services
 *    - Read input buffer value
 *    - Read and set output buffer value
 *    - Read and set output buffer enable
 *    - Access as single pin or port (muliple pins simultaneously)
 *  - Protect pin manipulation
 *    - Pins in an allocated set can only be manipulated using the corresponding
 *      handle.
 *    - No handle is needed to read input and output buffer values
 *  - I/O buffer/driver control
 *    - Input mode (detached, hysteresis, pull-up, pull-down)
 *    - Output mode (tristated, push-pull, open drain, open source)
 *    - Output driver strength control
 *    - Output driver slew rate control
 *  - I/O source/target selection (device-specific driver only)
 *    - Map pin to GPIO, peripheral or HW observation signal
 *  - Configuration of I/O interrupt and wakeup from standby
 *    - Interrupt configuration: signal edge to interrupt on, interrupt mask,
 *      callback function registration
 *    - Pins that have enabled interrupts will also wake up the device from low-
 *      power modes like standby and idle upon events
 *  - Provides data types and enums/defines for use in pin configurations
 *    definitions in board files, drivers and applications
 *
 *  ## Pin Allocation ##
 *  The purpose of being able to allocate pins to a pin set is to:
 *  - Manage pin resources
 *  - Give exclusive, protected access to these pins
 *  - Establish a driver state in connection with these pins that allow
 *    functionality such as I/O interrupt callback and I/O port operations
 *    in a safe manner
 *
 *  | API function       | Description                                          |
 *  |--------------------|------------------------------------------------------|
 *  | PIN_open()         | Allocate pins to a set, returns handle               |
 *  | PIN_add()          | Add pin to pin set for open PIN handle               |
 *  | PIN_remove()       | Removes pin from pin set for open PIN handle         |
 *  | PIN_close()        | Deallocate pin set, revert to original GPIO state    |
 *
 *  ## GPIO ##
 *  Pins that are to be used as software-controlled general-purpose I/O (GPIO)
 *  need to be allocated in the same manner as for pins that will be mapped to
 *  hardware peripheral ports. A pin set requested with a PIN_open() call may
 *  contain a mix of pins to be used for GPIO and hardware-mapped pins.
 *
 *  When a pin is deallocated using PIN_close() it reverts to the GPIO
 *  configuration it was given in the initial call to PIN_init().
 *
 *  | API function         | Description                                       |
 *  |----------------------|---------------------------------------------------|
 *  | PIN_init()           | Initialize I/O pins to a safe GPIO state          |
 *  | PIN_open()           | Allocate pins to a set, returns handle            |
 *  | PIN_close()          | Deallocate pin set, revert to original GPIO state |
 *  | PIN_setConfig()      | Sets parts of or complete pin configuration       |
 *  | PIN_getConfig()      | Returns pin configuration                         |
 *  | PIN_setOutputEnable()| Control output enable of GPIO pin                 |
 *  | PIN_getInputValue()  | Read input value on pin                           |
 *  | PIN_setOutputValue() | Set output value of GPIO pin                      |
 *  | PIN_getOutputValue() | Get current output value of GPIO pin              |
 *
 *  ## GPIO Ports ##
 *  Sometimes it is necessary to be able to read from, write to or control
 *  multiple pins simultaneously (in time). The PIN driver allows a set of
 *  allocated pins, if they reside on the same GPIO port in the underlying
 *  hardware, to be manipulated simultaneously.
 *
 *  | API function             | Description                                       |
 *  |--------------------------|---------------------------------------------------|
 *  | PIN_open()               | Allocate pins to a set, returns handle            |
 *  | PIN_close()              | Deallocate pin set, revert to original GPIO state |
 *  | PIN_getPortMask()        | Returns bitmask for allocated pins in GPIO port   |
 *  | PIN_getPortInputValue()  | Returns input value of whole GPIO port            |
 *  | PIN_setPortOutputValue() | Sets output value of whole GPIO port (masked)     |
 *  | PIN_getPortOutputValue() | Get current output value of whole GPIO port       |
 *  | PIN_setPortOutputValue() | Sets output value of whole GPIO port (masked)     |
 *  | PIN_setPortOutputEnable()| Sets output enable of whole GPIO port (masked)    |
 *
 *  ## I/O Pin Configuration ##
 *  Different devices provide different levels of configurability of I/O pins.
 *  The PIN driver provides a fairly extensive set of @ref PIN_GENERIC_FLAGS
 *  "generic IO configuration options" that are device-independent, all of which
 *  might not be supported by the underlying device-specific PIN driver and
 *  hardware. Likewise, the underlying device-specific PIN driver and hardware
 *  might support additional configuration options not covered by the generic
 *  options.
 *
 *  To allow both independence from and flexibility to use features on the target
 *  device, the #PIN_Config entries used by the PIN driver allows use of either
 *  a set of @ref PIN_GENERIC_FLAGS "generic PIN configuration options" or a
 *  device-specific set of PIN configuration options defined in the underlying
 *  device-specific PIN driver (e.g. PINCC26XX.h)
 *
 *  ### Mapping to GPIO or Peripheral ###
 *  Since the amount of flexibilty in which peripherals can be mapped to which
 *  pins and the manner in which this needs to be set up is highly
 *  device-specific, functions for configuring this is not part of the generic
 *  PIN driver API but is left to be implemented by device-specific PIN drivers.
 *  See the relevant device-specific PIN driver (e.g. PINCC26XX.h) for details.
 *
 *  ### Input Mode ###
 *  The input mode of a pin controls:
 *  - Input buffer enable
 *  - Pull-ups or pull-downs
 *  - Hysteresis of input buffer
 *  - Inversion of logical input level
 *  - Potentially, device-specific options
 *  The input mode is set initially with PIN_init() or at a later stage with
 *  PIN_setConfig() and a bitmask with the relevant options
 *
 *  | API function     | Description                                           |
 *  |------------------|-------------------------------------------------------|
 *  | PIN_init()       | Initialize IOs to a safe GPIO state                   |
 *  | PIN_getConfig()  | Returns pin configuration                             |
 *  | PIN_setConfig()  | Sets parts of or complete pin configuration           |
 *
 *  ### Output Mode ###
 *  The output mode of a pin controls:
 *  - Output buffer enable
 *  - Output driver mode (push-pull, open-drain, open-source)
 *  - Output driver slew control
 *  - Output driver current (drive strength)
 *  - Inversion of logical output level
 *  - Potentially, device-specific options
 *
 *  | API function         | Description                                       |
 *  |----------------------|---------------------------------------------------|
 *  | PIN_init()           | Initialize IOs to a safe GPIO state               |
 *  | PIN_setOutputEnable()| Control output enable of GPIO pins                      |
 *  | PIN_getConfig()      | Returns pin configuration                         |
 *  | PIN_setConfig()      | Sets parts of or complete pin configuration       |
 *
 *  ### Pin Interrupt and Pin Wakeup ###
 *  Pin interrupts are used to process asynchronous signal edge events on pins
 *  and potentially wake the device up from low power sleep modes. To use pin
 *  interrupts the relevant pins must be allocated and a interrupt callback
 *  registered by the client. The callback function will be called in a SWI
 *  context.
 *
 *  | API function        | Description                                        |
 *  |---------------------|----------------------------------------------------|
 *  | PIN_init()          | Initialize IOs to a safe GPIO state                |
 *  | PIN_getConfig()     | Returns pin configuration                          |
 *  | PIN_setConfig()     | Sets parts of or complete pin configuration        |
 *  | PIN_setInterrupt()  | Control interrupt enable and edge for pin          |
 *  | PIN_registerIntCb() | Register callback function for a set of pins       |
 *  | PIN_setUserArg()    | Sets a user argument associated with the handle    |
 *  | PIN_getUserArg()    | Gets a user argument associated with the handle    |
 *
 *  ## PIN Data Types ##
 *  The PIN driver defines the following data types:
 *  - #PIN_Id: identifies a pin in arguments or lists
 *  - #PIN_Config: provides I/O configuration options for a pin and also embeds
 *    a #PIN_Id identifier. See @ref PIN_GENERIC_FLAGS "available flags/fields"
 *
 *  ## PIN Config Flags/Fields and Bitmasks ##
 *  The PIN driver uses the #PIN_Config data type many places and it merits some
 *  additional attention. A #PIN_Config value consists of a collection of flags
 *  and fields that define how an I/O pin and its attached GPIO interface should
 *  behave electrically and logically. In addition a #PIN_Config value also
 *  embeds a #PIN_Id pin ID, identifying which pin it refers to.
 *
 *  A #PIN_Config value can use one of two mutually exclusive sets of flags and
 *  fields: @ref PIN_GENERIC_FLAGS "device-independent options" defined in
 *  PIN.h or device-dependent options defined in the device-specific
 *  implementation of the PIN driver interface. Any function that uses
 *  #PIN_Config will accept both option types, just not at the same time.
 *  PIN_getConfig() always returns device-independent options, an additional
 *  device-specific version (e.g. PINCC26XX_getConfig()) might return
 *  device-specific options.
 *
 *  The bitmask argument for PIN_setConfig() decides which of the options the
 *  call should affect. All other options are kept at their current values in
 *  hardware. Thus PIN_setConfig(hPins, PIN_BM_PULLING, PIN_BM_PULLUP) will only
 *  change the pullup/pulldown configuration of the pin, leaving everything
 *  else, such as for instance output enable, input hysteresis or output value,
 *  untouched. For #PIN_Config lists (as supplied to PIN_init() for instance)
 *  there is no mask, so all options will affect the pin.
 *
 *  Some of the options affect the pin regardless of whether it is mapped to
 *  a hardware peripheral or GPIO and some options only take effect when it is
 *  mapped to GPIO. These latter options have \_GPIO_ in their names.
 *
 *  The default value for a flag/field is indicated with a star (*) in the
 *  description of the options and will be applied if any explicit value is
 *  not supplied for a flag/field that is masked.
 *
 *  The available options can be grouped into categories as follows:
 *
 *  ### Input Mode Options ###
 *  | Option             | Option bitmask        | HW/GPIO | Description                    |
 *  |--------------------|-----------------------|---------|--------------------------------|
 *  |#PIN_INPUT_EN (*)   |#PIN_BM_INPUT_EN       | Both    | Enable pin input buffer        |
 *  |#PIN_INPUT_DIS      |#PIN_BM_INPUT_EN       | Both    | Disable pin input buffer       |
 *  |#PIN_HYSTERESIS     |#PIN_BM_HYSTERESIS     | Both    | Enable hysteresis on input     |
 *  |#PIN_NOPULL (*)     |#PIN_BM_PULLING        | Both    | No pullup/pulldown             |
 *  |#PIN_PULLUP         |#PIN_BM_PULLING        | Both    | Enable pullup                  |
 *  |#PIN_PULLDOWN       |#PIN_BM_PULLING        | Both    | Enable pulldown                |
 *  |                    |#PIN_BM_INPUT_MODE     |         | Mask for all input mode options|
 *
 *  ### Output Mode Options ###
 *  | Option             | Option bitmask             | HW/GPIO | Description                      |
 *  |------------------------|------------------------|---------|----------------------------------|
 *  |#PIN_GPIO_OUTPUT_DIS (*)|#PIN_BM_GPIO_OUTPUT_EN  | GPIO    | Disable GPIO output buffer       |
 *  |#PIN_GPIO_OUTPUT_EN     |#PIN_BM_GPIO_OUTPUT_EN  | GPIO    | Enable GPIO output buffer        |
 *  |#PIN_GPIO_LOW (*)       |#PIN_BM_GPIO_OUTPUT_VAL | GPIO    | Output 0 when GPIO               |
 *  |#PIN_GPIO_HIGH          |#PIN_BM_GPIO_OUTPUT_VAL | GPIO    | Output 1 when GPIO               |
 *  |#PIN_PUSHPULL (*)       |#PIN_BM_OUTPUT_BUF      | Both    | Use push-pull output buffer      |
 *  |#PIN_OPENDRAIN          |#PIN_BM_OUTPUT_BUF      | Both    | Use open drain output buffer     |
 *  |#PIN_OPENSOURCE         |#PIN_BM_OUTPUT_BUF      | Both    | Use open source output buffer    |
 *  |#PIN_SLEWCTRL           |#PIN_BM_SLEWCTRL        | Both    | Enable output buffer slew control|
 *  |#PIN_DRVSTR_MIN (*)     |#PIN_BM_DRVSTR          | Both    | Output buffer uses min drive     |
 *  |#PIN_DRVSTR_MED         |#PIN_BM_DRVSTR          | Both    | Output buffer uses medium drive  |
 *  |#PIN_DRVSTR_MAX         |#PIN_BM_DRVSTR          | Both    | Output buffer uses max drive     |
 *  |                        |#PIN_BM_OUTPUT_MODE     |         | Mask for all output mode options |
 *
  *  ### Misc Options ###
 *  | Option            | Option bitmask   | HW/GPIO | Description                      |
 *  |-------------------|------------------|---------|----------------------------------|
 *  |#PIN_INV_INOUT     |#PIN_BM_INV_INOUT | Both    | Invert input/output              |
 *  |#PIN_IRQ_DIS (*)   |#PIN_BM_IRQ       | Both    | Disable pin interrupts           |
 *  |#PIN_IRQ_NEGEDGE   |#PIN_BM_IRQ       | Both    | Pin interrupts on negative edges |
 *  |#PIN_IRQ_POSEDGE   |#PIN_BM_IRQ       | Both    | Pin interrupts on negative edges |
 *  |#PIN_IRQ_BOTHEDGES |#PIN_BM_IRQ       | Both    | Pin interrupts on both edges     |
 *  |                   |#PIN_BM_ALL       |         | Mask for *all* options           |
 *
 *  ## Initialization ##
 *  The PIN driver must be initialized before any other drivers are initialized.
 *  In order for IO pins to get a safe value as soon as possible PIN_init()
 *  should be called as early as possible in the boot sequence. Typically,
 *  PIN_init() is called at the start of main() before TI-RTOS is started with
 *  BIOS_start().
 *
 *  PIN_init() takes as an argument a #PIN_Config list containing default pin
 *  configurations. Typically the #PIN_Config list defined in the board files
 *  is used:
 *  @code
 *  PIN_init(BoardGpioInitTable);
 *  @endcode
 *  It is possible, however, to use another #PIN_Config list if desired.
 *
 *  ## Power Management Interaction ##
 *  No specific interaction with power management module, as PIN is independent
 *  of power mode.
 *
 *  ## Functionality Not Supported ##
 *  There is no known unsupported functionality.
 *
 *  ## Instrumentation ##
 *  The pin driver does not use any of the instrumentation facilities.
 *
 *  # Usage Examples #
 *
 *  ## Initialization and Pin Allocation ##
 *  Example that illustrates when and how to call PIN_init(), PIN_open(), PIN_add(), PIN_close()
 *    @code
 *    // Default pin configuration. Typically resides in Board.c file.
 *    // IOs not mentioned here configured to default: input/output/pull disabled
 *    PIN_Config BoardGpioInitTable[] = {
 *        // DIO11: LED A (initially off)
 *        PIN_ID(11) | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
 *        // DIO10: LED B (initially off)
 *        PIN_ID(10)  | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
 *        // DIO23: BUTTON A (ensure pull-up as button A is also used by other ICs)
 *        PIN_ID(23) | PIN_INPUT_EN  | PIN_PULLUP | PIN_HYSTERESIS,
 *        // DIO3: LCD controller reset line (make sure LCD is in reset)
 *        PIN_ID(3)  | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
 *        // Terminate list
 *        PIN_TERMINATE
 *    };
 *
 *    Task_Struct taskStart;
 *    uint8_t     taskStartStack[512];
 *
 *    // PIN_init() should be called as early as possible in boot
 *    void main() {
 *        // Default initialization of IO
 *        PIN_init(BoardGpioInitTable);
 *
 *        // Configure startup task
 *        Task_Params taskParams;
 *        Task_Params_init(&taskParams);
 *        taskParams.stack = taskStartStack;
 *        taskParams.stackSize = sizeof(taskStartStack);
 *        Task_construct(&taskStart, taskStartFxn, &taskParams, NULL);
 *
 *        // Start kernel (never returns)
 *        BIOS_start();
 *    }
 *
 *    // Human user interface PIN state/handle
 *    PIN_State  hStateHui;
 *    #define HUI_LED_A     PIN_ID(11)
 *    #define HUI_LED_B     PIN_ID(10)
 *    #define HUI_LED_C     PIN_ID(9)
 *    #define HUI_BUTTON_A  PIN_ID(23)
 *    #define HUI_BUTTON_B  PIN_ID(24)
 *
 *    static void taskStartFxn(UArg a0, UArg a1) {
 *        // Define pins used by Human user interface and initial configuration
 *        const PIN_Config aPinListHui[] = {
 *            HUI_LED_A    | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
 *            HUI_LED_B    | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
 *            HUI_BUTTON_A | PIN_INPUT_EN  | PIN_PULLUP | PIN_HYSTERESIS,
 *            HUI_BUTTON_B | PIN_INPUT_EN  | PIN_PULLUP | PIN_HYSTERESIS,
 *            PIN_TERMINATE
 *        };
 *
 *        // Get handle to this collection of pins
 *        if (!PIN_open(&hStateHui, aPinListHui)) {
 *            // Handle allocation error
 *        }
 *
 *        // ...
 *
 *        // We can also add (and remove) pins to a set at run time
 *        PIN_Status status = PIN_add(
 *          &hStateHui,
 *          HUI_LED_C | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
 *        );
 *        if (status != PIN_SUCCESS) {
 *            // Handling allocation error is especially important with PIN_add()
 *        }
 *
 *        // ...
 *        huiDoSomething();
 *
 *        // Before ending task, make sure to deallocate pins. They will return
 *        // to the default configurations provided in PIN_init()
 *        PIN_close(&hStateHui);
 *    }
 *    @endcode
 *
 *  ## Application use of GPIO ##
 *  An example of using GPIO that builds on the previous example. Illustrates how
 *  to read input values, set output values and control output enable
 *    @code
 *    void huiDoSomething() {
 *        // Running lights on LEDs A-B-C (left to right). Button A causes left
 *        // movement, button B causes right movement, both simultaneously aborts
 *        // and disables LED output drivers
 *
 *        // LED initial state (A off, B off, C on). Only our outputs are affected
 *        PIN_setPortOutputValue(&hStateHui, (1<<HUI_LED_C));
 *
 *        int32_t moveDir = -1;    // <0: left, 0: stop, >0 right
 *        while (moveDir) {
 *            // Update LEDs
 *            if (moveDir<0) {
 *                // Left movement
 *                uint32_t t = PIN_getOutputValue(HUI_LED_A);
 *                PIN_setOutputValue(&hStateHui, HUI_LED_A, PIN_getOutputValue(HUI_LED_B));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_B, PIN_getOutputValue(HUI_LED_C));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_C, t);
 *            } else {
 *                // Right movement
 *                uint32_t t = PIN_getOutputValue(HUI_LED_C);
 *                PIN_setOutputValue(&hStateHui, HUI_LED_C, PIN_getOutputValue(HUI_LED_B));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_B, PIN_getOutputValue(HUI_LED_A));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_A, t);
 *            }
 *
 *            // Sleep for 333 ms
 *            Task_sleep(333000/10);
 *
 *            // Read input from both buttons simultaneously
 *            uint32_t buttons = PIN_getPortInputValue(&hStateHui);
 *            if (buttons&(1<<HUI_BUTTON_A) == 0) {
 *                moveDir = -1;
 *            } else if (buttons&(1<<HUI_BUTTON_A) == 0) {
 *                 moveDir = 1;
 *            } else if (buttons&((1<<HUI_BUTTON_A)|(1<<HUI_BUTTON_A))) {
 *                moveDir = 0;
 *            }
 *        }
 *        // Disable output enable for all pins (only our pins affected)
 *        PIN_setPortOutputEnable(&hStateHui, 0);
 *    }
 *    @endcode
 *
 *  ## Pin Interrupt ##
 *  An example that handles pin inputs in the GPIO example above using PIN interrupts
 *  instead:
 *    @code
 *    // volatile variable used to communicate between callback and task
 *    static volatile int32_t moveDir = -1;    // <0: left, 0: stop, >0 right
 *
 *    // Pin interrupt callback
 *    void huiPinIntCb(PIN_Handle handle, PIN_Id pinId) {
 *        // Ignore pinId and read input from both buttons simultaneously
 *        uint32_t buttons = PIN_getPortInputValue(&hStateHui);
 *        if (buttons&(1<<HUI_BUTTON_A) == 0) {
 *            moveDir = -1;
 *        } else if (buttons&(1<<HUI_BUTTON_A) == 0) {
 *             moveDir = 1;
 *        } else if (buttons&((1<<HUI_BUTTON_A)|(1<<HUI_BUTTON_A))) {
 *            moveDir = 0;
 *        }
 *    }
 *
 *    void huiDoSomething() {
 *        // Running lights on LEDs A-B-C (left to right). Button A causes left
 *        // movement, button B causes right movement, both simultaneously aborts
 *        // and disables LED output drivers
 *
 *        // LED initial state (A off, B off, C on). Only our outputs are affected
 *        PIN_setPortOutputValue(&hStateHui, (1<<HUI_LED_C));
 *        moveDir = -1;    // <0: left, 0: stop, >0 right
 *
 *        // Setup pin interrupts and register callback
 *        PIN_registerIntCb(&hStateHui, huiPinIntCb);
 *        PIN_setInterrupt(&hStateHui, HUI_BUTTON_A | PIN_IRQ_NEGEDGE);
 *        PIN_setInterrupt(&hStateHui, HUI_BUTTON_B | PIN_IRQ_NEGEDGE);
 *
 *        while (moveDir) {
 *            // Update LEDs
 *            if (moveDir<0) {
 *                // Left movement
 *                uint32_t t = PIN_getOutputValue(HUI_LED_A);
 *                PIN_setOutputValue(&hStateHui, HUI_LED_A, PIN_getOutputValue(HUI_LED_B));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_B, PIN_getOutputValue(HUI_LED_C));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_C, t);
 *            } else {
 *                // Right movement
 *                uint32_t t = PIN_getOutputValue(HUI_LED_C);
 *                PIN_setOutputValue(&hStateHui, HUI_LED_C, PIN_getOutputValue(HUI_LED_B));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_B, PIN_getOutputValue(HUI_LED_A));
 *                PIN_setOutputValue(&hStateHui, HUI_LED_A, t);
 *            }
 *
 *            // Sleep for 333 ms (we will likely go into standby)
 *            Task_sleep(333000/10);
 *        }
 *        // Disable output enable for all pins (only our pins affected)
 *        PIN_setPortOutputEnable(&hStateHui, 0);
 *        // Disable pin interrupts
 *        PIN_setInterrupt(&hStateHui, HUI_BUTTON_A | PIN_IRQ_DIS);
 *        PIN_setInterrupt(&hStateHui, HUI_BUTTON_B | PIN_IRQ_DIS);
 *    }
 *    @endcode
 *
 *******************************************************************************
 */

#ifndef ti_drivers_PIN__include
#define ti_drivers_PIN__include
#ifdef __cplusplus
extern "C" {
#endif

#include <xdc/std.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
//#include <inc/hw_types.h>

typedef unsigned int uint_t;
typedef int int_t;


/** @brief  Pin identifier data type
 *
 *  Data type used to identify a pin through an index between 0 to 254.
 *  Typically the index does not refer to the physical device pin number but
 *  rather to the index of the subset of pins that are under software-control
 *  (e.g. index 3 refers to DIO3).
 *  This data type is used as arguments in API functions to identify which pin
 *  is affected or used in lists (terminated by #PIN_TERMINATE entry) identifying
 *  multiple pins
 *  @sa PIN_ID
 */
typedef uint8_t PIN_Id;

/// Pin ID used to indicate no pin
#define PIN_UNASSIGNED              0xFF
/// Pin ID used to terminate a list of PIN_Id or PIN_Config entries
#define PIN_TERMINATE               0xFE

/** @brief  Pin configuration data type with embedded pin identifier
 *
 *  A data type used to specify I/O-pin configuration options. The lower 8b
 *  contain an embedded pin ID (see #PIN_Id) and the top 24b contain
 *  flags/fields that affect I/O configuration. #PIN_Config entries can either
 *  use a @ref PIN_GENERIC_FLAGS "set of device-independent options" or
 *  device-specific options defined in PIN driver (e.g. PINCC26XX.h), but cannot
 *  mix the two.
 *
 *  This data type is used as arguments or return values in API functions that
 *  manipulate pin configuration or used in lists (terminated by a
 *  #PIN_TERMINATE entry) for configuring multiple pins at a time.
 */
typedef uint32_t PIN_Config;

/** @brief Macro for inserting or extracting a #PIN_Id in a #PIN_Config entry
 *  @par Usage
 *       @code
 *       PIN_Config pinCfg = PIN_ID(5) | PIN_GPIO_OUTPUT_EN | PIN_PUSHPULL |
 *                           PIN_GPIO_HIGH | PIN_IRQ_POSEDGE;
 *       PIN_setConfig(hPins, PIN_BM_OUTPUT_MODE, pinCfg);
 *       // Trigger IRQ
 *       PIN_setOutputValue(hPins, PIN_ID(pinCfg), 1);
 *       @endcode
 */
#define PIN_ID(x)                 ((x)&0xFF)


/** @anchor PIN_GENERIC_FLAGS
 *  @name Generic PIN_Config flags/fields
 *  Generic (i.e. not device-specific) fields/flags for I/O configuration for
 *  use in #PIN_Config entries. All of these generic options may not be
 *  supported by the underlying device-specific PIN driver. A #PIN_Config
 *  entry may use either these generic fields/flags or device-specific ones
 *  defined in the device-specific PIN-driver, but may not mix the two.
 *
 *  The entries starting with PIN_BM_ are bitmasks used to extract individual
 *  fields obtained from PIN_getConfig() or to pass as a parameter to
 *  PIN_setConfig()to define which options it should set.
 *
 *  A star (*) in the descriptions below means the default if no option is
 *  supplied.
 *  \{
 */
#define PIN_GEN             (((uint32_t)1)<<31) ///< Flags that generic options are used

#define PIN_INPUT_EN        (PIN_GEN|(0<<29))   ///< (*) Enable input buffer
#define PIN_INPUT_DIS       (PIN_GEN|(1<<29))   ///< Disable input buffer
#define PIN_HYSTERESIS      (PIN_GEN|(1<<30))   ///< Enable input buffer hysteresis
#define PIN_NOPULL          (PIN_GEN|(0<<13))   ///< (*) No pull-up or pull-down resistor
#define PIN_PULLUP          (PIN_GEN|(1<<13))   ///< Pull-up resistor enabled
#define PIN_PULLDOWN        (PIN_GEN|(2<<13))   ///< Pull-down resistor enabled
#define PIN_BM_INPUT_EN     (1<<29)             ///< Bitmask for input enable option
#define PIN_BM_HYSTERESIS   (1<<30)             ///< Bitmask input hysteresis option
#define PIN_BM_PULLING      (0x3<<13)           ///< Bitmask for pull-up/pull-down options

/// Bitmask for all input mode options
#define PIN_BM_INPUT_MODE   (PIN_BM_INPUT_EN|PIN_BM_HYSTERESIS|PIN_BM_PULLING)

#define PIN_GPIO_OUTPUT_DIS (PIN_GEN|(0<<23))   ///< (*) Disable output buffer when GPIO
#define PIN_GPIO_OUTPUT_EN  (PIN_GEN|(1<<23))   ///< Enable output buffer when GPIO
#define PIN_GPIO_LOW        (PIN_GEN|(0<<22))   ///< Output buffer drives to VSS when GPIO
#define PIN_GPIO_HIGH       (PIN_GEN|(1<<22))   ///< Output buffer drives to VDD when GPIO
#define PIN_PUSHPULL        (PIN_GEN|(0<<25))   ///< (*) Output buffer mode: push/pull
#define PIN_OPENDRAIN       (PIN_GEN|(2<<25))   ///< Output buffer mode: open drain
#define PIN_OPENSOURCE      (PIN_GEN|(3<<25))   ///< Output buffer mode: open source
#define PIN_SLEWCTRL        (PIN_GEN|(1<<12))   ///< Enable output buffer slew control
#define PIN_DRVSTR_MIN      (PIN_GEN|(0x0<<8))  ///< (*) Lowest drive strength
#define PIN_DRVSTR_MED      (PIN_GEN|(0x4<<8))  ///< Medium drive strength
#define PIN_DRVSTR_MAX      (PIN_GEN|(0x8<<8))  ///< Highest drive strength
#define PIN_BM_GPIO_OUTPUT_EN  (1<<23)          ///< Bitmask for output enable option
#define PIN_BM_GPIO_OUTPUT_VAL (1<<22)          ///< Bitmask for output value option
#define PIN_BM_OUTPUT_BUF   (0x3<<25)           ///< Bitmask for output buffer options
#define PIN_BM_SLEWCTRL     (0x1<<12)           ///< Bitmask for slew control options
#define PIN_BM_DRVSTR       (0xF<<8)            ///< Bitmask for drive strength options

/// Bitmask for all output mode options
#define PIN_BM_OUTPUT_MODE  (PIN_BM_GPIO_OUTPUT_VAL|PIN_BM_GPIO_OUTPUT_EN| \
                             PIN_BM_OUTPUT_BUF|PIN_BM_SLEWCTRL|PIN_BM_DRVSTR)

#define PIN_INV_INOUT       (PIN_GEN|(1<<24))   ///< Logically invert input and output
#define PIN_BM_INV_INOUT    (1<<24)             ///< Bitmask for input/output inversion option

#define PIN_IRQ_DIS         (PIN_GEN|(0x0<<16)) ///< (*) Disable IRQ on pin
#define PIN_IRQ_NEGEDGE     (PIN_GEN|(0x5<<16)) ///< Enable IRQ on negative edge
#define PIN_IRQ_POSEDGE     (PIN_GEN|(0x6<<16)) ///< Enable IRQ on positive edge
#define PIN_IRQ_BOTHEDGES   (PIN_GEN|(0x7<<16)) ///< Enable IRQ on both edges
#define PIN_BM_IRQ          (0x7<<16)           ///< Bitmask for pin interrupt option

/// Bitmask for all options at once
#define PIN_BM_ALL        (PIN_BM_INPUT_MODE|PIN_BM_OUTPUT_MODE|PIN_BM_INV_INOUT|PIN_BM_IRQ)
/** \} (PIN_GENERIC_FLAGS)
 */


/** @brief Struct used to store PIN client state
 *  Pointer to a PIN_State is used as handles (#PIN_Handle) in interactions with
 *  the I/O driver
 *  @note Must reside in persistent memory
 *  @note Fields must never be modified directly
 */
typedef struct PIN_State_s PIN_State;


/** @brief A handle that is returned from a PIN_open() call
 *  Used for further PIN client interaction with the PIN driver
 */
typedef PIN_State* PIN_Handle;


/** @brief I/O Interrupt callback function pointer type
 *  One PIN Interrupt callback can be registered by each PIN client and it
 *  will be called when one of the pins allocated by the client has an interrupt
 *  event. The callback is called from HWI context with handle and pin ID as
 *  arguments.
 * @remark The callback must, as it runs in HWI context, execute and return
 *         quickly. Any lengthy operations should be performed in SWIs or tasks
 *         triggered by the callback
 */
typedef void (*PIN_IntCb)(PIN_Handle handle, PIN_Id pinId);


/** @brief underlying data structure for type #PIN_State
 */
struct PIN_State_s {
    PIN_IntCb   pCbFunc;            ///< Pointer to interrupt callback function
    uint_t      bmPort;             ///< Bitmask for pins allocated in port
    UArg        userArg;            ///< User argument for whole handle
    // TODO: add driver-specific field for extensions?
};

/// @brief Return value for many functions in the PIN driver interface
typedef enum {
    PIN_SUCCESS              = 0,    ///< Operation succeeded
    PIN_ALREADY_ALLOCATED    = 1,    ///< Operation failed, some pin already allocated
    PIN_NO_ACCESS            = 2,    ///< Operation failed, client does not have access to pin
    PIN_UNSUPPORTED          = 3     ///< Operation not supported
} PIN_Status;


/** @brief  PIN module initialization
 *
 *  Must be called early in the boot sequence to ensure that I/O pins have safe
 *  configurations. This initialization sets up pins as GPIO as defined in an
 *  array (possibly user-generated) that typically resides in a board file. All
 *  pins not mentioned in aPinCfg[] are configured to be input/output/pull
 *  disabled.
 *
 *  @note Function *cannot* be called more than once.
 *
 *  @param aPinCfg[]  Pointer to array of PIN_Config entries, one per pin
 *                    that needs configuration. List terminates when a
 *                    #PIN_TERMINATE entry is encountered.
 *  @return #PIN_SUCCESS if successful, else an error code.
 */
extern PIN_Status PIN_init(const PIN_Config aPinCfg[]);


/** @brief  Allocate one or more pins for a driver or an application
 *
 *  Allows a PIN client (driver or application) to allocate a set of pins, thus
 *  ensuring that they cannot be reconfigured/controlled by anyone else. The
 *  pins are identified by and reconfigured according to the #PIN_Config
 *  entries in aPinList.
 *
 *  @param pState     Pointer to a PIN_State object that will hold the state for
 *                    this IO client. The object must be in persistent memory
 *  @param aPinList[] Pointer to array of #PIN_Config entries, one per pin to
 *                    allocate. List terminates when #PIN_TERMINATE entry is
 *                    encountered.
 *  @return A handle for further PIN driver calls or NULL if an error occurred
 *          (already allocated pin in aPinList or non-existent pin in aPinList)
 */
extern PIN_Handle PIN_open(PIN_State* pState, const PIN_Config aPinList[]);


/** @brief  Add pin to pin set for open PIN handle
 *
 *  If the requested pin is unallocated it will be added, else an error code
 *  will be returned.
 *  @param handle   handle retrieved through an earlier call to PIN_open().
 *  @param pinCfg   Pin ID/configuration for pin to add.
 *  @return Error code if unsuccessful, else PIN_SUCCESS
 */
extern PIN_Status PIN_add(PIN_Handle handle, PIN_Config pinCfg);


/** @brief  Removes pin from pin set foropen PIN handle
 *
 *  If the requested pin is allocated to handle it will be removed from the pin
 *  set, else an error code will be returned.
 *  @param handle   handle retrieved through an earlier call to PIN_open().
 *  @param pinId    Pin ID for pin to remove.
 *  @return Error code if unsuccessful, else PIN_SUCCESS
 */
extern PIN_Status PIN_remove(PIN_Handle handle, PIN_Id pinId);


/** @brief  Deallocate all pins previously allocated with a call to PIN_open().
 *
 *  Deallocate pins allocated to handle and restore these pins to the
 *  pool of unallocated pins. Also restores the pin configuration to what it was
 *  set to when PIN_init() was called.
 *  @param handle   handle retrieved through an earlier call to PIN_open().
 */
extern void PIN_close(PIN_Handle handle);


/** @brief  Sets a user argument associated with the handle
 *
 *  Allows the application to store some data, for example a pointer to some
 *  data structure, with each PIN handle
 *  @param handle   handle retrieved through an earlier call to PIN_open().
 *  @param arg      User argument
 */
static inline void PIN_setUserArg(PIN_Handle handle, UArg arg) {
    if (handle) {
        handle->userArg = arg;
    }
}


/** @brief  Gets a user argument associated with the handle
 *
 *  Allows the application to store some data, for example a pointer to some
 *  data structure, with each PIN handle
 *  @param handle   handle retrieved through an earlier call to PIN_open().
 *  @return User argument. Has the value 0 if never initialized
 */
static inline UArg PIN_getUserArg(PIN_Handle handle) {
    return handle->userArg;
}


/** @name Pin Manipulation/Configuration Functions
 *  Functions that are used to manipulate the configuration of I/O pins and to
 *  get input values and set output values.
 *  \{
 */

/** @brief Get pin input value (0/1)
 *
 *  Input values of all pins are available to everyone so no handle required
 *  @param pinId ID of pin to get input value from
 *  @return      Current input buffer value
 *  @remark      This function typically has an inlined sibling function in the
 *               device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       myPin = PIN_getInputValue(PIN_ID(5));
 *       @endcode
 */
extern uint_t PIN_getInputValue(PIN_Id pinId);


/** @brief Control output enable for GPIO pin
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param pinId   #PIN_Id entry identifying pin
 *  @param bOutEn  Enable output buffer when true, else disable
 *  @return #PIN_SUCCESS if successful, else error code
 *  @remark This function is included for consistency with the corresponding
 *          port function and to provide a more efficient/directed approach.
 *          PIN_setConfig() can be used to achieve same result.
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       PIN_setOutputEnable(hPins, PIN_ID(11), 0);
 *       @endcode
 */
extern PIN_Status PIN_setOutputEnable(PIN_Handle handle, PIN_Id pinId, bool bOutEn);


/** @brief Control output value for GPIO pin
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param pinId   Pin ID
 *  @param val     Output value (0/1)
 *  @return  #PIN_SUCCESS if successful, else error code
 *  @remark  This function typically has an inlined sibling function in the
 *           device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       PIN_setOutputValue(hPins, PIN_ID(4), 1);
 *       @endcode
 */
extern PIN_Status PIN_setOutputValue(PIN_Handle handle, PIN_Id pinId, uint_t val);


/** @brief Get value of GPIO pin output buffer
 *
 *  Output values of all pins are available to everyone so no handle required
 *  @param pinId    Pin ID
 *  @return  Output value (0/1)
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       PIN_setOutputValue(hpins, PIN_ID(4), PIN_getOutputValue(PIN_ID(6)));
 *       @endcode
 */
extern uint_t PIN_getOutputValue(PIN_Id pinId);


/** @brief Control interrupt enable and edge for pin
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param pinCfg  #PIN_Config entry identifying pin ID and relevant pin
 *                 configuration as combinations of:
 *                 - #PIN_IRQ_DIS      (default)
 *                 - #PIN_IRQ_POSEDGE
 *                 - #PIN_IRQ_NEGEDGE
 *                 - #PIN_IRQ_BOTHEDGES
 *  @return #PIN_SUCCESS if successful, else error code
 *  @note Any pending interrupts on pins that have not had interrupt enabled
 *        will be cleared when enabling interrupts
 *  @par Usage
 *       @code
 *       PIN_setInterrupt(hPins, PIN_ID(8)|PIN_IRQ_POSEDGE);
 *       @endcode
 */
extern PIN_Status PIN_setInterrupt(PIN_Handle handle, PIN_Config pinCfg);


/** @brief Clear pending interrupt for pin, if any
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param pinId  #PIN_Id for pin to clear pending interrupt for
 *  @return #PIN_SUCCESS if successful, else error code
 *  @par Usage
 *       @code
 *       PIN_ClrPendInterrupt(hPins, PIN_ID(8));
 *       @endcode
 */
extern PIN_Status PIN_clrPendInterrupt(PIN_Handle handle, PIN_Id pinId);


/** @brief Register callback function for a set of pins
 *
 *  Registers a callback function (see #PIN_IntCb for details) for the client
 *  identified by handle that will be called from HWI context upon an interrupt
 *  event on one or more of the allocated pins that have interrupts enabled
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param pCb     Function pointer to a #PIN_IntCb function.
 *  @return #PIN_SUCCESS if successful, else error code
 *  @note Pin interrupts are serviced one at a time in pin order when
 *        simultaneous. Pin hardware interrupt flags are automatically cleared
 *        by PIN driver.
 *  @par Usage
 *       @code
 *       void pinIntHandler(PIN_Handle handle, PIN_Id pinId) {
 *           // Handle pin interrupt
 *       }
 *       ...
 *       PIN_registerIntCb(hPins, pinIntHandler);
 *       @endcode
 */
extern PIN_Status PIN_registerIntCb(PIN_Handle handle, PIN_IntCb pCb);



/** @brief Returns pin configuration
 *
 *  @param pinId    Pin ID
 *  @return  Current pin configuration as a device-independent #PIN_Config value
 *  @note    The pin ID is embedded in return value.
 *  @note    There is usually a device-specific version of this function that
 *           returns device-specific options
 *  @par Usage
 *       @code
 *       // Get config of pin 14 to be able to revert later
 *       myPinConfig = PIN_getConfig(PIN_ID(14));
 *       // ...
 *       // Lots of pin reconfigurations
 *       // ...
 *       // Restore previous configuration
 *       PIN_setConfig(hPins, PIN_BM_ALL, myPinConfig);
 *       @endcode
 */
extern PIN_Config PIN_getConfig(PIN_Id pinId);


/** @brief Sets complete pin configuration
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @param bmMask  Bitmask specifying which fields in cfg that should take
 *                 effect, the rest keep their current value.
 *  @param pinCfg  #PIN_Config entry with pin ID and pin configuration
 *  @return #PIN_SUCCESS if successful, else error code
 *  @par Usage
 *       @code
 *       // Set drive strength on pin 15
 *       PIN_setConfig(hPins, PIN_BM_DRVSTR, PIN_ID(15)|PIN_DRVSTR_MAX);
 *       @endcode
 */
extern PIN_Status PIN_setConfig(PIN_Handle handle, PIN_Config bmMask, PIN_Config pinCfg);


/** \} (IO Manipulation/Configuration Functions)
 */


/** @name IO Port Functions
 *  Functions used to get input values for, set ouput values for and set output
 *  enables for multiple pins at a time. The size of so-called I/O ports that
 *  allows such multiple-pin operations are highly device dependent. In order to
 *  use the I/O port functions a set of pins that reside in the same I/O port
 *  must have been allocated previously with PIN_open().
 *  \{
 */


/** @brief Returns bitmask indicating pins allocated to client in GPIO port
 *
 *  @param handle  Handle provided by previous call to PIN_open()
 *  @return A bitmask indicating which bit positions in an I/O port the
 *          allocated I/O pins lie on, or zero if I/O port operations are not
 *          supported or the allocated pins span multiple I/O ports. The bitmask
 *          maps lowest pin index to the rightmost mask bit
 */
extern uint_t PIN_getPortMask(PIN_Handle handle);


/** @brief Read input value of whole GPIO port
 *
 *  @param  handle  Handle provided by previous call to PIN_open()
 *  @return The simultaneous input value for the whole I/O port masked by the
 *          bit mask for the client's allocated pins
 *  @sa     PIN_getPortMask()
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 */
extern uint_t PIN_getPortInputValue(PIN_Handle handle);


/** @brief Returns value of whole GPIO port's output buffers
 *
 *  The I/O port is identified by the pins allocated by client in a previous
 *  call to PIN_open()
 *  @param  handle  Handle provided by previous call to PIN_open()
 *  @return The current output value for whole I/O port
 *  @sa     PIN_getPortMask()
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 */
extern uint_t PIN_getPortOutputValue(PIN_Handle handle);


/** @brief Simultaneous write output buffer values of all allocated pins in GPIO port
 *
 *  @param handle    Handle provided by previous call to PIN_open()
 *  @param bmOutVal  Bitmask indicating the desired output value for the whole
 *                   port, only the pins allocated to the client will be
 *                   affected
 *  @return #PIN_SUCCESS if successful, else error code
 *  @sa     PIN_getPortMask()
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       // Invert all pins allocated to client
 *       PIN_setPortOutputVal(hPins, ~PIN_getPortOutputVals(hPins));
 *       @endcode
 */
extern PIN_Status PIN_setPortOutputValue(PIN_Handle handle, uint_t bmOutVal);


/** @brief Set output enable for all pins allocated to client in GPIO port
 *
 *  @param handle   Handle provided by previous call to PIN_open()
 *  @param bmOutEn  Bitmask indicating the desired output enable configuration
 *                  for the whole port, only the pins allocated to the client
 *                  will be affected
 *  @return #PIN_SUCCESS if successful, else error code
 *  @sa      PIN_getPortMask()
 *  @remark This function typically has an inlined sibling function in the
 *          device-specific driver that may be used for higher efficiency
 *  @par Usage
 *       @code
 *       // Set output to 0 on all allocated pins, then enable the output drivers
 *       pin_setPortOutputVal(hPins, 0);
 *       pin_setPortOutputEnable(hPins, PIN_getPortMask());
 *       @endcode
 */
extern PIN_Status PIN_setPortOutputEnable(PIN_Handle handle, uint_t bmOutEn);


/** \} (IO Port Functions)
 */

#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_PIN__include */
