mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Merge branch 'master' of github.com:felis/USB_Host_Shield_2.0 into xxxajk
This commit is contained in:
commit
30651a21bc
18 changed files with 686 additions and 189 deletions
1
BTD.cpp
1
BTD.cpp
|
@ -464,6 +464,7 @@ void BTD::HCI_event_task() {
|
||||||
disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
|
disc_bdaddr[j] = hcibuf[j + 3 + 6 * i];
|
||||||
|
|
||||||
hci_set_flag(HCI_FLAG_DEVICE_FOUND);
|
hci_set_flag(HCI_FLAG_DEVICE_FOUND);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#ifdef EXTRADEBUG
|
#ifdef EXTRADEBUG
|
||||||
else {
|
else {
|
||||||
|
|
1
PS4BT.h
1
PS4BT.h
|
@ -58,7 +58,6 @@ protected:
|
||||||
/** @name BTHID implementation */
|
/** @name BTHID implementation */
|
||||||
/**
|
/**
|
||||||
* Used to parse Bluetooth HID data.
|
* Used to parse Bluetooth HID data.
|
||||||
* @param bthid Pointer to the BTHID class.
|
|
||||||
* @param len The length of the incoming data.
|
* @param len The length of the incoming data.
|
||||||
* @param buf Pointer to the data buffer.
|
* @param buf Pointer to the data buffer.
|
||||||
*/
|
*/
|
||||||
|
|
12
PS4USB.h
12
PS4USB.h
|
@ -112,6 +112,18 @@ protected:
|
||||||
};
|
};
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
/** @name USBDeviceConfig implementation */
|
||||||
|
/**
|
||||||
|
* Used by the USB core to check what this driver support.
|
||||||
|
* @param vid The device's VID.
|
||||||
|
* @param pid The device's PID.
|
||||||
|
* @return Returns true if the device's VID and PID matches this driver.
|
||||||
|
*/
|
||||||
|
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
|
||||||
|
return (vid == PS4_VID && pid == PS4_PID);
|
||||||
|
};
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void (*pFuncOnInit)(void); // Pointer to function called in onInit()
|
void (*pFuncOnInit)(void); // Pointer to function called in onInit()
|
||||||
};
|
};
|
||||||
|
|
82
PSBuzz.cpp
Normal file
82
PSBuzz.cpp
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
|
||||||
|
|
||||||
|
This software may be distributed and modified under the terms of the GNU
|
||||||
|
General Public License version 2 (GPL2) as published by the Free Software
|
||||||
|
Foundation and appearing in the file GPL2.TXT included in the packaging of
|
||||||
|
this file. Please note that GPL2 Section 2[b] requires that all works based
|
||||||
|
on this software must also be made publicly available under the terms of
|
||||||
|
the GPL2 ("Copyleft").
|
||||||
|
|
||||||
|
Contact information
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Kristian Lauszus, TKJ Electronics
|
||||||
|
Web : http://www.tkjelectronics.com
|
||||||
|
e-mail : kristianl@tkjelectronics.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PSBuzz.h"
|
||||||
|
|
||||||
|
// To enable serial debugging see "settings.h"
|
||||||
|
//#define PRINTREPORT // Uncomment to print the report send by the PS Buzz Controllers
|
||||||
|
|
||||||
|
void PSBuzz::ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) {
|
||||||
|
if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID && len > 0 && buf) {
|
||||||
|
#ifdef PRINTREPORT
|
||||||
|
Notify(PSTR("\r\n"), 0x80);
|
||||||
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
|
D_PrintHex<uint8_t > (buf[i], 0x80);
|
||||||
|
Notify(PSTR(" "), 0x80);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
memcpy(&psbuzzButtons, buf + 2, min(len - 2, sizeof(psbuzzButtons)));
|
||||||
|
|
||||||
|
if (psbuzzButtons.val != oldButtonState.val) { // Check if anything has changed
|
||||||
|
buttonClickState.val = psbuzzButtons.val & ~oldButtonState.val; // Update click state variable
|
||||||
|
oldButtonState.val = psbuzzButtons.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t PSBuzz::OnInitSuccessful() {
|
||||||
|
if (HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID) {
|
||||||
|
Reset();
|
||||||
|
if (pFuncOnInit)
|
||||||
|
pFuncOnInit(); // Call the user function
|
||||||
|
else
|
||||||
|
setLedOnAll(); // Turn the LED on, on all four controllers
|
||||||
|
};
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool PSBuzz::getButtonPress(ButtonEnum b, uint8_t controller) {
|
||||||
|
return psbuzzButtons.val & (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
|
||||||
|
};
|
||||||
|
|
||||||
|
bool PSBuzz::getButtonClick(ButtonEnum b, uint8_t controller) {
|
||||||
|
uint32_t mask = (1UL << (b + 5 * controller)); // Each controller uses 5 bits, so the value is shifted 5 for each controller
|
||||||
|
bool click = buttonClickState.val & mask;
|
||||||
|
buttonClickState.val &= ~mask; // Clear "click" event
|
||||||
|
return click;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Source: http://www.developerfusion.com/article/84338/making-usb-c-friendly/ and https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
|
||||||
|
void PSBuzz::setLedRaw(bool value, uint8_t controller) {
|
||||||
|
ledState[controller] = value; // Save value for next time it is called
|
||||||
|
|
||||||
|
uint8_t buf[7];
|
||||||
|
buf[0] = 0x00;
|
||||||
|
buf[1] = ledState[0] ? 0xFF : 0x00;
|
||||||
|
buf[2] = ledState[1] ? 0xFF : 0x00;
|
||||||
|
buf[3] = ledState[2] ? 0xFF : 0x00;
|
||||||
|
buf[4] = ledState[3] ? 0xFF : 0x00;
|
||||||
|
buf[5] = 0x00;
|
||||||
|
buf[6] = 0x00;
|
||||||
|
|
||||||
|
PSBuzz_Command(buf, sizeof(buf));
|
||||||
|
};
|
||||||
|
|
||||||
|
void PSBuzz::PSBuzz_Command(uint8_t *data, uint16_t nbytes) {
|
||||||
|
// bmRequest = Host to device (0x00) | Class (0x20) | Interface (0x01) = 0x21, bRequest = Set Report (0x09), Report ID (0x00), Report Type (Output 0x02), interface (0x00), datalength, datalength, data)
|
||||||
|
pUsb->ctrlReq(bAddress, epInfo[0].epAddr, bmREQ_HIDOUT, HID_REQUEST_SET_REPORT, 0x00, 0x02, 0x00, nbytes, nbytes, data, NULL);
|
||||||
|
};
|
185
PSBuzz.h
Normal file
185
PSBuzz.h
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
/* Copyright (C) 2014 Kristian Lauszus, TKJ Electronics. All rights reserved.
|
||||||
|
|
||||||
|
This software may be distributed and modified under the terms of the GNU
|
||||||
|
General Public License version 2 (GPL2) as published by the Free Software
|
||||||
|
Foundation and appearing in the file GPL2.TXT included in the packaging of
|
||||||
|
this file. Please note that GPL2 Section 2[b] requires that all works based
|
||||||
|
on this software must also be made publicly available under the terms of
|
||||||
|
the GPL2 ("Copyleft").
|
||||||
|
|
||||||
|
Contact information
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Kristian Lauszus, TKJ Electronics
|
||||||
|
Web : http://www.tkjelectronics.com
|
||||||
|
e-mail : kristianl@tkjelectronics.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _psbuzz_h_
|
||||||
|
#define _psbuzz_h_
|
||||||
|
|
||||||
|
#include "hiduniversal.h"
|
||||||
|
#include "controllerEnums.h"
|
||||||
|
|
||||||
|
#define PSBUZZ_VID 0x054C // Sony Corporation
|
||||||
|
#define PSBUZZ_PID 0x1000 // PS Buzz Controller
|
||||||
|
|
||||||
|
/** Struct used to easily read the different buttons on the controllers */
|
||||||
|
union PSBUZZButtons {
|
||||||
|
struct {
|
||||||
|
uint8_t red : 1;
|
||||||
|
uint8_t yellow : 1;
|
||||||
|
uint8_t green : 1;
|
||||||
|
uint8_t orange : 1;
|
||||||
|
uint8_t blue : 1;
|
||||||
|
} __attribute__((packed)) btn[4];
|
||||||
|
uint32_t val : 20;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class implements support for the PS Buzz controllers via USB.
|
||||||
|
* It uses the HIDUniversal class for all the USB communication.
|
||||||
|
*/
|
||||||
|
class PSBuzz : public HIDUniversal {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor for the PSBuzz class.
|
||||||
|
* @param p Pointer to the USB class instance.
|
||||||
|
*/
|
||||||
|
PSBuzz(USB *p) :
|
||||||
|
HIDUniversal(p) {
|
||||||
|
Reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to check if a PS Buzz controller is connected.
|
||||||
|
* @return Returns true if it is connected.
|
||||||
|
*/
|
||||||
|
bool connected() {
|
||||||
|
return HIDUniversal::isReady() && HIDUniversal::VID == PSBUZZ_VID && HIDUniversal::PID == PSBUZZ_PID;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to call your own function when the device is successfully initialized.
|
||||||
|
* @param funcOnInit Function to call.
|
||||||
|
*/
|
||||||
|
void attachOnInit(void (*funcOnInit)(void)) {
|
||||||
|
pFuncOnInit = funcOnInit;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @name PS Buzzer Controller functions */
|
||||||
|
/**
|
||||||
|
* getButtonPress(ButtonEnum b) will return true as long as the button is held down.
|
||||||
|
*
|
||||||
|
* While getButtonClick(ButtonEnum b) will only return it once.
|
||||||
|
*
|
||||||
|
* So you instance if you need to increase a variable once you would use getButtonClick(ButtonEnum b),
|
||||||
|
* but if you need to drive a robot forward you would use getButtonPress(ButtonEnum b).
|
||||||
|
* @param b ::ButtonEnum to read.
|
||||||
|
* @param controller The controller to read from. Default to 0.
|
||||||
|
* @return getButtonPress(ButtonEnum b) will return a true as long as a button is held down, while getButtonClick(ButtonEnum b) will return true once for each button press.
|
||||||
|
*/
|
||||||
|
bool getButtonPress(ButtonEnum b, uint8_t controller = 0);
|
||||||
|
bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
|
||||||
|
/**@}*/
|
||||||
|
/** @name PS Buzzer Controller functions */
|
||||||
|
/**
|
||||||
|
* Set LED value without using ::LEDEnum.
|
||||||
|
* @param value See: ::LEDEnum.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Set LED values directly.
|
||||||
|
* @param value Used to set whenever the LED should be on or off
|
||||||
|
* @param controller The controller to control. Defaults to 0.
|
||||||
|
*/
|
||||||
|
void setLedRaw(bool value, uint8_t controller = 0);
|
||||||
|
|
||||||
|
/** Turn all LEDs off. */
|
||||||
|
void setLedOffAll() {
|
||||||
|
for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
|
||||||
|
ledState[i] = false; // Just an easy way to set all four off at the same time
|
||||||
|
setLedRaw(false); // Turn the LED off, on all four controllers
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn the LED off on a specific controller.
|
||||||
|
* @param controller The controller to turn off. Defaults to 0.
|
||||||
|
*/
|
||||||
|
void setLedOff(uint8_t controller = 0) {
|
||||||
|
setLedRaw(false, controller);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Turn all LEDs on. */
|
||||||
|
void setLedOnAll() {
|
||||||
|
for (uint8_t i = 1; i < 4; i++) // Skip first as it will be set in setLedRaw
|
||||||
|
ledState[i] = true; // Just an easy way to set all four off at the same time
|
||||||
|
setLedRaw(true); // Turn the LED on, on all four controllers
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn the LED on on a specific controller.
|
||||||
|
* @param controller The controller to turn off. Defaults to 0.
|
||||||
|
*/
|
||||||
|
void setLedOn(uint8_t controller = 0) {
|
||||||
|
setLedRaw(true, controller);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggle the LED on a specific controller.
|
||||||
|
* @param controller The controller to turn off. Defaults to 0.
|
||||||
|
*/
|
||||||
|
void setLedToggle(uint8_t controller = 0) {
|
||||||
|
setLedRaw(!ledState[controller], controller);
|
||||||
|
};
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** @name HIDUniversal implementation */
|
||||||
|
/**
|
||||||
|
* Used to parse USB HID data.
|
||||||
|
* @param hid Pointer to the HID class.
|
||||||
|
* @param is_rpt_id Only used for Hubs.
|
||||||
|
* @param len The length of the incoming data.
|
||||||
|
* @param buf Pointer to the data buffer.
|
||||||
|
*/
|
||||||
|
virtual void ParseHIDData(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a device is successfully initialized.
|
||||||
|
* Use attachOnInit(void (*funcOnInit)(void)) to call your own function.
|
||||||
|
* This is useful for instance if you want to set the LEDs in a specific way.
|
||||||
|
*/
|
||||||
|
virtual uint8_t OnInitSuccessful();
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/** Used to reset the different buffers to their default values */
|
||||||
|
void Reset() {
|
||||||
|
psbuzzButtons.val = 0;
|
||||||
|
oldButtonState.val = 0;
|
||||||
|
buttonClickState.val = 0;
|
||||||
|
for (uint8_t i = 0; i < sizeof(ledState); i++)
|
||||||
|
ledState[i] = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @name USBDeviceConfig implementation */
|
||||||
|
/**
|
||||||
|
* Used by the USB core to check what this driver support.
|
||||||
|
* @param vid The device's VID.
|
||||||
|
* @param pid The device's PID.
|
||||||
|
* @return Returns true if the device's VID and PID matches this driver.
|
||||||
|
*/
|
||||||
|
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
|
||||||
|
return (vid == PSBUZZ_VID && pid == PSBUZZ_PID);
|
||||||
|
};
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
void (*pFuncOnInit)(void); // Pointer to function called in onInit()
|
||||||
|
|
||||||
|
void PSBuzz_Command(uint8_t *data, uint16_t nbytes);
|
||||||
|
|
||||||
|
PSBUZZButtons psbuzzButtons, oldButtonState, buttonClickState;
|
||||||
|
bool ledState[4];
|
||||||
|
};
|
||||||
|
#endif
|
55
README.md
55
README.md
|
@ -22,10 +22,30 @@ For more information about the hardware see the [Hardware Manual](http://www.cir
|
||||||
* __Alexei Glushchenko, Circuits@Home__ - <alex-gl@mail.ru>
|
* __Alexei Glushchenko, Circuits@Home__ - <alex-gl@mail.ru>
|
||||||
* Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
|
* Developers of the USB Core, HID, FTDI, ADK, ACM, and PL2303 libraries
|
||||||
* __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
|
* __Kristian Lauszus, TKJ Electronics__ - <kristianl@tkjelectronics.com>
|
||||||
* Developer of the [BTD](#bluetooth-libraries), [BTHID](#bthid-library), [SPP](#spp-library), [PS4](#ps4-library), [PS3](#ps3-library), [Wii](#wii-library), and [Xbox](#xbox-library) libraries
|
* Developer of the [BTD](#bluetooth-libraries), [BTHID](#bthid-library), [SPP](#spp-library), [PS4](#ps4-library), [PS3](#ps3-library), [Wii](#wii-library), [Xbox](#xbox-library), and [PSBuzz](#ps-buzz-library) libraries
|
||||||
* __Andrew Kroll__ - <xxxajk@gmail.com>
|
* __Andrew Kroll__ - <xxxajk@gmail.com>
|
||||||
* Major contributor to mass storage code
|
* Major contributor to mass storage code
|
||||||
|
|
||||||
|
# Table of Contents
|
||||||
|
|
||||||
|
* [How to include the library](#how-to-include-the-library)
|
||||||
|
* [How to use the library](#how-to-use-the-library)
|
||||||
|
* [Documentation](#documentation)
|
||||||
|
* [Enable debugging](#enable-debugging)
|
||||||
|
* [Boards](#boards)
|
||||||
|
* [Bluetooth libraries](#bluetooth-libraries)
|
||||||
|
* [BTHID library](#bthid-library)
|
||||||
|
* [SPP library](#spp-library)
|
||||||
|
* [PS4 Library](#ps4-library)
|
||||||
|
* [PS3 Library](#ps3-library)
|
||||||
|
* [Xbox Libraries](#xbox-libraries)
|
||||||
|
* [Xbox library](#xbox-library)
|
||||||
|
* [Xbox 360 Library](#xbox-360-library)
|
||||||
|
* [Wii library](#wii-library)
|
||||||
|
* [PS Buzz Library](#ps-buzz-library)
|
||||||
|
* [Interface modifications](#interface-modifications)
|
||||||
|
* [FAQ](#faq)
|
||||||
|
|
||||||
# How to include the library
|
# How to include the library
|
||||||
|
|
||||||
First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
|
First download the library by clicking on the following link: <https://github.com/felis/USB_Host_Shield_2.0/archive/master.zip>.
|
||||||
|
@ -240,6 +260,39 @@ All the information about the Wii controllers are from these sites:
|
||||||
* <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
|
* <http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus>
|
||||||
* The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
|
* The old library created by _Tomoyuki Tanaka_: <https://github.com/moyuchin/WiiRemote_on_Arduino> also helped a lot.
|
||||||
|
|
||||||
|
### [PS Buzz Library](PSBuzz.cpp)
|
||||||
|
|
||||||
|
This library implements support for the Playstation Buzz controllers via USB.
|
||||||
|
|
||||||
|
It is essentially just a wrapper around the [HIDUniversal](hiduniversal.cpp) which takes care of the initializing and reading of the controllers. The [PSBuzz](PSBuzz.cpp) class simply inherits this and parses the data, so it is easy for users to read the buttons and turn the big red button on the controllers on and off.
|
||||||
|
|
||||||
|
The example [PSBuzz.ino](examples/PSBuzz/PSBuzz.ino) shows how one can do this with just a few lines of code.
|
||||||
|
|
||||||
|
More information about the controller can be found at the following sites:
|
||||||
|
|
||||||
|
* http://www.developerfusion.com/article/84338/making-usb-c-friendly/
|
||||||
|
* https://github.com/torvalds/linux/blob/master/drivers/hid/hid-sony.c
|
||||||
|
|
||||||
|
# Interface modifications
|
||||||
|
|
||||||
|
The shield is using SPI for communicating with the MAX3421E USB host controller. It uses the SCK, MISO and MOSI pins via the ICSP on your board.
|
||||||
|
|
||||||
|
Furthermore it uses one pin as SS and one INT pin. These are by default located on pin 10 and 9 respectively. They can easily be reconfigured in case you need to use them for something else by cutting the jumper on the shield and then solder a wire from the pad to the new pin.
|
||||||
|
|
||||||
|
After that you need modify the following entry in [UsbCore.h](UsbCore.h):
|
||||||
|
|
||||||
|
```C++
|
||||||
|
typedef MAX3421e<P10, P9> MAX3421E;
|
||||||
|
```
|
||||||
|
|
||||||
|
For instance if you have rerouted SS to pin 7 it should read:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
typedef MAX3421e<P7, P9> MAX3421E;
|
||||||
|
```
|
||||||
|
|
||||||
|
See the "Interface modifications" section in the [hardware manual](https://www.circuitsathome.com/usb-host-shield-hardware-manual) for more information.
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
|
|
||||||
> When I plug my device into the USB connector nothing happens?
|
> When I plug my device into the USB connector nothing happens?
|
||||||
|
|
155
SPP.cpp
155
SPP.cpp
|
@ -538,15 +538,15 @@ void SPP::serviceNotSupported(uint8_t transactionIDHigh, uint8_t transactionIDLo
|
||||||
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
||||||
l2capoutbuf[1] = transactionIDHigh;
|
l2capoutbuf[1] = transactionIDHigh;
|
||||||
l2capoutbuf[2] = transactionIDLow;
|
l2capoutbuf[2] = transactionIDLow;
|
||||||
l2capoutbuf[3] = 0x00; // Parameter Length
|
l2capoutbuf[3] = 0x00; // MSB Parameter Length
|
||||||
l2capoutbuf[4] = 0x05; // Parameter Length
|
l2capoutbuf[4] = 0x05; // LSB Parameter Length = 5
|
||||||
l2capoutbuf[5] = 0x00; // AttributeListsByteCount
|
l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
|
||||||
l2capoutbuf[6] = 0x02; // AttributeListsByteCount
|
l2capoutbuf[6] = 0x02; // LSB AttributeListsByteCount = 2
|
||||||
|
|
||||||
/* Attribute ID/Value Sequence: */
|
/* Attribute ID/Value Sequence: */
|
||||||
l2capoutbuf[7] = 0x35;
|
l2capoutbuf[7] = 0x35; // Data element sequence - length in next byte
|
||||||
l2capoutbuf[8] = 0x00;
|
l2capoutbuf[8] = 0x00; // Length = 0
|
||||||
l2capoutbuf[9] = 0x00;
|
l2capoutbuf[9] = 0x00; // No continuation state
|
||||||
|
|
||||||
SDP_Command(l2capoutbuf, 10);
|
SDP_Command(l2capoutbuf, 10);
|
||||||
}
|
}
|
||||||
|
@ -555,56 +555,60 @@ void SPP::serialPortResponse1(uint8_t transactionIDHigh, uint8_t transactionIDLo
|
||||||
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
||||||
l2capoutbuf[1] = transactionIDHigh;
|
l2capoutbuf[1] = transactionIDHigh;
|
||||||
l2capoutbuf[2] = transactionIDLow;
|
l2capoutbuf[2] = transactionIDLow;
|
||||||
l2capoutbuf[3] = 0x00; // Parameter Length
|
l2capoutbuf[3] = 0x00; // MSB Parameter Length
|
||||||
l2capoutbuf[4] = 0x2B; // Parameter Length
|
l2capoutbuf[4] = 0x2B; // LSB Parameter Length = 43
|
||||||
l2capoutbuf[5] = 0x00; // AttributeListsByteCount
|
l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
|
||||||
l2capoutbuf[6] = 0x26; // AttributeListsByteCount
|
l2capoutbuf[6] = 0x26; // LSB AttributeListsByteCount = 38
|
||||||
|
|
||||||
/* Attribute ID/Value Sequence: */
|
/* Attribute ID/Value Sequence: */
|
||||||
l2capoutbuf[7] = 0x36;
|
l2capoutbuf[7] = 0x36; // Data element sequence - length in next two bytes
|
||||||
l2capoutbuf[8] = 0x00;
|
l2capoutbuf[8] = 0x00; // MSB Length
|
||||||
l2capoutbuf[9] = 0x3C;
|
l2capoutbuf[9] = 0x3C; // LSB Length = 60
|
||||||
l2capoutbuf[10] = 0x36;
|
|
||||||
l2capoutbuf[11] = 0x00;
|
|
||||||
|
|
||||||
l2capoutbuf[12] = 0x39;
|
l2capoutbuf[10] = 0x36; // Data element sequence - length in next two bytes
|
||||||
l2capoutbuf[13] = 0x09;
|
l2capoutbuf[11] = 0x00; // MSB Length
|
||||||
l2capoutbuf[14] = 0x00;
|
l2capoutbuf[12] = 0x39; // LSB Length = 57
|
||||||
l2capoutbuf[15] = 0x00;
|
|
||||||
l2capoutbuf[16] = 0x0A;
|
l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
l2capoutbuf[17] = 0x00;
|
l2capoutbuf[14] = 0x00; // MSB ServiceRecordHandle
|
||||||
|
l2capoutbuf[15] = 0x00; // LSB ServiceRecordHandle
|
||||||
|
l2capoutbuf[16] = 0x0A; // Unsigned int - length 4 bytes
|
||||||
|
l2capoutbuf[17] = 0x00; // ServiceRecordHandle value - TODO: Is this related to HCI_Handle?
|
||||||
l2capoutbuf[18] = 0x01;
|
l2capoutbuf[18] = 0x01;
|
||||||
l2capoutbuf[19] = 0x00;
|
l2capoutbuf[19] = 0x00;
|
||||||
l2capoutbuf[20] = 0x06;
|
l2capoutbuf[20] = 0x06;
|
||||||
l2capoutbuf[21] = 0x09;
|
|
||||||
l2capoutbuf[22] = 0x00;
|
|
||||||
l2capoutbuf[23] = 0x01;
|
|
||||||
l2capoutbuf[24] = 0x35;
|
|
||||||
l2capoutbuf[25] = 0x03;
|
|
||||||
l2capoutbuf[26] = 0x19;
|
|
||||||
l2capoutbuf[27] = 0x11;
|
|
||||||
|
|
||||||
l2capoutbuf[28] = 0x01;
|
l2capoutbuf[21] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
l2capoutbuf[29] = 0x09;
|
l2capoutbuf[22] = 0x00; // MSB ServiceClassIDList
|
||||||
l2capoutbuf[30] = 0x00;
|
l2capoutbuf[23] = 0x01; // LSB ServiceClassIDList
|
||||||
l2capoutbuf[31] = 0x04;
|
l2capoutbuf[24] = 0x35; // Data element sequence - length in next byte
|
||||||
l2capoutbuf[32] = 0x35;
|
l2capoutbuf[25] = 0x03; // Length = 3
|
||||||
l2capoutbuf[33] = 0x0C;
|
l2capoutbuf[26] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
|
||||||
l2capoutbuf[34] = 0x35;
|
l2capoutbuf[27] = 0x11; // MSB SerialPort
|
||||||
l2capoutbuf[35] = 0x03;
|
l2capoutbuf[28] = 0x01; // LSB SerialPort
|
||||||
l2capoutbuf[36] = 0x19;
|
|
||||||
l2capoutbuf[37] = 0x01;
|
|
||||||
l2capoutbuf[38] = 0x00;
|
|
||||||
l2capoutbuf[39] = 0x35;
|
|
||||||
l2capoutbuf[40] = 0x05;
|
|
||||||
l2capoutbuf[41] = 0x19;
|
|
||||||
l2capoutbuf[42] = 0x00;
|
|
||||||
l2capoutbuf[43] = 0x03;
|
|
||||||
|
|
||||||
l2capoutbuf[44] = 0x08;
|
l2capoutbuf[29] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
l2capoutbuf[45] = 0x02; // Two extra bytes
|
l2capoutbuf[30] = 0x00; // MSB ProtocolDescriptorList
|
||||||
l2capoutbuf[46] = 0x00; // 25 (0x19) more bytes to come
|
l2capoutbuf[31] = 0x04; // LSB ProtocolDescriptorList
|
||||||
l2capoutbuf[47] = 0x19;
|
l2capoutbuf[32] = 0x35; // Data element sequence - length in next byte
|
||||||
|
l2capoutbuf[33] = 0x0C; // Length = 12
|
||||||
|
|
||||||
|
l2capoutbuf[34] = 0x35; // Data element sequence - length in next byte
|
||||||
|
l2capoutbuf[35] = 0x03; // Length = 3
|
||||||
|
l2capoutbuf[36] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
|
||||||
|
l2capoutbuf[37] = 0x01; // MSB L2CAP
|
||||||
|
l2capoutbuf[38] = 0x00; // LSB L2CAP
|
||||||
|
|
||||||
|
l2capoutbuf[39] = 0x35; // Data element sequence - length in next byte
|
||||||
|
l2capoutbuf[40] = 0x05; // Length = 5
|
||||||
|
l2capoutbuf[41] = 0x19; // UUID (universally unique identifier) - length = 2 bytes
|
||||||
|
l2capoutbuf[42] = 0x00; // MSB RFCOMM
|
||||||
|
l2capoutbuf[43] = 0x03; // LSB RFCOMM
|
||||||
|
l2capoutbuf[44] = 0x08; // Unsigned Integer - length 1 byte
|
||||||
|
|
||||||
|
l2capoutbuf[45] = 0x02; // ContinuationState - Two more bytes
|
||||||
|
l2capoutbuf[46] = 0x00; // MSB length
|
||||||
|
l2capoutbuf[47] = 0x19; // LSB length = 25 more bytes to come
|
||||||
|
|
||||||
SDP_Command(l2capoutbuf, 48);
|
SDP_Command(l2capoutbuf, 48);
|
||||||
}
|
}
|
||||||
|
@ -613,40 +617,49 @@ void SPP::serialPortResponse2(uint8_t transactionIDHigh, uint8_t transactionIDLo
|
||||||
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
l2capoutbuf[0] = SDP_SERVICE_SEARCH_ATTRIBUTE_RESPONSE_PDU;
|
||||||
l2capoutbuf[1] = transactionIDHigh;
|
l2capoutbuf[1] = transactionIDHigh;
|
||||||
l2capoutbuf[2] = transactionIDLow;
|
l2capoutbuf[2] = transactionIDLow;
|
||||||
l2capoutbuf[3] = 0x00; // Parameter Length
|
l2capoutbuf[3] = 0x00; // MSB Parameter Length
|
||||||
l2capoutbuf[4] = 0x1C; // Parameter Length
|
l2capoutbuf[4] = 0x1C; // LSB Parameter Length = 28
|
||||||
l2capoutbuf[5] = 0x00; // AttributeListsByteCount
|
l2capoutbuf[5] = 0x00; // MSB AttributeListsByteCount
|
||||||
l2capoutbuf[6] = 0x19; // AttributeListsByteCount
|
l2capoutbuf[6] = 0x19; // LSB AttributeListsByteCount = 25
|
||||||
|
|
||||||
/* Attribute ID/Value Sequence: */
|
/* Attribute ID/Value Sequence: */
|
||||||
l2capoutbuf[7] = 0x01;
|
l2capoutbuf[7] = 0x01; // Channel 1 - TODO: Try different values, so multiple servers can be used at once
|
||||||
l2capoutbuf[8] = 0x09;
|
|
||||||
l2capoutbuf[9] = 0x00;
|
|
||||||
l2capoutbuf[10] = 0x06;
|
|
||||||
l2capoutbuf[11] = 0x35;
|
|
||||||
|
|
||||||
l2capoutbuf[12] = 0x09;
|
l2capoutbuf[8] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
l2capoutbuf[13] = 0x09;
|
l2capoutbuf[9] = 0x00; // MSB LanguageBaseAttributeIDList
|
||||||
l2capoutbuf[14] = 0x65;
|
l2capoutbuf[10] = 0x06; // LSB LanguageBaseAttributeIDList
|
||||||
l2capoutbuf[15] = 0x6E;
|
l2capoutbuf[11] = 0x35; // Data element sequence - length in next byte
|
||||||
l2capoutbuf[16] = 0x09;
|
l2capoutbuf[12] = 0x09; // Length = 9
|
||||||
l2capoutbuf[17] = 0x00;
|
|
||||||
l2capoutbuf[18] = 0x6A;
|
// Identifier representing the natural language = en = English - see: "ISO 639:1988"
|
||||||
l2capoutbuf[19] = 0x09;
|
l2capoutbuf[13] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
|
l2capoutbuf[14] = 0x65; // 'e'
|
||||||
|
l2capoutbuf[15] = 0x6E; // 'n'
|
||||||
|
|
||||||
|
// "The second element of each triplet contains an identifier that specifies a character encoding used for the language"
|
||||||
|
// Encoding is set to 106 (UTF-8) - see: http://www.iana.org/assignments/character-sets/character-sets.xhtml
|
||||||
|
l2capoutbuf[16] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
|
l2capoutbuf[17] = 0x00; // MSB of character encoding
|
||||||
|
l2capoutbuf[18] = 0x6A; // LSB of character encoding (106)
|
||||||
|
|
||||||
|
// Attribute ID that serves as the base attribute ID for the natural language in the service record
|
||||||
|
// "To facilitate the retrieval of human-readable universal attributes in a principal language, the base attribute ID value for the primary language supported by a service record shall be 0x0100"
|
||||||
|
l2capoutbuf[19] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
l2capoutbuf[20] = 0x01;
|
l2capoutbuf[20] = 0x01;
|
||||||
l2capoutbuf[21] = 0x00;
|
l2capoutbuf[21] = 0x00;
|
||||||
l2capoutbuf[22] = 0x09;
|
|
||||||
l2capoutbuf[23] = 0x01;
|
|
||||||
l2capoutbuf[24] = 0x00;
|
|
||||||
l2capoutbuf[25] = 0x25;
|
|
||||||
|
|
||||||
|
l2capoutbuf[22] = 0x09; // Unsigned Integer - length 2 bytes
|
||||||
|
l2capoutbuf[23] = 0x01; // MSB ServiceDescription
|
||||||
|
l2capoutbuf[24] = 0x00; // LSB ServiceDescription
|
||||||
|
|
||||||
|
l2capoutbuf[25] = 0x25; // Text string - length in next byte
|
||||||
l2capoutbuf[26] = 0x05; // Name length
|
l2capoutbuf[26] = 0x05; // Name length
|
||||||
l2capoutbuf[27] = 'T';
|
l2capoutbuf[27] = 'T';
|
||||||
l2capoutbuf[28] = 'K';
|
l2capoutbuf[28] = 'K';
|
||||||
l2capoutbuf[29] = 'J';
|
l2capoutbuf[29] = 'J';
|
||||||
l2capoutbuf[30] = 'S';
|
l2capoutbuf[30] = 'S';
|
||||||
l2capoutbuf[31] = 'P';
|
l2capoutbuf[31] = 'P';
|
||||||
l2capoutbuf[32] = 0x00; // No more data
|
l2capoutbuf[32] = 0x00; // No continuation state
|
||||||
|
|
||||||
SDP_Command(l2capoutbuf, 33);
|
SDP_Command(l2capoutbuf, 33);
|
||||||
}
|
}
|
||||||
|
|
80
avrpins.h
80
avrpins.h
|
@ -861,11 +861,87 @@ public: \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
MAKE_PIN(P9, PIOC, PIO_PC21); // INT
|
// See: http://arduino.cc/en/Hacking/PinMappingSAM3X and variant.cpp
|
||||||
MAKE_PIN(P10, PIOC, PIO_PC29); // SS
|
|
||||||
|
MAKE_PIN(P0, PIOA, PIO_PA8);
|
||||||
|
MAKE_PIN(P1, PIOA, PIO_PA9);
|
||||||
|
MAKE_PIN(P2, PIOB, PIO_PB25);
|
||||||
|
MAKE_PIN(P3, PIOC, PIO_PC28);
|
||||||
|
MAKE_PIN(P4, PIOC, PIO_PC26);
|
||||||
|
MAKE_PIN(P5, PIOC, PIO_PC25);
|
||||||
|
MAKE_PIN(P6, PIOC, PIO_PC24);
|
||||||
|
MAKE_PIN(P7, PIOC, PIO_PC23);
|
||||||
|
MAKE_PIN(P8, PIOC, PIO_PC22);
|
||||||
|
MAKE_PIN(P9, PIOC, PIO_PC21);
|
||||||
|
MAKE_PIN(P10, PIOC, PIO_PC29);
|
||||||
|
MAKE_PIN(P11, PIOD, PIO_PD7);
|
||||||
|
MAKE_PIN(P12, PIOD, PIO_PD8);
|
||||||
|
MAKE_PIN(P13, PIOB, PIO_PB27);
|
||||||
|
MAKE_PIN(P14, PIOD, PIO_PD4);
|
||||||
|
MAKE_PIN(P15, PIOD, PIO_PD5);
|
||||||
|
MAKE_PIN(P16, PIOA, PIO_PA13);
|
||||||
|
MAKE_PIN(P17, PIOA, PIO_PA12);
|
||||||
|
MAKE_PIN(P18, PIOA, PIO_PA11);
|
||||||
|
MAKE_PIN(P19, PIOA, PIO_PA10);
|
||||||
|
MAKE_PIN(P20, PIOB, PIO_PB12);
|
||||||
|
MAKE_PIN(P21, PIOB, PIO_PB13);
|
||||||
|
MAKE_PIN(P22, PIOB, PIO_PB26);
|
||||||
|
MAKE_PIN(P23, PIOA, PIO_PA14);
|
||||||
|
MAKE_PIN(P24, PIOA, PIO_PA15);
|
||||||
|
MAKE_PIN(P25, PIOD, PIO_PD0);
|
||||||
|
MAKE_PIN(P26, PIOD, PIO_PD1);
|
||||||
|
MAKE_PIN(P27, PIOD, PIO_PD2);
|
||||||
|
MAKE_PIN(P28, PIOD, PIO_PD3);
|
||||||
|
MAKE_PIN(P29, PIOD, PIO_PD6);
|
||||||
|
MAKE_PIN(P30, PIOD, PIO_PD9);
|
||||||
|
MAKE_PIN(P31, PIOA, PIO_PA7);
|
||||||
|
MAKE_PIN(P32, PIOD, PIO_PD10);
|
||||||
|
MAKE_PIN(P33, PIOC, PIO_PC1);
|
||||||
|
MAKE_PIN(P34, PIOC, PIO_PC2);
|
||||||
|
MAKE_PIN(P35, PIOC, PIO_PC3);
|
||||||
|
MAKE_PIN(P36, PIOC, PIO_PC4);
|
||||||
|
MAKE_PIN(P37, PIOC, PIO_PC5);
|
||||||
|
MAKE_PIN(P38, PIOC, PIO_PC6);
|
||||||
|
MAKE_PIN(P39, PIOC, PIO_PC7);
|
||||||
|
MAKE_PIN(P40, PIOC, PIO_PC8);
|
||||||
|
MAKE_PIN(P41, PIOC, PIO_PC9);
|
||||||
|
MAKE_PIN(P42, PIOA, PIO_PA19);
|
||||||
|
MAKE_PIN(P43, PIOA, PIO_PA20);
|
||||||
|
MAKE_PIN(P44, PIOC, PIO_PC19);
|
||||||
|
MAKE_PIN(P45, PIOC, PIO_PC18);
|
||||||
|
MAKE_PIN(P46, PIOC, PIO_PC17);
|
||||||
|
MAKE_PIN(P47, PIOC, PIO_PC16);
|
||||||
|
MAKE_PIN(P48, PIOC, PIO_PC15);
|
||||||
|
MAKE_PIN(P49, PIOC, PIO_PC14);
|
||||||
|
MAKE_PIN(P50, PIOC, PIO_PC13);
|
||||||
|
MAKE_PIN(P51, PIOC, PIO_PC12);
|
||||||
|
MAKE_PIN(P52, PIOB, PIO_PB21);
|
||||||
|
MAKE_PIN(P53, PIOB, PIO_PB14);
|
||||||
|
MAKE_PIN(P54, PIOA, PIO_PA16);
|
||||||
|
MAKE_PIN(P55, PIOA, PIO_PA24);
|
||||||
|
MAKE_PIN(P56, PIOA, PIO_PA23);
|
||||||
|
MAKE_PIN(P57, PIOA, PIO_PA22);
|
||||||
|
MAKE_PIN(P58, PIOA, PIO_PA6);
|
||||||
|
MAKE_PIN(P59, PIOA, PIO_PA4);
|
||||||
|
MAKE_PIN(P60, PIOA, PIO_PA3);
|
||||||
|
MAKE_PIN(P61, PIOA, PIO_PA2);
|
||||||
|
MAKE_PIN(P62, PIOB, PIO_PB17);
|
||||||
|
MAKE_PIN(P63, PIOB, PIO_PB18);
|
||||||
|
MAKE_PIN(P64, PIOB, PIO_PB19);
|
||||||
|
MAKE_PIN(P65, PIOB, PIO_PB20);
|
||||||
|
MAKE_PIN(P66, PIOB, PIO_PB15);
|
||||||
|
MAKE_PIN(P67, PIOB, PIO_PB16);
|
||||||
|
MAKE_PIN(P68, PIOA, PIO_PA1);
|
||||||
|
MAKE_PIN(P69, PIOA, PIO_PA0);
|
||||||
|
MAKE_PIN(P70, PIOA, PIO_PA17);
|
||||||
|
MAKE_PIN(P71, PIOA, PIO_PA18);
|
||||||
|
MAKE_PIN(P72, PIOC, PIO_PC30);
|
||||||
|
MAKE_PIN(P73, PIOA, PIO_PA21);
|
||||||
MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
|
MAKE_PIN(P74, PIOA, PIO_PA25); // MISO
|
||||||
MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
|
MAKE_PIN(P75, PIOA, PIO_PA26); // MOSI
|
||||||
MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
|
MAKE_PIN(P76, PIOA, PIO_PA27); // CLK
|
||||||
|
MAKE_PIN(P77, PIOA, PIO_PA28);
|
||||||
|
MAKE_PIN(P78, PIOB, PIO_PB23); // Unconnected
|
||||||
|
|
||||||
#undef MAKE_PIN
|
#undef MAKE_PIN
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,14 @@ enum ButtonEnum {
|
||||||
BLACK = 8, // Available on the original Xbox controller
|
BLACK = 8, // Available on the original Xbox controller
|
||||||
WHITE = 9, // Available on the original Xbox controller
|
WHITE = 9, // Available on the original Xbox controller
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
/** PS Buzz controllers */
|
||||||
|
RED = 0,
|
||||||
|
YELLOW = 1,
|
||||||
|
GREEN = 2,
|
||||||
|
ORANGE = 3,
|
||||||
|
BLUE = 4,
|
||||||
|
/**@}*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Joysticks on the PS3 and Xbox controllers. */
|
/** Joysticks on the PS3 and Xbox controllers. */
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include <SPP.h>
|
#include <SPP.h>
|
||||||
#include <usbhub.h>
|
#include <usbhub.h>
|
||||||
// Satisfy IDE, which only needs to see the include statment in the ino.
|
// Satisfy IDE, which only needs to see the include statement in the ino.
|
||||||
#ifdef dobogusinclude
|
#ifdef dobogusinclude
|
||||||
#include <spi4teensy3.h>
|
#include <spi4teensy3.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,10 +15,11 @@ USB Usb;
|
||||||
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
//USBHub Hub1(&Usb); // Some dongles have a hub inside
|
||||||
|
|
||||||
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
|
||||||
SPP *SerialBT[2]; // We will use this pointer to store the two instance, you can easily make it larger if you like, but it will use a lot of RAM!
|
|
||||||
const uint8_t length = sizeof(SerialBT) / sizeof(SerialBT[0]); // Get the lenght of the array
|
const uint8_t length = 2; // Set the number of instances here
|
||||||
|
SPP *SerialBT[length]; // We will use this pointer to store the instances, you can easily make it larger if you like, but it will use a lot of RAM!
|
||||||
|
|
||||||
boolean firstMessage[length] = { true }; // Set all to true
|
boolean firstMessage[length] = { true }; // Set all to true
|
||||||
uint8_t buffer[50];
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
for (uint8_t i = 0; i < length; i++)
|
for (uint8_t i = 0; i < length; i++)
|
||||||
|
@ -28,10 +29,11 @@ void setup() {
|
||||||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||||
if (Usb.Init() == -1) {
|
if (Usb.Init() == -1) {
|
||||||
Serial.print(F("\r\nOSC did not start"));
|
Serial.print(F("\r\nOSC did not start"));
|
||||||
while (1); //halt
|
while (1); // Halt
|
||||||
}
|
}
|
||||||
Serial.print(F("\r\nSPP Bluetooth Library Started"));
|
Serial.print(F("\r\nSPP Bluetooth Library Started"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well
|
Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well
|
||||||
|
|
||||||
|
@ -47,22 +49,15 @@ void loop() {
|
||||||
else
|
else
|
||||||
firstMessage[i] = true;
|
firstMessage[i] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the connection you want to send to using the first character
|
||||||
|
// For instance "0Hello World" would send "Hello World" to connection 0
|
||||||
if (Serial.available()) {
|
if (Serial.available()) {
|
||||||
delay(10); // Wait for the rest of the data to arrive
|
delay(10); // Wait for the rest of the data to arrive
|
||||||
uint8_t i = 0;
|
uint8_t id = Serial.read() - '0'; // Convert from ASCII
|
||||||
while (Serial.available() && i < sizeof(buffer)) // Read the data
|
if (id < length && SerialBT[id]->connected) { // Make sure that the id is valid and make sure that a device is actually connected
|
||||||
buffer[i++] = Serial.read();
|
while (Serial.available()) // Check if data is available
|
||||||
/*
|
SerialBT[id]->write(Serial.read()); // Send the data
|
||||||
Set the connection you want to send to using the first character
|
|
||||||
For instace "0Hello World" would send "Hello World" to connection 0
|
|
||||||
*/
|
|
||||||
uint8_t id = buffer[0] - '0'; // Convert from ASCII
|
|
||||||
if (id < length && i > 1) { // And then compare to length and make sure there is any text
|
|
||||||
if (SerialBT[id]->connected) { // Check if a device is actually connected
|
|
||||||
for (uint8_t i2 = 0; i2 < i - 1; i2++) // Don't include the first character
|
|
||||||
buffer[i2] = buffer[i2 + 1];
|
|
||||||
SerialBT[id]->write(buffer, i - 1); // Send the data
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
46
examples/PSBuzz/PSBuzz.ino
Normal file
46
examples/PSBuzz/PSBuzz.ino
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
Example sketch for the Playstation Buzz library - developed by Kristian Lauszus
|
||||||
|
For more information visit my blog: http://blog.tkjelectronics.dk/ or
|
||||||
|
send me an e-mail: kristianl@tkjelectronics.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <PSBuzz.h>
|
||||||
|
|
||||||
|
// Satisfy IDE, which only needs to see the include statment in the ino.
|
||||||
|
#ifdef dobogusinclude
|
||||||
|
#include <spi4teensy3.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
USB Usb;
|
||||||
|
PSBuzz Buzz(&Usb);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
||||||
|
if (Usb.Init() == -1) {
|
||||||
|
Serial.print(F("\r\nOSC did not start"));
|
||||||
|
while (1); // Halt
|
||||||
|
}
|
||||||
|
Serial.println(F("\r\nPS Buzz Library Started"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Usb.Task();
|
||||||
|
|
||||||
|
if (Buzz.connected()) {
|
||||||
|
for (uint8_t i = 0; i < 4; i++) {
|
||||||
|
if (Buzz.getButtonClick(RED, i)) {
|
||||||
|
Buzz.setLedToggle(i); // Toggle the LED
|
||||||
|
Serial.println(F("RED"));
|
||||||
|
}
|
||||||
|
if (Buzz.getButtonClick(YELLOW, i))
|
||||||
|
Serial.println(F("YELLOW"));
|
||||||
|
if (Buzz.getButtonClick(GREEN, i))
|
||||||
|
Serial.println(F("GREEN"));
|
||||||
|
if (Buzz.getButtonClick(ORANGE, i))
|
||||||
|
Serial.println(F("ORANGE"));
|
||||||
|
if (Buzz.getButtonClick(BLUE, i))
|
||||||
|
Serial.println(F("BLUE"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1 @@
|
||||||
Subproject commit d35bb955e3818f0c14e47c8a1998003da8dc1b5a
|
Subproject commit 7ada91a90027ccb7558b74087fb68d3940ecf64d
|
|
@ -9,6 +9,10 @@
|
||||||
BOARD = mega
|
BOARD = mega
|
||||||
PROGRAMMER = arduino
|
PROGRAMMER = arduino
|
||||||
|
|
||||||
|
#BOARD = teensypp2
|
||||||
|
#BOARD = teensy3
|
||||||
|
#BOARD = teensy31
|
||||||
|
|
||||||
# set your Arduino tty port here
|
# set your Arduino tty port here
|
||||||
PORT = /dev/ttyUSB0
|
PORT = /dev/ttyUSB0
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 7fd6a306ca53d08bf53b2bbfc1b80eb056f2c55b
|
Subproject commit b119b97e1484a08aebcf24e070113d78c82fb023
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0b8e3076b5a072251e01cfc6e6333b364d4e71e7
|
Subproject commit 72b5bf467a1c2479ba7354ee4d864e382c167425
|
174
examples/testusbhostFAT/testusbhostFAT.ino
Normal file → Executable file
174
examples/testusbhostFAT/testusbhostFAT.ino
Normal file → Executable file
|
@ -19,35 +19,39 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
// Please Note: //
|
||||||
|
// This section is for info with the Arduino IDE ONLY. //
|
||||||
|
// Unfortunately due to short sightedness of the Arduino //
|
||||||
|
// code team, that you must set the following in the //
|
||||||
|
// respective libraries. //
|
||||||
|
// Changing them here will have _NO_ effect! //
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Uncomment to enable debugging
|
||||||
|
//#define DEBUG_USB_HOST
|
||||||
|
// This is where stderr/USB debugging goes to
|
||||||
|
//#define USB_HOST_SERIAL Serial3
|
||||||
|
|
||||||
|
// If you have external memory, setting this to 0 enables FAT table caches.
|
||||||
|
// The 0 setting is recommended only if you have external memory.
|
||||||
|
//#define _FS_TINY 1
|
||||||
|
|
||||||
|
//#define _USE_LFN 3
|
||||||
|
//#define EXT_RAM_STACK 1
|
||||||
|
//#define EXT_RAM_HEAP 1
|
||||||
|
//#define _MAX_SS 512
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
// End of Arduino IDE specific information //
|
||||||
|
/////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// You can set this to 0 if you are not using a USB hub.
|
// You can set this to 0 if you are not using a USB hub.
|
||||||
// It will save a little bit of flash and RAM.
|
// It will save a little bit of flash and RAM.
|
||||||
// Set to 1 if you want to use a hub.
|
// Set to 1 if you want to use a hub.
|
||||||
#define WANT_HUB_TEST 0
|
#define WANT_HUB_TEST 0
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////
|
#if defined(__AVR__)
|
||||||
// Please Note: This section is for Arduino IDE ONLY. //
|
|
||||||
// Use of Make creates a flash image that is 3.3KB smaller //
|
|
||||||
/////////////////////////////////////////////////////////////
|
|
||||||
#ifndef USING_MAKEFILE
|
|
||||||
// Uncomment to enable debugging
|
|
||||||
//#define DEBUG_USB_HOST
|
|
||||||
// This is where stderr/USB debugging goes to
|
|
||||||
#define USB_HOST_SERIAL Serial3
|
|
||||||
// If you have external memory, setting this to 0 enables FAT table caches.
|
|
||||||
// The 0 setting is recommended only if you have external memory.
|
|
||||||
#define _FS_TINY 1
|
|
||||||
|
|
||||||
// These you can safely leave alone.
|
|
||||||
#define _USE_LFN 3
|
|
||||||
#define EXT_RAM_STACK 1
|
|
||||||
#define EXT_RAM_HEAP 1
|
|
||||||
#define _MAX_SS 512
|
|
||||||
#endif
|
|
||||||
/////////////////////////////////////////////////////////////
|
|
||||||
// End of Arduino IDE specific hacks //
|
|
||||||
/////////////////////////////////////////////////////////////
|
|
||||||
#if defined(AVR)
|
|
||||||
#include <xmem.h>
|
#include <xmem.h>
|
||||||
#else
|
#else
|
||||||
#include <spi4teensy3.h>
|
#include <spi4teensy3.h>
|
||||||
|
@ -63,7 +67,7 @@
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <RTClib.h>
|
#include <RTClib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#if defined(AVR)
|
#if defined(__AVR__)
|
||||||
static FILE tty_stdio;
|
static FILE tty_stdio;
|
||||||
static FILE tty_stderr;
|
static FILE tty_stderr;
|
||||||
volatile uint32_t LEDnext_time; // fade timeout
|
volatile uint32_t LEDnext_time; // fade timeout
|
||||||
|
@ -100,7 +104,7 @@ static storage_t sto[_VOLUMES];
|
||||||
#define mbxs 128
|
#define mbxs 128
|
||||||
static uint8_t My_Buff_x[mbxs]; /* File read buffer */
|
static uint8_t My_Buff_x[mbxs]; /* File read buffer */
|
||||||
|
|
||||||
#if defined(AVR)
|
#if defined(__AVR__)
|
||||||
|
|
||||||
#define prescale1 ((1 << WGM12) | (1 << CS10))
|
#define prescale1 ((1 << WGM12) | (1 << CS10))
|
||||||
#define prescale8 ((1 << WGM12) | (1 << CS11))
|
#define prescale8 ((1 << WGM12) | (1 << CS11))
|
||||||
|
@ -184,7 +188,7 @@ void setup() {
|
||||||
// minimum 0x00, maximum 0xff
|
// minimum 0x00, maximum 0xff
|
||||||
UsbDEBUGlvl = 0x51;
|
UsbDEBUGlvl = 0x51;
|
||||||
|
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
// make LED pin as an output:
|
// make LED pin as an output:
|
||||||
pinMode(LED_BUILTIN, OUTPUT);
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
pinMode(2, OUTPUT);
|
pinMode(2, OUTPUT);
|
||||||
|
@ -198,6 +202,18 @@ void setup() {
|
||||||
serr = true;
|
serr = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Blink LED
|
||||||
|
delay(500);
|
||||||
|
analogWrite(LED_BUILTIN, 255);
|
||||||
|
delay(500);
|
||||||
|
analogWrite(LED_BUILTIN, 0);
|
||||||
|
delay(500);
|
||||||
|
#else
|
||||||
|
while(!Serial);
|
||||||
|
Serial.begin(115200); // On the Teensy 3.x we get a delay at least!
|
||||||
|
#endif
|
||||||
|
#if defined(__AVR__)
|
||||||
// Set up stdio/stderr
|
// Set up stdio/stderr
|
||||||
tty_stdio.put = tty_std_putc;
|
tty_stdio.put = tty_std_putc;
|
||||||
tty_stdio.get = tty_std_getc;
|
tty_stdio.get = tty_std_getc;
|
||||||
|
@ -212,17 +228,7 @@ void setup() {
|
||||||
stdout = &tty_stdio;
|
stdout = &tty_stdio;
|
||||||
stdin = &tty_stdio;
|
stdin = &tty_stdio;
|
||||||
stderr = &tty_stderr;
|
stderr = &tty_stderr;
|
||||||
|
|
||||||
// Blink LED
|
|
||||||
delay(500);
|
|
||||||
analogWrite(LED_BUILTIN, 255);
|
|
||||||
delay(500);
|
|
||||||
analogWrite(LED_BUILTIN, 0);
|
|
||||||
delay(500);
|
|
||||||
#else
|
|
||||||
while(!Serial);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printf_P(PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
|
printf_P(PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
|
||||||
printf_P(PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
|
printf_P(PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
|
||||||
printf_P(PSTR("'+' and '-' increase/decrease by 0x01\r\n"));
|
printf_P(PSTR("'+' and '-' increase/decrease by 0x01\r\n"));
|
||||||
|
@ -247,8 +253,8 @@ void setup() {
|
||||||
#endif
|
#endif
|
||||||
"\r\n"));
|
"\r\n"));
|
||||||
}
|
}
|
||||||
#if defined(AVR)
|
|
||||||
|
|
||||||
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
analogWrite(LED_BUILTIN, 255);
|
analogWrite(LED_BUILTIN, 255);
|
||||||
delay(500);
|
delay(500);
|
||||||
analogWrite(LED_BUILTIN, 0);
|
analogWrite(LED_BUILTIN, 0);
|
||||||
|
@ -263,7 +269,7 @@ void setup() {
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|
||||||
LEDnext_time = millis() + 1;
|
LEDnext_time = millis() + 1;
|
||||||
#ifdef EXT_RAM
|
#if EXT_RAM
|
||||||
printf_P(PSTR("Total EXT RAM banks %i\r\n"), xmem::getTotalBanks());
|
printf_P(PSTR("Total EXT RAM banks %i\r\n"), xmem::getTotalBanks());
|
||||||
#endif
|
#endif
|
||||||
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
||||||
|
@ -276,20 +282,20 @@ void setup() {
|
||||||
#if WANT_HUB_TEST
|
#if WANT_HUB_TEST
|
||||||
for(int i = 0; i < MAX_HUBS; i++) {
|
for(int i = 0; i < MAX_HUBS; i++) {
|
||||||
Hubs[i] = new USBHub(&Usb);
|
Hubs[i] = new USBHub(&Usb);
|
||||||
#if defined(AVR)
|
#if defined(__AVR__)
|
||||||
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Initialize generic storage. This must be done before USB starts.
|
// Initialize generic storage. This must be done before USB starts.
|
||||||
InitStorage();
|
Init_Generic_Storage();
|
||||||
|
|
||||||
while(Usb.Init(1000) == -1) {
|
while(Usb.Init(1000) == -1) {
|
||||||
printf_P(PSTR("No USB HOST Shield?\r\n"));
|
printf_P(PSTR("No USB HOST Shield?\r\n"));
|
||||||
Notify(PSTR("OSC did not start."), 0x40);
|
Notify(PSTR("OSC did not start."), 0x40);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
cli();
|
cli();
|
||||||
TCCR3A = 0;
|
TCCR3A = 0;
|
||||||
TCCR3B = 0;
|
TCCR3B = 0;
|
||||||
|
@ -300,32 +306,10 @@ void setup() {
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
HEAPnext_time = millis() + 10000;
|
HEAPnext_time = millis() + 10000;
|
||||||
#else
|
|
||||||
#if 0
|
|
||||||
//
|
|
||||||
// On the teensy 3 we can raise the speed of SPI here.
|
|
||||||
//
|
|
||||||
// Default seen is 0xB8011001.
|
|
||||||
//
|
|
||||||
|
|
||||||
uint32_t ctar = SPI0_CTAR0;
|
|
||||||
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
|
|
||||||
ctar &= 0x7FFCFFF0; // 1/4 fSYS, 12.5Mhz
|
|
||||||
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
|
|
||||||
ctar |= 0x80000000; // 1/2 fSYS 25Mhz
|
|
||||||
//printf("SPI_CTAR0 = %8.8X\r\n", ctar);
|
|
||||||
|
|
||||||
uint32_t mcr = SPI0_MCR;
|
|
||||||
if(mcr & SPI_MCR_MDIS) {
|
|
||||||
SPI0_CTAR0 = ctar;
|
|
||||||
} else {
|
|
||||||
SPI0_MCR = mcr | SPI_MCR_MDIS | SPI_MCR_HALT;
|
|
||||||
SPI0_CTAR0 = ctar;
|
|
||||||
SPI0_MCR = mcr;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__AVR__)
|
||||||
|
HEAPnext_time = millis() + 10000;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void serialEvent() {
|
void serialEvent() {
|
||||||
|
@ -367,10 +351,11 @@ void serialEvent() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
|
// ALL teensy versions LACK PWM ON LED
|
||||||
|
|
||||||
ISR(TIMER3_COMPA_vect) {
|
ISR(TIMER3_COMPA_vect) {
|
||||||
if(millis() >= LEDnext_time) {
|
if((long)(millis() - LEDnext_time) >= 0L) {
|
||||||
LEDnext_time = millis() + 30;
|
LEDnext_time = millis() + 30;
|
||||||
|
|
||||||
// set the brightness of LED
|
// set the brightness of LED
|
||||||
|
@ -404,22 +389,23 @@ void die(FRESULT rc) {
|
||||||
void loop() {
|
void loop() {
|
||||||
FIL My_File_Object_x; /* File object */
|
FIL My_File_Object_x; /* File object */
|
||||||
|
|
||||||
#if defined(AVR)
|
#if defined(__AVR__)
|
||||||
// Print a heap status report about every 10 seconds.
|
// Print a heap status report about every 10 seconds.
|
||||||
if(millis() >= HEAPnext_time) {
|
if((long)(millis() - HEAPnext_time) >= 0L) {
|
||||||
if(UsbDEBUGlvl > 0x50) {
|
if(UsbDEBUGlvl > 0x50) {
|
||||||
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
||||||
}
|
}
|
||||||
HEAPnext_time = millis() + 10000;
|
HEAPnext_time = millis() + 10000;
|
||||||
}
|
}
|
||||||
TCCR3B = 0;
|
TCCR3B = 0;
|
||||||
#else
|
#endif
|
||||||
// Arm suffers here, oh well...
|
#if defined(CORE_TEENSY)
|
||||||
|
// Teensy suffers here, oh well...
|
||||||
serialEvent();
|
serialEvent();
|
||||||
#endif
|
#endif
|
||||||
// Horrid! This sort of thing really belongs in an ISR, not here!
|
// Horrid! This sort of thing really belongs in an ISR, not here!
|
||||||
// We also will be needing to test each hub port, we don't do this yet!
|
// We also will be needing to test each hub port, we don't do this yet!
|
||||||
if(!change && !usbon && millis() >= usbon_time) {
|
if(!change && !usbon && (long)(millis() - usbon_time) >= 0L) {
|
||||||
change = true;
|
change = true;
|
||||||
usbon = true;
|
usbon = true;
|
||||||
}
|
}
|
||||||
|
@ -439,13 +425,13 @@ void loop() {
|
||||||
if(current_state != last_state) {
|
if(current_state != last_state) {
|
||||||
if(UsbDEBUGlvl > 0x50)
|
if(UsbDEBUGlvl > 0x50)
|
||||||
printf_P(PSTR("USB state = %x\r\n"), current_state);
|
printf_P(PSTR("USB state = %x\r\n"), current_state);
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
if(current_state == USB_STATE_RUNNING) {
|
if(current_state == USB_STATE_RUNNING) {
|
||||||
fadeAmount = 30;
|
fadeAmount = 30;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(current_state == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
|
if(current_state == USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE) {
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
fadeAmount = 80;
|
fadeAmount = 80;
|
||||||
#endif
|
#endif
|
||||||
partsready = false;
|
partsready = false;
|
||||||
|
@ -468,23 +454,24 @@ void loop() {
|
||||||
}
|
}
|
||||||
// This is horrible, and needs to be moved elsewhere!
|
// This is horrible, and needs to be moved elsewhere!
|
||||||
for(int B = 0; B < MAX_USB_MS_DRIVERS; B++) {
|
for(int B = 0; B < MAX_USB_MS_DRIVERS; B++) {
|
||||||
if(!partsready && (Bulk[B]->GetAddress() != NULL)) {
|
if(!partsready && (UHS_USB_BulkOnly[B]->GetAddress() != NULL)) {
|
||||||
|
|
||||||
// Build a list.
|
// Build a list.
|
||||||
int ML = Bulk[B]->GetbMaxLUN();
|
int ML = UHS_USB_BulkOnly[B]->GetbMaxLUN();
|
||||||
//printf("MAXLUN = %i\r\n", ML);
|
//printf("MAXLUN = %i\r\n", ML);
|
||||||
ML++;
|
ML++;
|
||||||
for(int i = 0; i < ML; i++) {
|
for(int i = 0; i < ML; i++) {
|
||||||
if(Bulk[B]->LUNIsGood(i)) {
|
if(UHS_USB_BulkOnly[B]->LUNIsGood(i)) {
|
||||||
partsready = true;
|
partsready = true;
|
||||||
((pvt_t *)(sto[i].private_data))->lun = i;
|
((pvt_t *)(sto[i].private_data))->lun = i;
|
||||||
((pvt_t *)(sto[i].private_data))->B = B;
|
((pvt_t *)(sto[i].private_data))->B = B;
|
||||||
sto[i].Reads = *PReads;
|
sto[i].Reads = *UHS_USB_BulkOnly_Read;
|
||||||
sto[i].Writes = *PWrites;
|
sto[i].Writes = *UHS_USB_BulkOnly_Write;
|
||||||
sto[i].Status = *PStatus;
|
sto[i].Status = *UHS_USB_BulkOnly_Status;
|
||||||
|
sto[i].Initialize = *UHS_USB_BulkOnly_Initialize;
|
||||||
sto[i].Commit = *UHS_USB_BulkOnly_Commit;
|
sto[i].Commit = *UHS_USB_BulkOnly_Commit;
|
||||||
sto[i].TotalSectors = Bulk[B]->GetCapacity(i);
|
sto[i].TotalSectors = UHS_USB_BulkOnly[B]->GetCapacity(i);
|
||||||
sto[i].SectorSize = Bulk[B]->GetSectorSize(i);
|
sto[i].SectorSize = UHS_USB_BulkOnly[B]->GetSectorSize(i);
|
||||||
printf_P(PSTR("LUN:\t\t%u\r\n"), i);
|
printf_P(PSTR("LUN:\t\t%u\r\n"), i);
|
||||||
printf_P(PSTR("Total Sectors:\t%08lx\t%lu\r\n"), sto[i].TotalSectors, sto[i].TotalSectors);
|
printf_P(PSTR("Total Sectors:\t%08lx\t%lu\r\n"), sto[i].TotalSectors, sto[i].TotalSectors);
|
||||||
printf_P(PSTR("Sector Size:\t%04x\t\t%u\r\n"), sto[i].SectorSize, sto[i].SectorSize);
|
printf_P(PSTR("Sector Size:\t%04x\t\t%u\r\n"), sto[i].SectorSize, sto[i].SectorSize);
|
||||||
|
@ -522,10 +509,9 @@ void loop() {
|
||||||
}
|
}
|
||||||
delete PT;
|
delete PT;
|
||||||
} else {
|
} else {
|
||||||
sto[i].Read = NULL;
|
|
||||||
sto[i].Write = NULL;
|
|
||||||
sto[i].Writes = NULL;
|
sto[i].Writes = NULL;
|
||||||
sto[i].Reads = NULL;
|
sto[i].Reads = NULL;
|
||||||
|
sto[i].Initialize = NULL;
|
||||||
sto[i].TotalSectors = 0UL;
|
sto[i].TotalSectors = 0UL;
|
||||||
sto[i].SectorSize = 0;
|
sto[i].SectorSize = 0;
|
||||||
}
|
}
|
||||||
|
@ -538,9 +524,9 @@ void loop() {
|
||||||
if(Fats[0] != NULL) {
|
if(Fats[0] != NULL) {
|
||||||
struct Pvt * p;
|
struct Pvt * p;
|
||||||
p = ((struct Pvt *)(Fats[0]->storage->private_data));
|
p = ((struct Pvt *)(Fats[0]->storage->private_data));
|
||||||
if(!Bulk[p->B]->LUNIsGood(p->lun)) {
|
if(!UHS_USB_BulkOnly[p->B]->LUNIsGood(p->lun)) {
|
||||||
// media change
|
// media change
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
fadeAmount = 80;
|
fadeAmount = 80;
|
||||||
#endif
|
#endif
|
||||||
partsready = false;
|
partsready = false;
|
||||||
|
@ -559,12 +545,15 @@ void loop() {
|
||||||
if(fatready) {
|
if(fatready) {
|
||||||
FRESULT rc; /* Result code */
|
FRESULT rc; /* Result code */
|
||||||
UINT bw, br, i;
|
UINT bw, br, i;
|
||||||
|
|
||||||
if(!notified) {
|
if(!notified) {
|
||||||
#if defined(AVR)
|
#if !defined(CORE_TEENSY) && defined(__AVR__)
|
||||||
fadeAmount = 5;
|
fadeAmount = 5;
|
||||||
#endif
|
#endif
|
||||||
notified = true;
|
notified = true;
|
||||||
|
FATFS *fs = NULL;
|
||||||
|
for(int zz = 0; zz < _VOLUMES; zz++) {
|
||||||
|
if(Fats[zz]->volmap == 0) fs = Fats[zz]->ffs;
|
||||||
|
}
|
||||||
printf_P(PSTR("\r\nOpen an existing file (message.txt).\r\n"));
|
printf_P(PSTR("\r\nOpen an existing file (message.txt).\r\n"));
|
||||||
rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ);
|
rc = f_open(&My_File_Object_x, "0:/MESSAGE.TXT", FA_READ);
|
||||||
if(rc) printf_P(PSTR("Error %i, message.txt not found.\r\n"), rc);
|
if(rc) printf_P(PSTR("Error %i, message.txt not found.\r\n"), rc);
|
||||||
|
@ -625,7 +614,7 @@ outdir:{
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_P(PSTR("\r\nDirectory listing...\r\n"));
|
printf_P(PSTR("\r\nDirectory listing...\r\n"));
|
||||||
#if defined(AVR)
|
#if defined(__AVR__)
|
||||||
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
printf_P(PSTR("Available heap: %u Bytes\r\n"), freeHeap());
|
||||||
#endif
|
#endif
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
@ -676,12 +665,18 @@ outdir:{
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if(rc) die(rc);
|
if(rc) die(rc);
|
||||||
|
|
||||||
|
DISK_IOCTL(fs->drv, CTRL_COMMIT, 0);
|
||||||
printf_P(PSTR("\r\nTest completed.\r\n"));
|
printf_P(PSTR("\r\nTest completed.\r\n"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(runtest) {
|
if(runtest) {
|
||||||
ULONG ii, wt, rt, start, end;
|
ULONG ii, wt, rt, start, end;
|
||||||
|
FATFS *fs = NULL;
|
||||||
|
for(int zz = 0; zz < _VOLUMES; zz++) {
|
||||||
|
if(Fats[zz]->volmap == 0) fs = Fats[zz]->ffs;
|
||||||
|
}
|
||||||
runtest = false;
|
runtest = false;
|
||||||
f_unlink("0:/10MB.bin");
|
f_unlink("0:/10MB.bin");
|
||||||
printf_P(PSTR("\r\nCreate a new 10MB test file (10MB.bin).\r\n"));
|
printf_P(PSTR("\r\nCreate a new 10MB test file (10MB.bin).\r\n"));
|
||||||
|
@ -717,6 +712,7 @@ out:
|
||||||
printf_P(PSTR("Time to read 10485760 bytes: %lu ms (%lu sec)\r\nDelete test file\r\n"), rt, (500 + rt) / 1000UL);
|
printf_P(PSTR("Time to read 10485760 bytes: %lu ms (%lu sec)\r\nDelete test file\r\n"), rt, (500 + rt) / 1000UL);
|
||||||
failed:
|
failed:
|
||||||
if(rc) die(rc);
|
if(rc) die(rc);
|
||||||
|
DISK_IOCTL(fs->drv, CTRL_COMMIT, 0);
|
||||||
printf_P(PSTR("10MB timing test finished.\r\n"));
|
printf_P(PSTR("10MB timing test finished.\r\n"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,7 +398,7 @@ uint8_t HIDUniversal::Poll() {
|
||||||
|
|
||||||
if(identical)
|
if(identical)
|
||||||
return 0;
|
return 0;
|
||||||
#if 1
|
#if 0
|
||||||
Notify(PSTR("\r\nBuf: "), 0x80);
|
Notify(PSTR("\r\nBuf: "), 0x80);
|
||||||
|
|
||||||
for(uint8_t i = 0; i < read; i++) {
|
for(uint8_t i = 0; i < read; i++) {
|
||||||
|
|
31
keywords.txt
31
keywords.txt
|
@ -318,7 +318,7 @@ getIRy4 KEYWORD2
|
||||||
getIRs4 KEYWORD2
|
getIRs4 KEYWORD2
|
||||||
|
|
||||||
####################################################
|
####################################################
|
||||||
# Syntax Coloring Map For RFCOMM/SPP Library
|
# Syntax Coloring Map For BTHID Library
|
||||||
####################################################
|
####################################################
|
||||||
|
|
||||||
####################################################
|
####################################################
|
||||||
|
@ -331,4 +331,31 @@ BTHID KEYWORD1
|
||||||
# Methods and Functions (KEYWORD2)
|
# Methods and Functions (KEYWORD2)
|
||||||
####################################################
|
####################################################
|
||||||
SetReportParser KEYWORD2
|
SetReportParser KEYWORD2
|
||||||
setProtocolMode KEYWORD2
|
setProtocolMode KEYWORD2
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
# Syntax Coloring Map For PS Buzz Library
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
PSBuzz KEYWORD1
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
setLedOnAll KEYWORD2
|
||||||
|
setLedOffAll KEYWORD2
|
||||||
|
|
||||||
|
####################################################
|
||||||
|
# Constants and enums (LITERAL1)
|
||||||
|
####################################################
|
||||||
|
|
||||||
|
RED LITERAL1
|
||||||
|
YELLOW LITERAL1
|
||||||
|
GREEN LITERAL1
|
||||||
|
ORANGE LITERAL1
|
||||||
|
BLUE LITERAL1
|
Loading…
Reference in a new issue