diff --git a/.travis.yml b/.travis.yml index 2a46dfc5..3dc25114 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,9 @@ env: - PLATFORMIO_CI_SRC=examples/board_qc - PLATFORMIO_CI_SRC=examples/cdc_XR21B1411/XR_terminal - PLATFORMIO_CI_SRC=examples/ftdi/USBFTDILoopback + - PLATFORMIO_CI_SRC=examples/GPIO/Blink + - PLATFORMIO_CI_SRC=examples/GPIO/Blink_LowLevel + - PLATFORMIO_CI_SRC=examples/GPIO/Input - PLATFORMIO_CI_SRC=examples/HID/le3dp - PLATFORMIO_CI_SRC=examples/HID/scale - PLATFORMIO_CI_SRC=examples/HID/SRWS1 diff --git a/UHS2_gpio.cpp b/UHS2_gpio.cpp new file mode 100644 index 00000000..3957f15d --- /dev/null +++ b/UHS2_gpio.cpp @@ -0,0 +1,74 @@ +/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : http://www.circuitsathome.com +e-mail : support@circuitsathome.com + +UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk + */ + +#include "UHS2_gpio.h" + +/** @brief Implement an instance of a UHS2_GPIO object +* @param pUSB Pointer to a UHS2 USB object +*/ +UHS2_GPIO::UHS2_GPIO(USB *pUsb) : m_pUsb(pUsb) +{ +} + +/** @brief Set a GPIO output value +* @param pin GPIO output pin on USB Host Shield to set +* @param val Value to set the pin to (zero value will clear output, non-zero value will assert output) +*/ +void UHS2_GPIO::digitalWrite(uint8_t pin, uint8_t val) { + if(pin > 7) + return; + uint8_t nValue = m_pUsb->gpioRdOutput(); + uint8_t nMask = 1 << pin; + nValue &= (~nMask); + if(val) + nValue |= (nMask); + m_pUsb->gpioWr(nValue); +} + +/** @brief Read the value from a GPIO input pin +* @param pin GPIO input pin on USB Host Shield to read +* @retval int Value of GPIO input (-1 on fail) +*/ +int UHS2_GPIO::digitalRead(uint8_t pin) { + if(pin > 7) + return -1; + uint8_t nMask = 1 << pin; + uint8_t nValue = m_pUsb->gpioRd(); + return ((nValue & nMask)?1:0); +} + +/** @brief Read the value from a GPIO output pin +* @param pin GPIO output pin on USB Host Shield to read +* @retval int Value of GPIO output (-1 on fail) +* @note Value of MAX3421E output register, i.e. what the device has been set to, not the physical value on the pin +*/ +int UHS2_GPIO::digitalReadOutput(uint8_t pin) { + if(pin > 7) + return -1; + uint8_t nMask = 1 << pin; + uint8_t nValue = m_pUsb->gpioRdOutput(); + return ((nValue & nMask)?1:0); +} diff --git a/UHS2_gpio.h b/UHS2_gpio.h new file mode 100644 index 00000000..498b99b8 --- /dev/null +++ b/UHS2_gpio.h @@ -0,0 +1,44 @@ +/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : http://www.circuitsathome.com +e-mail : support@circuitsathome.com + +UHS2_GPIO implements "wiring" style GPIO access. Implemented by Brian Walton brian@riban.co.uk + */ + +#if !defined(__USB2_GPIO_H__) +#define __USB2_GPIO_H__ + +#include "Usb.h" + +class UHS2_GPIO { +public: + UHS2_GPIO(USB *pUsb); + + void digitalWrite(uint8_t pin, uint8_t val); + int digitalRead(uint8_t pin); + int digitalReadOutput(uint8_t pin); + +private: + USB* m_pUsb; +}; + +#endif // __USB2_GPIO_H__ diff --git a/examples/GPIO/Blink/Blink.ino b/examples/GPIO/Blink/Blink.ino new file mode 100644 index 00000000..fb42d9bd --- /dev/null +++ b/examples/GPIO/Blink/Blink.ino @@ -0,0 +1,38 @@ +/* Example of reading and writing USB Host Shield GPI output + This example uses "Wiring" style interface. See Blink_LowLevel for example of using low-level UHS interface + Author: Brian Walton (brian@riban.co.uk) +*/ +#include + +// Satisfy the IDE, which needs to see the include statment in the ino too. +#ifdef dobogusinclude +#include +#endif + +#define OUTPUT_PIN 0 + +USB Usb; // Create an UHS2 interface object +UHS2_GPIO Gpio(&Usb); // Create a GPIO object + +void setup() { + Serial.begin( 115200 ); +#if !defined(__MIPSEL__) + while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection +#endif + Serial.println("Start"); + + if (Usb.Init() == -1) + Serial.println("OSC did not start."); + + delay( 200 ); +} + +void loop() { + // Get the current output value, toggle then wait half a second + int nValue = Gpio.digitalReadOutput(OUTPUT_PIN); + nValue = (nValue ? 0 : 1); + Gpio.digitalWrite(OUTPUT_PIN, nValue); + Serial.print(nValue ? "+" : "."); // Debug to show what the output should be doing + delay(500); +} + diff --git a/examples/GPIO/Blink_LowLevel/Blink_LowLevel.ino b/examples/GPIO/Blink_LowLevel/Blink_LowLevel.ino new file mode 100644 index 00000000..88c81f98 --- /dev/null +++ b/examples/GPIO/Blink_LowLevel/Blink_LowLevel.ino @@ -0,0 +1,38 @@ +/* Example of reading and writing USB Host Shield GPI output using low-level functions + This example uses low-level UHS interface. See Blink for example of using "Wiring" style interface + Author: Brian Walton (brian@riban.co.uk) +*/ +#include + +// Satisfy the IDE, which needs to see the include statment in the ino too. +#ifdef dobogusinclude +#include +#endif +#include + +USB Usb; + +void setup() { + Serial.begin( 115200 ); +#if !defined(__MIPSEL__) + while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection +#endif + Serial.println("Start"); + + if (Usb.Init() == -1) + Serial.println("OSC did not start."); + + delay( 200 ); +} + +void loop() { + // Get the current output value, toggle then wait half a second + uint8_t nGPO = Usb.gpioRdOutput(); + uint8_t nValue = ((nGPO & 0x01) == 0x01) ? 0 : 1; + nGPO &= 0xFE; // Clear bit 0 + nGPO |= nValue; + Usb.gpioWr(nGPO); + Serial.print(nValue ? "+" : "."); // Debug to show what the output should be doing + delay(500); +} + diff --git a/examples/GPIO/Input/Input.ino b/examples/GPIO/Input/Input.ino new file mode 100644 index 00000000..d46e1ade --- /dev/null +++ b/examples/GPIO/Input/Input.ino @@ -0,0 +1,36 @@ +/* Example of reading USB Host Shield GPI input + Author: Brian Walton (brian@riban.co.uk) +*/ +#include + +// Satisfy the IDE, which needs to see the include statment in the ino too. +#ifdef dobogusinclude +#include +#endif + +#define INPUT_PIN 0 +#define OUTPUT_PIN 0 + +USB Usb; // Create an UHS2 interface object +UHS2_GPIO Gpio(&Usb); // Create a GPIO object + +void setup() { + Serial.begin( 115200 ); +#if !defined(__MIPSEL__) + while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection +#endif + Serial.println("Start"); + + if (Usb.Init() == -1) + Serial.println("OSC did not start."); + + delay( 200 ); +} + +void loop() { + // Get the value of input, set value of output + int nValue = Gpio.digitalRead(INPUT_PIN); + nValue = (nValue ? LOW : HIGH); + Gpio.digitalWrite(OUTPUT_PIN, nValue); +} +