diff --git a/README.md b/README.md index 56152496..647a69a9 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Documentation for the library can be found at the following link: . You should then add ```#include ``` to your .ino file. + * If you are using the Arduino Due, then you must include the Arduino SPI library like so: ```#include ``` in your .ino file. +* Arduino Due +* Teensy (Teensy++ 1.0, Teensy 2.0, Teensy++ 2.0, and Teensy 3.x) + * Note if you are using the Teensy 3.x you should download this SPI library as well: . You should then add ```#include ``` to your .ino file. * Balanduino * Sanguino * Black Widdow @@ -203,15 +205,15 @@ The [Wii](Wii.cpp) library support the Wiimote, but also the Nunchuch and Motion First you have to pair with the controller, this is done automatically by the library if you create the instance like so: -``` -WII Wii(&Btd,PAIR); +```C++ +WII Wii(&Btd, PAIR); ``` And then press 1 & 2 at once on the Wiimote or press sync if you are using a Wii U Pro Controller. After that you can simply create the instance like so: -``` +```C++ WII Wii(&Btd); ``` diff --git a/UsbCore.h b/UsbCore.h index 9a09d804..444700a6 100644 --- a/UsbCore.h +++ b/UsbCore.h @@ -24,7 +24,7 @@ typedef MAX3421e MAX3421E; // Arduino Mega ADK #elif defined(ARDUINO_AVR_BALANDUINO) typedef MAX3421e MAX3421E; // Balanduino #else -typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo etc.) or Teensy 2.0 and 3.0 +typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.) or Teensy 2.0 and 3.0 #endif /* Common setup data constant combinations */ diff --git a/avrpins.h b/avrpins.h index bdc99ba6..6e074b65 100644 --- a/avrpins.h +++ b/avrpins.h @@ -749,11 +749,13 @@ public: #endif // __AVR__ -#if defined(__arm__) && defined(CORE_TEENSY) +#if defined(__arm__) // pointers are 32 bits on ARM #define pgm_read_pointer(p) pgm_read_dword(p) +#if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__)) + #include "core_pins.h" #include "avr_emulation.h" @@ -819,6 +821,59 @@ MAKE_PIN(P33, CORE_PIN33_PORTREG, CORE_PIN33_BIT, CORE_PIN33_CONFIG); #undef MAKE_PIN +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + +// SetDirRead: +// Disable interrupts +// Disable the pull up resistor +// Set to INPUT +// Enable PIO + +// SetDirWrite: +// Disable interrupts +// Disable the pull up resistor +// Set to OUTPUT +// Enable PIO + +#define MAKE_PIN(className, pio, pinMask) \ +class className { \ +public: \ + static void Set() { \ + pio->PIO_SODR = pinMask; \ + } \ + static void Clear() { \ + pio->PIO_CODR = pinMask; \ + } \ + static void SetDirRead() { \ + pio->PIO_IDR = pinMask ; \ + pio->PIO_PUDR = pinMask; \ + pio->PIO_ODR = pinMask; \ + pio->PIO_PER = pinMask; \ + } \ + static void SetDirWrite() { \ + pio->PIO_IDR = pinMask ; \ + pio->PIO_PUDR = pinMask; \ + pio->PIO_OER = pinMask; \ + pio->PIO_PER = pinMask; \ + } \ + static uint8_t IsSet() { \ + return pio->PIO_PDSR & pinMask; \ + } \ +}; + +MAKE_PIN(P9, PIOC, PIO_PC21); // INT +MAKE_PIN(P10, PIOC, PIO_PC29); // SS +MAKE_PIN(P74, PIOA, PIO_PA25); // MISO +MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI +MAKE_PIN(P76, PIOA, PIO_PA27); // CLK + +#undef MAKE_PIN + +#else +#error "Please define board in avrpins.h" + +#endif + #endif // __arm__ #endif //_avrpins_h_ diff --git a/settings.h b/settings.h index 424a5bcf..c6d78ad4 100644 --- a/settings.h +++ b/settings.h @@ -68,7 +68,6 @@ // No user serviceable parts below this line. // DO NOT change anything below here unless you are a developer! -// When will we drop support for the older bug-ridden stuff? #if defined(ARDUINO) && ARDUINO >=100 #include #else @@ -79,7 +78,7 @@ #define F(str) (str) #endif -#ifdef __GNUC__ +#if defined(__GNUC__) && defined(__AVR__) #ifndef GCC_VERSION #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif @@ -110,10 +109,14 @@ #define XMEM_RELEASE_SPI() (void(0)) #endif -#if defined(__MK20DX128__) || defined(__MK20DX256__) +#if defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__)) #define USING_SPI4TEENSY3 USE_SPI4TEENSY3 #else #define USING_SPI4TEENSY3 0 #endif +#if defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) +#include // Use the Arduino SPI library for the Arduino Due +#endif + #endif /* SETTINGS_H */ diff --git a/usbhost.h b/usbhost.h index adfff592..172742e5 100644 --- a/usbhost.h +++ b/usbhost.h @@ -29,9 +29,8 @@ e-mail : support@circuitsathome.com /* SPI initialization */ template< typename SPI_CLK, typename SPI_MOSI, typename SPI_MISO, typename SPI_SS > class SPi { -#if USING_SPI4TEENSY3 public: - +#if USING_SPI4TEENSY3 static void init() { // spi4teensy3 inits everything for us, except /SS // CLK, MOSI and MISO are hard coded for now. @@ -40,10 +39,14 @@ public: SPI_SS::SetDirWrite(); SPI_SS::Set(); } - +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + static void init() { + SPI_SS::SetDirWrite(); + SPI_SS::Set(); + SPI.begin(); + SPI.setClockDivider(BOARD_SPI_DEFAULT_SS, 4); // Set speed to 84MHz/4=21MHz - the MAX3421E can handle up to 26MHz + } #else -public: - static void init() { //uint8_t tmp; SPI_CLK::SetDirWrite(); @@ -67,8 +70,10 @@ typedef SPi< Pb1, Pb2, Pb3, Pb0 > spi; typedef SPi< Pb5, Pb3, Pb4, Pb2 > spi; #elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) typedef SPi< Pb7, Pb5, Pb6, Pb4 > spi; -#elif defined(__MK20DX128__) || defined(__MK20DX256__) +#elif defined(CORE_TEENSY) && (defined(__MK20DX128__) || defined(__MK20DX256__)) typedef SPi< P13, P11, P12, P10 > spi; +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) +typedef SPi< P76, P75, P74, P10 > spi; #else #error "No SPI entry in usbhost.h" #endif @@ -130,6 +135,9 @@ void MAX3421e< SPI_SS, INTR >::regWr(uint8_t reg, uint8_t data) { c[0] = reg | 0x02; c[1] = data; spi4teensy3::send(c, 2); +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + SPI.transfer(reg | 0x02); + SPI.transfer(data); #else SPDR = (reg | 0x02); while(!(SPSR & (1 << SPIF))); @@ -151,6 +159,13 @@ uint8_t* MAX3421e< SPI_SS, INTR >::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* spi4teensy3::send(reg | 0x02); spi4teensy3::send(data_p, nbytes); data_p += nbytes; +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + SPI.transfer(reg | 0x02); + while(nbytes) { + SPI.transfer(*data_p); + nbytes--; + data_p++; // advance data pointer + } #else SPDR = (reg | 0x02); //set WR bit and send register number while(nbytes) { @@ -186,6 +201,10 @@ uint8_t MAX3421e< SPI_SS, INTR >::regRd(uint8_t reg) { spi4teensy3::send(reg); uint8_t rv = spi4teensy3::receive(); SPI_SS::Set(); +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + SPI.transfer(reg); + uint8_t rv = SPI.transfer(0); + SPI_SS::Set(); #else SPDR = reg; while(!(SPSR & (1 << SPIF))); @@ -208,6 +227,12 @@ uint8_t* MAX3421e< SPI_SS, INTR >::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* spi4teensy3::send(reg); spi4teensy3::receive(data_p, nbytes); data_p += nbytes; +#elif defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__) + SPI.transfer(reg); + while(nbytes) { + *data_p++ = SPI.transfer(0); + nbytes--; + } #else SPDR = reg; while(!(SPSR & (1 << SPIF))); //wait