Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Revision:
18:6a4db94011d3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-dev/targets/TARGET_ONSEMI/TARGET_NCS36510/port_api.c	Sun May 14 23:18:57 2017 +0000
@@ -0,0 +1,162 @@
+/**
+ ******************************************************************************
+ * @file port_api.c
+ * @brief Implementation of a port API
+ * @internal
+ * @author ON Semiconductor
+ * $Rev:
+ * $Date:
+ ******************************************************************************
+ * Copyright 2016 Semiconductor Components Industries LLC (d/b/a “ON Semiconductor”).
+ * All rights reserved.  This software and/or documentation is licensed by ON Semiconductor
+ * under limited terms and conditions.  The terms and conditions pertaining to the software
+ * and/or documentation are available at http://www.onsemi.com/site/pdf/ONSEMI_T&C.pdf
+ * (“ON Semiconductor Standard Terms and Conditions of Sale, Section 8 Software”) and
+ * if applicable the software license agreement.  Do not use this software and/or
+ * documentation unless you have carefully read and you agree to the limited terms and
+ * conditions.  By using this software and/or documentation, you agree to the limited
+ * terms and conditions.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
+ * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ */
+#include "gpio.h"
+#include "gpio_api.h"
+#include "port_api.h"
+#include "pinmap.h"
+
+#if DEVICE_PORTIN || DEVICE_PORTOUT
+
+/** Get the pin name from the port's pin number
+ *
+ * @param port  The port name
+ * @param pin_n The pin number within the specified port
+ * @return The pin name for the port's pin number
+ */
+PinName port_pin(PortName port, int pin_n)
+{
+    return((PinName)(pin_n));
+}
+
+/** Initilize the port
+ *
+ * @param obj  The port object to initialize
+ * @param port The port name
+ * @param mask The bitmask to identify which bits in the port should be included (0 - ignore)
+ * @param dir  The port direction
+ */
+void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
+{
+    uint8_t i;
+    PinName pin;
+
+    /* Store the port mask in obj */
+    obj->mask = mask;
+
+    /* Store the port name in obj */
+    obj->port = port;
+
+    /* Store GPIO base address */
+    obj->GPIOMEMBASE = GPIOREG;
+
+    for (i=0; i<NUMBER_OF_GPIO; i++) {
+        /* check for valid pin */
+        if (obj->mask & (1<<i)) {
+
+            /* Gpio numbers start from DIO#0 to #17, so can pass in "i" */
+            pin = port_pin(obj->port, i);
+
+            /* Set the pin as GPIO */
+            gpio_set(pin);
+        }
+    }
+
+    /* Call function to set pin direction */
+    port_dir(obj, dir);
+}
+
+/** Set the input port mode
+ *
+ * @param obj  The port object
+ * @param mode THe port mode to be set
+ */
+void port_mode(port_t *obj, PinMode mode)
+{
+    uint8_t i = 0;
+    PinName pin;
+
+    /* For each pin in the mask, set the mode to that defined in "mode" parameter */
+    for (i=0; i < NUMBER_OF_GPIO; i++) {
+        /* check for valid pin */
+        if (obj->mask & (1<<i)) {
+
+            /* get the pin name */
+            pin = port_pin(obj->port, i);
+
+            /* Set the mode for the pin */
+            pin_mode(pin, mode);
+        }
+    }
+}
+
+/** Set port direction (in/out)
+ *
+ * @param obj The port object
+ * @param dir The port direction to be set
+ */
+void port_dir(port_t *obj, PinDirection dir)
+{
+    /* Enable the GPIO clock */
+    CLOCK_ENABLE(CLOCK_GPIO);
+
+    if (dir == PIN_INPUT) {
+        obj->GPIOMEMBASE->W_IN = obj->mask;
+    } else if (dir == PIN_OUTPUT) {
+        obj->GPIOMEMBASE->W_OUT = obj->mask;
+    }
+
+    /* Disable the GPIO clock */
+    CLOCK_DISABLE(CLOCK_GPIO);
+}
+
+/** Write value to the port
+ *
+ * @param obj   The port object
+ * @param value The value to be set
+ */
+void port_write(port_t *obj, int value)
+{
+    /* Enable the GPIO clock */
+    CLOCK_ENABLE(CLOCK_GPIO);
+
+    obj->GPIOMEMBASE->R_STATE_W_SET = value;//(obj->mask & value);
+    obj->GPIOMEMBASE->R_IRQ_W_CLEAR = ~value;//(obj->mask ^ value);
+
+    /* Disable the GPIO clock */
+    CLOCK_DISABLE(CLOCK_GPIO);
+}
+
+/** Read the current value on the port
+ *
+ * @param obj The port object
+ * @return An integer with each bit corresponding to an associated port pin setting
+ */
+int port_read(port_t *obj)
+{
+    int gpio_level = 0;
+
+    /* Enable the GPIO clock */
+    CLOCK_ENABLE(CLOCK_GPIO);
+
+    gpio_level = obj->GPIOMEMBASE->R_STATE_W_SET;
+
+    /* Disable the GPIO clock */
+    CLOCK_DISABLE(CLOCK_GPIO);
+
+    return(gpio_level);
+}
+
+#endif