mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Merge branch 'master' into SPPClient
Conflicts: BTD.cpp
This commit is contained in:
commit
b2dae57d4d
25 changed files with 693 additions and 274 deletions
4
BTD.cpp
4
BTD.cpp
|
@ -373,7 +373,7 @@ uint8_t BTD::Release() {
|
||||||
uint8_t BTD::Poll() {
|
uint8_t BTD::Poll() {
|
||||||
if(!bPollEnable)
|
if(!bPollEnable)
|
||||||
return 0;
|
return 0;
|
||||||
if(qNextPollTime <= millis()) { // Don't poll if shorter than polling interval
|
if((long)(millis() - qNextPollTime) >= 0L) { // Don't poll if shorter than polling interval
|
||||||
qNextPollTime = millis() + pollInterval; // Set new poll time
|
qNextPollTime = millis() + pollInterval; // Set new poll time
|
||||||
HCI_event_task(); // Poll the HCI event pipe
|
HCI_event_task(); // Poll the HCI event pipe
|
||||||
HCI_task(); // HCI state machine
|
HCI_task(); // HCI state machine
|
||||||
|
@ -470,6 +470,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;
|
||||||
} else {
|
} else {
|
||||||
#ifdef EXTRADEBUG
|
#ifdef EXTRADEBUG
|
||||||
Notify(PSTR("\r\nClass of device: "), 0x80);
|
Notify(PSTR("\r\nClass of device: "), 0x80);
|
||||||
|
@ -497,6 +498,7 @@ void BTD::HCI_event_task() {
|
||||||
Notify(PSTR(" has been found"), 0x80);
|
Notify(PSTR(" has been found"), 0x80);
|
||||||
#endif
|
#endif
|
||||||
hci_set_flag(HCI_FLAG_DEVICE_FOUND);
|
hci_set_flag(HCI_FLAG_DEVICE_FOUND);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
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>.
|
||||||
|
@ -241,6 +261,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?
|
||||||
|
|
10
Usb.cpp
10
Usb.cpp
|
@ -327,7 +327,7 @@ uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8
|
||||||
regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
|
regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ
|
||||||
rcode = (regRd(rHRSL) & 0x0f);
|
rcode = (regRd(rHRSL) & 0x0f);
|
||||||
|
|
||||||
while(rcode && (timeout > millis())) {
|
while(rcode && ((long)(millis() - timeout) < 0L)) {
|
||||||
switch(rcode) {
|
switch(rcode) {
|
||||||
case hrNAK:
|
case hrNAK:
|
||||||
nak_count++;
|
nak_count++;
|
||||||
|
@ -380,11 +380,11 @@ uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) {
|
||||||
uint8_t retry_count = 0;
|
uint8_t retry_count = 0;
|
||||||
uint16_t nak_count = 0;
|
uint16_t nak_count = 0;
|
||||||
|
|
||||||
while(timeout > millis()) {
|
while((long)(millis() - timeout) < 0L) {
|
||||||
regWr(rHXFR, (token | ep)); //launch the transfer
|
regWr(rHXFR, (token | ep)); //launch the transfer
|
||||||
rcode = USB_ERROR_TRANSFER_TIMEOUT;
|
rcode = USB_ERROR_TRANSFER_TIMEOUT;
|
||||||
|
|
||||||
while(timeout > millis()) //wait for transfer completion
|
while((long)(millis() - timeout) < 0L) //wait for transfer completion
|
||||||
{
|
{
|
||||||
tmpdata = regRd(rHIRQ);
|
tmpdata = regRd(rHIRQ);
|
||||||
|
|
||||||
|
@ -475,7 +475,7 @@ void USB::Task(void) //USB state machine
|
||||||
case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
|
case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
|
||||||
break;
|
break;
|
||||||
case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
|
case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
|
||||||
if(delay < millis())
|
if((long)(millis() - delay) >= 0L)
|
||||||
usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
|
usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
|
||||||
else break; // don't fall through
|
else break; // don't fall through
|
||||||
case USB_ATTACHED_SUBSTATE_RESET_DEVICE:
|
case USB_ATTACHED_SUBSTATE_RESET_DEVICE:
|
||||||
|
@ -502,7 +502,7 @@ void USB::Task(void) //USB state machine
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case USB_ATTACHED_SUBSTATE_WAIT_RESET:
|
case USB_ATTACHED_SUBSTATE_WAIT_RESET:
|
||||||
if(delay < millis()) usb_task_state = USB_STATE_CONFIGURING;
|
if((long)(millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
|
||||||
else break; // don't fall through
|
else break; // don't fall through
|
||||||
case USB_STATE_CONFIGURING:
|
case USB_STATE_CONFIGURING:
|
||||||
|
|
||||||
|
|
4
Wii.cpp
4
Wii.cpp
|
@ -657,7 +657,7 @@ void WII::L2CAP_task() {
|
||||||
/* The next states are in run() */
|
/* The next states are in run() */
|
||||||
|
|
||||||
case L2CAP_INTERRUPT_DISCONNECT:
|
case L2CAP_INTERRUPT_DISCONNECT:
|
||||||
if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && millis() > timer) {
|
if(l2cap_check_flag(L2CAP_FLAG_DISCONNECT_INTERRUPT_RESPONSE) && ((long)(millis() - timer) >= 0L)) {
|
||||||
#ifdef DEBUG_USB_HOST
|
#ifdef DEBUG_USB_HOST
|
||||||
Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
|
Notify(PSTR("\r\nDisconnected Interrupt Channel"), 0x80);
|
||||||
#endif
|
#endif
|
||||||
|
@ -682,7 +682,7 @@ void WII::L2CAP_task() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void WII::Run() {
|
void WII::Run() {
|
||||||
if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && millis() > timer)
|
if(l2cap_state == L2CAP_INTERRUPT_DISCONNECT && ((long)(millis() - timer) >= 0L))
|
||||||
L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
|
L2CAP_task(); // Call the rest of the disconnection routine after we have waited long enough
|
||||||
|
|
||||||
switch(l2cap_state) {
|
switch(l2cap_state) {
|
||||||
|
|
|
@ -514,9 +514,9 @@ void XBOXRECV::setLedRaw(uint8_t value, uint8_t controller) {
|
||||||
|
|
||||||
void XBOXRECV::setLedOn(LEDEnum led, uint8_t controller) {
|
void XBOXRECV::setLedOn(LEDEnum led, uint8_t controller) {
|
||||||
if(led == OFF)
|
if(led == OFF)
|
||||||
setLedRaw(0);
|
setLedRaw(0, controller);
|
||||||
else if(led != ALL) // All LEDs can't be on a the same time
|
else if(led != ALL) // All LEDs can't be on a the same time
|
||||||
setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4);
|
setLedRaw(pgm_read_byte(&XBOX_LEDS[(uint8_t)led]) + 4, controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XBOXRECV::setLedBlink(LEDEnum led, uint8_t controller) {
|
void XBOXRECV::setLedBlink(LEDEnum led, uint8_t controller) {
|
||||||
|
|
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -97,7 +97,7 @@ void loop()
|
||||||
|
|
||||||
if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
|
if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
|
||||||
{
|
{
|
||||||
if (millis() >= next_time)
|
if ((millis() - next_time) >= 0L)
|
||||||
{
|
{
|
||||||
Usb.ForEachUsbDevice(&PrintAllDescriptors);
|
Usb.ForEachUsbDevice(&PrintAllDescriptors);
|
||||||
Usb.ForEachUsbDevice(&PrintAllAddresses);
|
Usb.ForEachUsbDevice(&PrintAllAddresses);
|
||||||
|
|
|
@ -10,80 +10,75 @@
|
||||||
#include <spi4teensy3.h>
|
#include <spi4teensy3.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class PLAsyncOper : public CDCAsyncOper
|
class PLAsyncOper : public CDCAsyncOper {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
virtual uint8_t OnInit(ACM *pacm);
|
virtual uint8_t OnInit(ACM *pacm);
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t PLAsyncOper::OnInit(ACM *pacm)
|
uint8_t PLAsyncOper::OnInit(ACM *pacm) {
|
||||||
{
|
uint8_t rcode;
|
||||||
uint8_t rcode;
|
|
||||||
|
|
||||||
// Set DTR = 1
|
// Set DTR = 1
|
||||||
rcode = pacm->SetControlLineState(1);
|
rcode = pacm->SetControlLineState(1);
|
||||||
|
|
||||||
|
if(rcode) {
|
||||||
|
ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
|
||||||
|
return rcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
LINE_CODING lc;
|
||||||
|
lc.dwDTERate = 4800; //default serial speed of GPS unit
|
||||||
|
lc.bCharFormat = 0;
|
||||||
|
lc.bParityType = 0;
|
||||||
|
lc.bDataBits = 8;
|
||||||
|
|
||||||
|
rcode = pacm->SetLineCoding(&lc);
|
||||||
|
|
||||||
|
if(rcode)
|
||||||
|
ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);
|
||||||
|
|
||||||
if (rcode)
|
|
||||||
{
|
|
||||||
ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
|
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
|
||||||
|
|
||||||
LINE_CODING lc;
|
|
||||||
lc.dwDTERate = 4800; //default serial speed of GPS unit
|
|
||||||
lc.bCharFormat = 0;
|
|
||||||
lc.bParityType = 0;
|
|
||||||
lc.bDataBits = 8;
|
|
||||||
|
|
||||||
rcode = pacm->SetLineCoding(&lc);
|
|
||||||
|
|
||||||
if (rcode)
|
|
||||||
ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);
|
|
||||||
|
|
||||||
return rcode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
USB Usb;
|
USB Usb;
|
||||||
USBHub Hub(&Usb);
|
USBHub Hub(&Usb);
|
||||||
PLAsyncOper AsyncOper;
|
PLAsyncOper AsyncOper;
|
||||||
PL2303 Pl(&Usb, &AsyncOper);
|
PL2303 Pl(&Usb, &AsyncOper);
|
||||||
uint32_t read_delay;
|
uint32_t read_delay;
|
||||||
#define READ_DELAY 100
|
#define READ_DELAY 100
|
||||||
|
|
||||||
void setup()
|
void setup() {
|
||||||
{
|
Serial.begin(115200);
|
||||||
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
|
||||||
while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
|
Serial.println("Start");
|
||||||
Serial.println("Start");
|
|
||||||
|
|
||||||
if (Usb.Init() == -1)
|
if(Usb.Init() == -1)
|
||||||
Serial.println("OSCOKIRQ failed to assert");
|
Serial.println("OSCOKIRQ failed to assert");
|
||||||
|
|
||||||
delay( 200 );
|
delay(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop() {
|
||||||
{
|
uint8_t rcode;
|
||||||
uint8_t rcode;
|
uint8_t buf[64]; //serial buffer equals Max.packet size of bulk-IN endpoint
|
||||||
uint8_t buf[64]; //serial buffer equals Max.packet size of bulk-IN endpoint
|
uint16_t rcvd = 64;
|
||||||
uint16_t rcvd = 64;
|
|
||||||
|
|
||||||
Usb.Task();
|
Usb.Task();
|
||||||
|
|
||||||
if( Pl.isReady()) {
|
if(Pl.isReady()) {
|
||||||
/* reading the GPS */
|
/* reading the GPS */
|
||||||
if( read_delay < millis() ){
|
if((long)(millis() - read_delay) >= 0L) {
|
||||||
read_delay += READ_DELAY;
|
read_delay += READ_DELAY;
|
||||||
rcode = Pl.RcvData(&rcvd, buf);
|
rcode = Pl.RcvData(&rcvd, buf);
|
||||||
if ( rcode && rcode != hrNAK )
|
if(rcode && rcode != hrNAK)
|
||||||
ErrorMessage<uint8_t>(PSTR("Ret"), rcode);
|
ErrorMessage<uint8_t>(PSTR("Ret"), rcode);
|
||||||
if( rcvd ) { //more than zero bytes received
|
if(rcvd) { //more than zero bytes received
|
||||||
for( uint16_t i=0; i < rcvd; i++ ) {
|
for(uint16_t i = 0; i < rcvd; i++) {
|
||||||
Serial.print((char)buf[i]); //printing on the screen
|
Serial.print((char)buf[i]); //printing on the screen
|
||||||
}//for( uint16_t i=0; i < rcvd; i++...
|
}//for( uint16_t i=0; i < rcvd; i++...
|
||||||
}//if( rcvd
|
}//if( rcvd
|
||||||
}//if( read_delay > millis()...
|
}//if( read_delay > millis()...
|
||||||
}//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
|
}//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit da3afff036725584bab36174c1c8441cceba6943
|
Subproject commit 1edd5f46188a6c4b68d6f9120fa72359a12e38f1
|
|
@ -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 9108effe4d4e556198e3e7b95365d1c898680dae
|
Subproject commit b119b97e1484a08aebcf24e070113d78c82fb023
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0b8e3076b5a072251e01cfc6e6333b364d4e71e7
|
Subproject commit 72b5bf467a1c2479ba7354ee4d864e382c167425
|
340
examples/testusbhostFAT/testusbhostFAT.ino
Normal file → Executable file
340
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))
|
||||||
|
@ -126,7 +130,7 @@ static int tty_std_putc(char c, FILE *t) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tty_std_getc(FILE *t) {
|
static int tty_std_getc(FILE *t) {
|
||||||
while (!Serial.available());
|
while(!Serial.available());
|
||||||
return Serial.read();
|
return Serial.read();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,18 +144,18 @@ extern "C" {
|
||||||
|
|
||||||
int _write(int fd, const char *ptr, int len) {
|
int _write(int fd, const char *ptr, int len) {
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < len; j++) {
|
for(j = 0; j < len; j++) {
|
||||||
if (fd == 1)
|
if(fd == 1)
|
||||||
Serial.write(*ptr++);
|
Serial.write(*ptr++);
|
||||||
else if (fd == 2)
|
else if(fd == 2)
|
||||||
USB_HOST_SERIAL.write(*ptr++);
|
USB_HOST_SERIAL.write(*ptr++);
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _read(int fd, char *ptr, int len) {
|
int _read(int fd, char *ptr, int len) {
|
||||||
if (len > 0 && fd == 0) {
|
if(len > 0 && fd == 0) {
|
||||||
while (!Serial.available());
|
while(!Serial.available());
|
||||||
*ptr = Serial.read();
|
*ptr = Serial.read();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -175,7 +179,7 @@ extern "C" {
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
boolean serr = false;
|
boolean serr = false;
|
||||||
for (int i = 0; i < _VOLUMES; i++) {
|
for(int i = 0; i < _VOLUMES; i++) {
|
||||||
Fats[i] = NULL;
|
Fats[i] = NULL;
|
||||||
sto[i].private_data = new pvt_t;
|
sto[i].private_data = new pvt_t;
|
||||||
((pvt_t *)sto[i].private_data)->B = 255; // impossible
|
((pvt_t *)sto[i].private_data)->B = 255; // impossible
|
||||||
|
@ -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);
|
||||||
|
@ -193,11 +197,23 @@ void setup() {
|
||||||
// Initialize 'debug' serial port
|
// Initialize 'debug' serial port
|
||||||
USB_HOST_SERIAL.begin(115200);
|
USB_HOST_SERIAL.begin(115200);
|
||||||
// Do not start primary Serial port if already started.
|
// Do not start primary Serial port if already started.
|
||||||
if (bit_is_clear(UCSR0B, TXEN0)) {
|
if(bit_is_clear(UCSR0B, TXEN0)) {
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
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"));
|
||||||
|
@ -236,7 +242,7 @@ void setup() {
|
||||||
"Disabled"
|
"Disabled"
|
||||||
#endif
|
#endif
|
||||||
"\r\n"));
|
"\r\n"));
|
||||||
if (serr) {
|
if(serr) {
|
||||||
fprintf_P(stderr, PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
|
fprintf_P(stderr, PSTR("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nStart\r\n"));
|
||||||
fprintf_P(stderr, PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
|
fprintf_P(stderr, PSTR("Current UsbDEBUGlvl %02x\r\n"), UsbDEBUGlvl);
|
||||||
fprintf_P(stderr, PSTR("Long filename support: "
|
fprintf_P(stderr, PSTR("Long filename support: "
|
||||||
|
@ -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());
|
||||||
|
@ -274,22 +280,22 @@ void setup() {
|
||||||
// I want to be able to have slightly more control.
|
// I want to be able to have slightly more control.
|
||||||
// Besides, it is easier to initialize stuff...
|
// Besides, it is easier to initialize stuff...
|
||||||
#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() {
|
||||||
|
@ -334,23 +318,23 @@ void serialEvent() {
|
||||||
// . to increase by 16, , to decrease by 16
|
// . to increase by 16, , to decrease by 16
|
||||||
// e to flick VBUS
|
// e to flick VBUS
|
||||||
// * to report debug level
|
// * to report debug level
|
||||||
if (Serial.available()) {
|
if(Serial.available()) {
|
||||||
int inByte = Serial.read();
|
int inByte = Serial.read();
|
||||||
switch (inByte) {
|
switch(inByte) {
|
||||||
case '+':
|
case '+':
|
||||||
if (UsbDEBUGlvl < 0xff) UsbDEBUGlvl++;
|
if(UsbDEBUGlvl < 0xff) UsbDEBUGlvl++;
|
||||||
reportlvl = true;
|
reportlvl = true;
|
||||||
break;
|
break;
|
||||||
case '-':
|
case '-':
|
||||||
if (UsbDEBUGlvl > 0x00) UsbDEBUGlvl--;
|
if(UsbDEBUGlvl > 0x00) UsbDEBUGlvl--;
|
||||||
reportlvl = true;
|
reportlvl = true;
|
||||||
break;
|
break;
|
||||||
case '.':
|
case '.':
|
||||||
if (UsbDEBUGlvl < 0xf0) UsbDEBUGlvl += 16;
|
if(UsbDEBUGlvl < 0xf0) UsbDEBUGlvl += 16;
|
||||||
reportlvl = true;
|
reportlvl = true;
|
||||||
break;
|
break;
|
||||||
case ',':
|
case ',':
|
||||||
if (UsbDEBUGlvl > 0x0f) UsbDEBUGlvl -= 16;
|
if(UsbDEBUGlvl > 0x0f) UsbDEBUGlvl -= 16;
|
||||||
reportlvl = true;
|
reportlvl = true;
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
|
@ -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
|
||||||
|
@ -380,11 +365,11 @@ ISR(TIMER3_COMPA_vect) {
|
||||||
brightness = brightness + fadeAmount;
|
brightness = brightness + fadeAmount;
|
||||||
|
|
||||||
// reverse the direction of the fading at the ends of the fade:
|
// reverse the direction of the fading at the ends of the fade:
|
||||||
if (brightness <= 0) {
|
if(brightness <= 0) {
|
||||||
brightness = 0;
|
brightness = 0;
|
||||||
fadeAmount = -fadeAmount;
|
fadeAmount = -fadeAmount;
|
||||||
}
|
}
|
||||||
if (brightness >= 255) {
|
if(brightness >= 255) {
|
||||||
brightness = 255;
|
brightness = 255;
|
||||||
fadeAmount = -fadeAmount;
|
fadeAmount = -fadeAmount;
|
||||||
}
|
}
|
||||||
|
@ -404,29 +389,30 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (change) {
|
if(change) {
|
||||||
change = false;
|
change = false;
|
||||||
if (usbon) {
|
if(usbon) {
|
||||||
Usb.vbusPower(vbus_on);
|
Usb.vbusPower(vbus_on);
|
||||||
printf_P(PSTR("VBUS on\r\n"));
|
printf_P(PSTR("VBUS on\r\n"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -436,21 +422,21 @@ void loop() {
|
||||||
}
|
}
|
||||||
Usb.Task();
|
Usb.Task();
|
||||||
current_state = Usb.getUsbTaskState();
|
current_state = Usb.getUsbTaskState();
|
||||||
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;
|
||||||
for (int i = 0; i < cpart; i++) {
|
for(int i = 0; i < cpart; i++) {
|
||||||
if (Fats[i] != NULL)
|
if(Fats[i] != NULL)
|
||||||
delete Fats[i];
|
delete Fats[i];
|
||||||
Fats[i] = NULL;
|
Fats[i] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -462,48 +448,48 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// only do any of this if usb is on
|
// only do any of this if usb is on
|
||||||
if (usbon) {
|
if(usbon) {
|
||||||
if (partsready && !fatready) {
|
if(partsready && !fatready) {
|
||||||
if (cpart > 0) fatready = true;
|
if(cpart > 0) fatready = true;
|
||||||
}
|
}
|
||||||
// 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].Read = *PRead;
|
sto[i].Reads = *UHS_USB_BulkOnly_Read;
|
||||||
sto[i].Write = *PWrite;
|
sto[i].Writes = *UHS_USB_BulkOnly_Write;
|
||||||
sto[i].Reads = *PReads;
|
sto[i].Status = *UHS_USB_BulkOnly_Status;
|
||||||
sto[i].Writes = *PWrites;
|
sto[i].Initialize = *UHS_USB_BulkOnly_Initialize;
|
||||||
sto[i].Status = *PStatus;
|
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);
|
||||||
// get the partition data...
|
// get the partition data...
|
||||||
PT = new PCPartition;
|
PT = new PCPartition;
|
||||||
|
|
||||||
if (!PT->Init(&sto[i])) {
|
if(!PT->Init(&sto[i])) {
|
||||||
part_t *apart;
|
part_t *apart;
|
||||||
for (int j = 0; j < 4; j++) {
|
for(int j = 0; j < 4; j++) {
|
||||||
apart = PT->GetPart(j);
|
apart = PT->GetPart(j);
|
||||||
if (apart != NULL && apart->type != 0x00) {
|
if(apart != NULL && apart->type != 0x00) {
|
||||||
memcpy(&(parts[cpart]), apart, sizeof (part_t));
|
memcpy(&(parts[cpart]), apart, sizeof (part_t));
|
||||||
printf_P(PSTR("Partition %u type %#02x\r\n"), j, parts[cpart].type);
|
printf_P(PSTR("Partition %u type %#02x\r\n"), j, parts[cpart].type);
|
||||||
// for now
|
// for now
|
||||||
if (isfat(parts[cpart].type)) {
|
if(isfat(parts[cpart].type)) {
|
||||||
Fats[cpart] = new PFAT(&sto[i], cpart, parts[cpart].firstSector);
|
Fats[cpart] = new PFAT(&sto[i], cpart, parts[cpart].firstSector);
|
||||||
//int r = Fats[cpart]->Good();
|
//int r = Fats[cpart]->Good();
|
||||||
if (Fats[cpart]->MountStatus()) {
|
if(Fats[cpart]->MountStatus()) {
|
||||||
delete Fats[cpart];
|
delete Fats[cpart];
|
||||||
Fats[cpart] = NULL;
|
Fats[cpart] = NULL;
|
||||||
} else cpart++;
|
} else cpart++;
|
||||||
|
@ -514,7 +500,7 @@ void loop() {
|
||||||
// try superblock
|
// try superblock
|
||||||
Fats[cpart] = new PFAT(&sto[i], cpart, 0);
|
Fats[cpart] = new PFAT(&sto[i], cpart, 0);
|
||||||
//int r = Fats[cpart]->Good();
|
//int r = Fats[cpart]->Good();
|
||||||
if (Fats[cpart]->MountStatus()) {
|
if(Fats[cpart]->MountStatus()) {
|
||||||
//printf_P(PSTR("Superblock error %x\r\n"), r);
|
//printf_P(PSTR("Superblock error %x\r\n"), r);
|
||||||
delete Fats[cpart];
|
delete Fats[cpart];
|
||||||
Fats[cpart] = NULL;
|
Fats[cpart] = NULL;
|
||||||
|
@ -523,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;
|
||||||
}
|
}
|
||||||
|
@ -535,18 +520,18 @@ void loop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fatready) {
|
if(fatready) {
|
||||||
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;
|
||||||
for (int i = 0; i < cpart; i++) {
|
for(int i = 0; i < cpart; i++) {
|
||||||
if (Fats[i] != NULL)
|
if(Fats[i] != NULL)
|
||||||
delete Fats[i];
|
delete Fats[i];
|
||||||
Fats[cpart] = NULL;
|
Fats[cpart] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -557,62 +542,64 @@ 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(CORE_TEENSY) && defined(__AVR__)
|
||||||
#if 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);
|
||||||
else {
|
else {
|
||||||
printf_P(PSTR("\r\nType the file content.\r\n"));
|
printf_P(PSTR("\r\nType the file content.\r\n"));
|
||||||
for (;;) {
|
for(;;) {
|
||||||
rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &br); /* Read a chunk of file */
|
rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &br); /* Read a chunk of file */
|
||||||
if (rc || !br) break; /* Error or end of file */
|
if(rc || !br) break; /* Error or end of file */
|
||||||
for (i = 0; i < br; i++) {
|
for(i = 0; i < br; i++) {
|
||||||
/* Type the data */
|
/* Type the data */
|
||||||
if (My_Buff_x[i] == '\n')
|
if(My_Buff_x[i] == '\n')
|
||||||
Serial.write('\r');
|
Serial.write('\r');
|
||||||
if (My_Buff_x[i] != '\r')
|
if(My_Buff_x[i] != '\r')
|
||||||
Serial.write(My_Buff_x[i]);
|
Serial.write(My_Buff_x[i]);
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rc) {
|
if(rc) {
|
||||||
f_close(&My_File_Object_x);
|
f_close(&My_File_Object_x);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_P(PSTR("\r\nClose the file.\r\n"));
|
printf_P(PSTR("\r\nClose the file.\r\n"));
|
||||||
rc = f_close(&My_File_Object_x);
|
rc = f_close(&My_File_Object_x);
|
||||||
if (rc) goto out;
|
if(rc) goto out;
|
||||||
}
|
}
|
||||||
printf_P(PSTR("\r\nCreate a new file (hello.txt).\r\n"));
|
printf_P(PSTR("\r\nCreate a new file (hello.txt).\r\n"));
|
||||||
rc = f_open(&My_File_Object_x, "0:/Hello.TxT", FA_WRITE | FA_CREATE_ALWAYS);
|
rc = f_open(&My_File_Object_x, "0:/Hello.TxT", FA_WRITE | FA_CREATE_ALWAYS);
|
||||||
if (rc) {
|
if(rc) {
|
||||||
die(rc);
|
die(rc);
|
||||||
goto outdir;
|
goto outdir;
|
||||||
}
|
}
|
||||||
printf_P(PSTR("\r\nWrite a text data. (Hello world!)\r\n"));
|
printf_P(PSTR("\r\nWrite a text data. (Hello world!)\r\n"));
|
||||||
rc = f_write(&My_File_Object_x, "Hello world!\r\n", 14, &bw);
|
rc = f_write(&My_File_Object_x, "Hello world!\r\n", 14, &bw);
|
||||||
if (rc) {
|
if(rc) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
printf_P(PSTR("%u bytes written.\r\n"), bw);
|
printf_P(PSTR("%u bytes written.\r\n"), bw);
|
||||||
|
|
||||||
printf_P(PSTR("\r\nClose the file.\r\n"));
|
printf_P(PSTR("\r\nClose the file.\r\n"));
|
||||||
rc = f_close(&My_File_Object_x);
|
rc = f_close(&My_File_Object_x);
|
||||||
if (rc) {
|
if(rc) {
|
||||||
die(rc);
|
die(rc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
outdir:
|
outdir:{
|
||||||
{
|
|
||||||
#if _USE_LFN
|
#if _USE_LFN
|
||||||
char lfn[_MAX_LFN + 1];
|
char lfn[_MAX_LFN + 1];
|
||||||
FILINFO My_File_Info_Object_x; /* File information object */
|
FILINFO My_File_Info_Object_x; /* File information object */
|
||||||
|
@ -621,55 +608,55 @@ outdir:
|
||||||
DIR My_Dir_Object_x; /* Directory object */
|
DIR My_Dir_Object_x; /* Directory object */
|
||||||
printf_P(PSTR("\r\nOpen root directory.\r\n"));
|
printf_P(PSTR("\r\nOpen root directory.\r\n"));
|
||||||
rc = f_opendir(&My_Dir_Object_x, "0:/");
|
rc = f_opendir(&My_Dir_Object_x, "0:/");
|
||||||
if (rc) {
|
if(rc) {
|
||||||
die(rc);
|
die(rc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
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(;;) {
|
||||||
#if _USE_LFN
|
#if _USE_LFN
|
||||||
My_File_Info_Object_x.lfsize = _MAX_LFN;
|
My_File_Info_Object_x.lfsize = _MAX_LFN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rc = f_readdir(&My_Dir_Object_x, &My_File_Info_Object_x); /* Read a directory item */
|
rc = f_readdir(&My_Dir_Object_x, &My_File_Info_Object_x); /* Read a directory item */
|
||||||
if (rc || !My_File_Info_Object_x.fname[0]) break; /* Error or end of dir */
|
if(rc || !My_File_Info_Object_x.fname[0]) break; /* Error or end of dir */
|
||||||
|
|
||||||
if (My_File_Info_Object_x.fattrib & AM_DIR) {
|
if(My_File_Info_Object_x.fattrib & AM_DIR) {
|
||||||
Serial.write('d');
|
Serial.write('d');
|
||||||
} else {
|
} else {
|
||||||
Serial.write('-');
|
Serial.write('-');
|
||||||
}
|
}
|
||||||
Serial.write('r');
|
Serial.write('r');
|
||||||
|
|
||||||
if (My_File_Info_Object_x.fattrib & AM_RDO) {
|
if(My_File_Info_Object_x.fattrib & AM_RDO) {
|
||||||
Serial.write('-');
|
Serial.write('-');
|
||||||
} else {
|
} else {
|
||||||
Serial.write('w');
|
Serial.write('w');
|
||||||
}
|
}
|
||||||
if (My_File_Info_Object_x.fattrib & AM_HID) {
|
if(My_File_Info_Object_x.fattrib & AM_HID) {
|
||||||
Serial.write('h');
|
Serial.write('h');
|
||||||
} else {
|
} else {
|
||||||
Serial.write('-');
|
Serial.write('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (My_File_Info_Object_x.fattrib & AM_SYS) {
|
if(My_File_Info_Object_x.fattrib & AM_SYS) {
|
||||||
Serial.write('s');
|
Serial.write('s');
|
||||||
} else {
|
} else {
|
||||||
Serial.write('-');
|
Serial.write('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (My_File_Info_Object_x.fattrib & AM_ARC) {
|
if(My_File_Info_Object_x.fattrib & AM_ARC) {
|
||||||
Serial.write('a');
|
Serial.write('a');
|
||||||
} else {
|
} else {
|
||||||
Serial.write('-');
|
Serial.write('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
#if _USE_LFN
|
#if _USE_LFN
|
||||||
if (*My_File_Info_Object_x.lfname)
|
if(*My_File_Info_Object_x.lfname)
|
||||||
printf_P(PSTR(" %8lu %s (%s)\r\n"), My_File_Info_Object_x.fsize, My_File_Info_Object_x.fname, My_File_Info_Object_x.lfname);
|
printf_P(PSTR(" %8lu %s (%s)\r\n"), My_File_Info_Object_x.fsize, My_File_Info_Object_x.fname, My_File_Info_Object_x.lfname);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -677,48 +664,55 @@ 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"));
|
||||||
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_WRITE | FA_CREATE_ALWAYS);
|
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_WRITE | FA_CREATE_ALWAYS);
|
||||||
if (rc) goto failed;
|
if(rc) goto failed;
|
||||||
for (bw = 0; bw < mbxs; bw++) My_Buff_x[bw] = bw & 0xff;
|
for(bw = 0; bw < mbxs; bw++) My_Buff_x[bw] = bw & 0xff;
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
start = millis();
|
start = millis();
|
||||||
while (start == millis());
|
while(start == millis());
|
||||||
for (ii = 10485760LU / mbxs; ii > 0LU; ii--) {
|
for(ii = 10485760LU / mbxs; ii > 0LU; ii--) {
|
||||||
rc = f_write(&My_File_Object_x, My_Buff_x, mbxs, &bw);
|
rc = f_write(&My_File_Object_x, My_Buff_x, mbxs, &bw);
|
||||||
if (rc || !bw) goto failed;
|
if(rc || !bw) goto failed;
|
||||||
}
|
}
|
||||||
rc = f_close(&My_File_Object_x);
|
rc = f_close(&My_File_Object_x);
|
||||||
if (rc) goto failed;
|
if(rc) goto failed;
|
||||||
end = millis();
|
end = millis();
|
||||||
wt = (end - start) - 1;
|
wt = (end - start) - 1;
|
||||||
printf_P(PSTR("Time to write 10485760 bytes: %lu ms (%lu sec) \r\n"), wt, (500 + wt) / 1000UL);
|
printf_P(PSTR("Time to write 10485760 bytes: %lu ms (%lu sec) \r\n"), wt, (500 + wt) / 1000UL);
|
||||||
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_READ);
|
rc = f_open(&My_File_Object_x, "0:/10MB.bin", FA_READ);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
start = millis();
|
start = millis();
|
||||||
while (start == millis());
|
while(start == millis());
|
||||||
if (rc) goto failed;
|
if(rc) goto failed;
|
||||||
for (;;) {
|
for(;;) {
|
||||||
rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &bw); /* Read a chunk of file */
|
rc = f_read(&My_File_Object_x, My_Buff_x, mbxs, &bw); /* Read a chunk of file */
|
||||||
if (rc || !bw) break; /* Error or end of file */
|
if(rc || !bw) break; /* Error or end of file */
|
||||||
}
|
}
|
||||||
end = millis();
|
end = millis();
|
||||||
if (rc) goto failed;
|
if(rc) goto failed;
|
||||||
rc = f_close(&My_File_Object_x);
|
rc = f_close(&My_File_Object_x);
|
||||||
if (rc) goto failed;
|
if(rc) goto failed;
|
||||||
rt = (end - start) - 1;
|
rt = (end - start) - 1;
|
||||||
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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 4226cc772c3e0d5fa71871dd6f8a28fa26dc692c
|
Subproject commit 2bf8f633e7f9bc5a7bf4c00f3f45c7b79484198e
|
|
@ -536,7 +536,7 @@ template <const uint8_t BOOT_PROTOCOL>
|
||||||
uint8_t HIDBoot<BOOT_PROTOCOL>::Poll() {
|
uint8_t HIDBoot<BOOT_PROTOCOL>::Poll() {
|
||||||
uint8_t rcode = 0;
|
uint8_t rcode = 0;
|
||||||
|
|
||||||
if(bPollEnable && qNextPollTime <= millis()) {
|
if(bPollEnable && ((long)(millis() - qNextPollTime) >= 0L)) {
|
||||||
|
|
||||||
// To-do: optimize manually, using the for loop only if needed.
|
// To-do: optimize manually, using the for loop only if needed.
|
||||||
for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
|
for(int i = 0; i < epMUL(BOOT_PROTOCOL); i++) {
|
||||||
|
|
|
@ -370,7 +370,7 @@ uint8_t HIDUniversal::Poll() {
|
||||||
if(!bPollEnable)
|
if(!bPollEnable)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(qNextPollTime <= millis()) {
|
if((long)(millis() - qNextPollTime) >= 0L) {
|
||||||
qNextPollTime = millis() + pollInterval;
|
qNextPollTime = millis() + pollInterval;
|
||||||
|
|
||||||
uint8_t buf[constBuffLen];
|
uint8_t buf[constBuffLen];
|
||||||
|
@ -398,11 +398,13 @@ 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++) {
|
||||||
D_PrintHex<uint8_t > (buf[i], 0x80);
|
D_PrintHex<uint8_t > (buf[i], 0x80);
|
||||||
|
Notify(PSTR(" "), 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
Notify(PSTR("\r\n"), 0x80);
|
Notify(PSTR("\r\n"), 0x80);
|
||||||
#endif
|
#endif
|
||||||
|
|
31
keywords.txt
31
keywords.txt
|
@ -319,7 +319,7 @@ getIRy4 KEYWORD2
|
||||||
getIRs4 KEYWORD2
|
getIRs4 KEYWORD2
|
||||||
|
|
||||||
####################################################
|
####################################################
|
||||||
# Syntax Coloring Map For RFCOMM/SPP Library
|
# Syntax Coloring Map For BTHID Library
|
||||||
####################################################
|
####################################################
|
||||||
|
|
||||||
####################################################
|
####################################################
|
||||||
|
@ -332,4 +332,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
|
||||||
|
|
|
@ -549,6 +549,20 @@ void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t
|
||||||
|
|
||||||
uint8_t index;
|
uint8_t index;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
if((pep->bmAttributes & 0x02) == 2) {
|
||||||
|
index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex;
|
||||||
|
// Fill in the endpoint info structure
|
||||||
|
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
|
||||||
|
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
|
||||||
|
epInfo[index].epAttribs = 0;
|
||||||
|
|
||||||
|
bNumEP++;
|
||||||
|
|
||||||
|
PrintEndpointDescriptor(pep);
|
||||||
|
|
||||||
|
}
|
||||||
|
#else
|
||||||
if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
|
if((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
|
||||||
index = epInterruptInIndex;
|
index = epInterruptInIndex;
|
||||||
else
|
else
|
||||||
|
@ -565,6 +579,7 @@ void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t
|
||||||
bNumEP++;
|
bNumEP++;
|
||||||
|
|
||||||
PrintEndpointDescriptor(pep);
|
PrintEndpointDescriptor(pep);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -656,7 +671,7 @@ uint8_t BulkOnly::Poll() {
|
||||||
if(!bPollEnable)
|
if(!bPollEnable)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(qNextPollTime <= millis()) {
|
if((long)(millis() - qNextPollTime) >= 0L) {
|
||||||
CheckMedia();
|
CheckMedia();
|
||||||
}
|
}
|
||||||
//rcode = 0;
|
//rcode = 0;
|
||||||
|
|
|
@ -230,7 +230,7 @@ uint8_t USBHub::Poll() {
|
||||||
if(!bPollEnable)
|
if(!bPollEnable)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(qNextPollTime <= millis()) {
|
if(((long)(millis() - qNextPollTime) >= 0L)) {
|
||||||
rcode = CheckHubStatus();
|
rcode = CheckHubStatus();
|
||||||
qNextPollTime = millis() + 100;
|
qNextPollTime = millis() + 100;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue