Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
USB_Host/UsbCore.h@1:da31140f2a1c, 2020-05-02 (annotated)
- Committer:
- robo_ichinoseki_a
- Date:
- Sat May 02 05:56:48 2020 +0000
- Revision:
- 1:da31140f2a1c
- Parent:
- 0:b1ce54272580
update
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kotakku | 0:b1ce54272580 | 1 | /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. |
| kotakku | 0:b1ce54272580 | 2 | |
| kotakku | 0:b1ce54272580 | 3 | This program is free software; you can redistribute it and/or modify |
| kotakku | 0:b1ce54272580 | 4 | it under the terms of the GNU General Public License as published by |
| kotakku | 0:b1ce54272580 | 5 | the Free Software Foundation; either version 2 of the License, or |
| kotakku | 0:b1ce54272580 | 6 | (at your option) any later version. |
| kotakku | 0:b1ce54272580 | 7 | |
| kotakku | 0:b1ce54272580 | 8 | This program is distributed in the hope that it will be useful, |
| kotakku | 0:b1ce54272580 | 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| kotakku | 0:b1ce54272580 | 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| kotakku | 0:b1ce54272580 | 11 | GNU General Public License for more details. |
| kotakku | 0:b1ce54272580 | 12 | |
| kotakku | 0:b1ce54272580 | 13 | You should have received a copy of the GNU General Public License |
| kotakku | 0:b1ce54272580 | 14 | along with this program; if not, write to the Free Software |
| kotakku | 0:b1ce54272580 | 15 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| kotakku | 0:b1ce54272580 | 16 | |
| kotakku | 0:b1ce54272580 | 17 | Contact information |
| kotakku | 0:b1ce54272580 | 18 | ------------------- |
| kotakku | 0:b1ce54272580 | 19 | |
| kotakku | 0:b1ce54272580 | 20 | Circuits At Home, LTD |
| kotakku | 0:b1ce54272580 | 21 | Web : http://www.circuitsathome.com |
| kotakku | 0:b1ce54272580 | 22 | e-mail : support@circuitsathome.com |
| kotakku | 0:b1ce54272580 | 23 | */ |
| kotakku | 0:b1ce54272580 | 24 | |
| kotakku | 0:b1ce54272580 | 25 | // warning |
| kotakku | 0:b1ce54272580 | 26 | // #define _usb_h_ |
| kotakku | 0:b1ce54272580 | 27 | // #define MBED_H |
| kotakku | 0:b1ce54272580 | 28 | |
| kotakku | 0:b1ce54272580 | 29 | #if !defined(_usb_h_) || defined(USBCORE_H) |
| kotakku | 0:b1ce54272580 | 30 | #error "Never include UsbCore.h directly; include Usb.h instead" |
| kotakku | 0:b1ce54272580 | 31 | #else |
| kotakku | 0:b1ce54272580 | 32 | #define USBCORE_H |
| kotakku | 0:b1ce54272580 | 33 | |
| kotakku | 0:b1ce54272580 | 34 | // Not used anymore? If anyone uses this, please let us know so that this may be |
| kotakku | 0:b1ce54272580 | 35 | // moved to the proper place, settings.h. |
| kotakku | 0:b1ce54272580 | 36 | //#define USB_METHODS_INLINE |
| kotakku | 0:b1ce54272580 | 37 | |
| kotakku | 0:b1ce54272580 | 38 | |
| kotakku | 0:b1ce54272580 | 39 | /* Common setup data constant combinations */ |
| kotakku | 0:b1ce54272580 | 40 | #define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE //get descriptor request type |
| kotakku | 0:b1ce54272580 | 41 | #define bmREQ_SET USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE //set request type for all but 'set feature' and 'set interface' |
| kotakku | 0:b1ce54272580 | 42 | #define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE //get interface request type |
| kotakku | 0:b1ce54272580 | 43 | |
| kotakku | 0:b1ce54272580 | 44 | // D7 data transfer direction (0 - host-to-device, 1 - device-to-host) |
| kotakku | 0:b1ce54272580 | 45 | // D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved) |
| kotakku | 0:b1ce54272580 | 46 | // D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved) |
| kotakku | 0:b1ce54272580 | 47 | |
| kotakku | 0:b1ce54272580 | 48 | // USB Device Classes |
| kotakku | 0:b1ce54272580 | 49 | #define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors |
| kotakku | 0:b1ce54272580 | 50 | #define USB_CLASS_AUDIO 0x01 // Audio |
| kotakku | 0:b1ce54272580 | 51 | #define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control |
| kotakku | 0:b1ce54272580 | 52 | #define USB_CLASS_HID 0x03 // HID |
| kotakku | 0:b1ce54272580 | 53 | #define USB_CLASS_PHYSICAL 0x05 // Physical |
| kotakku | 0:b1ce54272580 | 54 | #define USB_CLASS_IMAGE 0x06 // Image |
| kotakku | 0:b1ce54272580 | 55 | #define USB_CLASS_PRINTER 0x07 // Printer |
| kotakku | 0:b1ce54272580 | 56 | #define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage |
| kotakku | 0:b1ce54272580 | 57 | #define USB_CLASS_HUB 0x09 // Hub |
| kotakku | 0:b1ce54272580 | 58 | #define USB_CLASS_CDC_DATA 0x0a // CDC-Data |
| kotakku | 0:b1ce54272580 | 59 | #define USB_CLASS_SMART_CARD 0x0b // Smart-Card |
| kotakku | 0:b1ce54272580 | 60 | #define USB_CLASS_CONTENT_SECURITY 0x0d // Content Security |
| kotakku | 0:b1ce54272580 | 61 | #define USB_CLASS_VIDEO 0x0e // Video |
| kotakku | 0:b1ce54272580 | 62 | #define USB_CLASS_PERSONAL_HEALTH 0x0f // Personal Healthcare |
| kotakku | 0:b1ce54272580 | 63 | #define USB_CLASS_DIAGNOSTIC_DEVICE 0xdc // Diagnostic Device |
| kotakku | 0:b1ce54272580 | 64 | #define USB_CLASS_WIRELESS_CTRL 0xe0 // Wireless Controller |
| kotakku | 0:b1ce54272580 | 65 | #define USB_CLASS_MISC 0xef // Miscellaneous |
| kotakku | 0:b1ce54272580 | 66 | #define USB_CLASS_APP_SPECIFIC 0xfe // Application Specific |
| kotakku | 0:b1ce54272580 | 67 | #define USB_CLASS_VENDOR_SPECIFIC 0xff // Vendor Specific |
| kotakku | 0:b1ce54272580 | 68 | |
| kotakku | 0:b1ce54272580 | 69 | // Additional Error Codes |
| kotakku | 0:b1ce54272580 | 70 | #define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 |
| kotakku | 0:b1ce54272580 | 71 | #define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2 |
| kotakku | 0:b1ce54272580 | 72 | #define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3 |
| kotakku | 0:b1ce54272580 | 73 | #define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4 |
| kotakku | 0:b1ce54272580 | 74 | #define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5 |
| kotakku | 0:b1ce54272580 | 75 | #define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6 |
| kotakku | 0:b1ce54272580 | 76 | #define USB_ERROR_EPINFO_IS_NULL 0xD7 |
| kotakku | 0:b1ce54272580 | 77 | #define USB_ERROR_INVALID_ARGUMENT 0xD8 |
| kotakku | 0:b1ce54272580 | 78 | #define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9 |
| kotakku | 0:b1ce54272580 | 79 | #define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA |
| kotakku | 0:b1ce54272580 | 80 | #define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB |
| kotakku | 0:b1ce54272580 | 81 | #define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0 |
| kotakku | 0:b1ce54272580 | 82 | #define USB_ERROR_FailGetDevDescr 0xE1 |
| kotakku | 0:b1ce54272580 | 83 | #define USB_ERROR_FailSetDevTblEntry 0xE2 |
| kotakku | 0:b1ce54272580 | 84 | #define USB_ERROR_FailGetConfDescr 0xE3 |
| kotakku | 0:b1ce54272580 | 85 | #define USB_ERROR_TRANSFER_TIMEOUT 0xFF |
| kotakku | 0:b1ce54272580 | 86 | |
| kotakku | 0:b1ce54272580 | 87 | #define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec |
| kotakku | 0:b1ce54272580 | 88 | //#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted |
| kotakku | 0:b1ce54272580 | 89 | #define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer |
| kotakku | 0:b1ce54272580 | 90 | #define USB_SETTLE_DELAY 200 // settle delay in milliseconds |
| kotakku | 0:b1ce54272580 | 91 | |
| kotakku | 0:b1ce54272580 | 92 | #define USB_NUMDEVICES 16 //number of USB devices |
| kotakku | 0:b1ce54272580 | 93 | //#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller |
| kotakku | 0:b1ce54272580 | 94 | #define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms |
| kotakku | 0:b1ce54272580 | 95 | |
| kotakku | 0:b1ce54272580 | 96 | /* USB state machine states */ |
| kotakku | 0:b1ce54272580 | 97 | #define USB_STATE_MASK 0xf0 |
| kotakku | 0:b1ce54272580 | 98 | |
| kotakku | 0:b1ce54272580 | 99 | #define USB_STATE_DETACHED 0x10 |
| kotakku | 0:b1ce54272580 | 100 | #define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 |
| kotakku | 0:b1ce54272580 | 101 | #define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12 |
| kotakku | 0:b1ce54272580 | 102 | #define USB_DETACHED_SUBSTATE_ILLEGAL 0x13 |
| kotakku | 0:b1ce54272580 | 103 | #define USB_ATTACHED_SUBSTATE_SETTLE 0x20 |
| kotakku | 0:b1ce54272580 | 104 | #define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30 |
| kotakku | 0:b1ce54272580 | 105 | #define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40 |
| kotakku | 0:b1ce54272580 | 106 | #define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50 |
| kotakku | 0:b1ce54272580 | 107 | #define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51 |
| kotakku | 0:b1ce54272580 | 108 | #define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60 |
| kotakku | 0:b1ce54272580 | 109 | #define USB_STATE_ADDRESSING 0x70 |
| kotakku | 0:b1ce54272580 | 110 | #define USB_STATE_CONFIGURING 0x80 |
| kotakku | 0:b1ce54272580 | 111 | #define USB_STATE_RUNNING 0x90 |
| kotakku | 0:b1ce54272580 | 112 | #define USB_STATE_ERROR 0xa0 |
| kotakku | 0:b1ce54272580 | 113 | |
| kotakku | 0:b1ce54272580 | 114 | class USBDeviceConfig |
| kotakku | 0:b1ce54272580 | 115 | { |
| kotakku | 0:b1ce54272580 | 116 | public: |
| kotakku | 0:b1ce54272580 | 117 | virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 118 | { |
| kotakku | 0:b1ce54272580 | 119 | return 0; |
| kotakku | 0:b1ce54272580 | 120 | } |
| kotakku | 0:b1ce54272580 | 121 | |
| kotakku | 0:b1ce54272580 | 122 | virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 123 | { |
| kotakku | 0:b1ce54272580 | 124 | return 0; |
| kotakku | 0:b1ce54272580 | 125 | } |
| kotakku | 0:b1ce54272580 | 126 | |
| kotakku | 0:b1ce54272580 | 127 | virtual uint8_t Release() |
| kotakku | 0:b1ce54272580 | 128 | { |
| kotakku | 0:b1ce54272580 | 129 | return 0; |
| kotakku | 0:b1ce54272580 | 130 | } |
| kotakku | 0:b1ce54272580 | 131 | |
| kotakku | 0:b1ce54272580 | 132 | virtual uint8_t Poll() |
| kotakku | 0:b1ce54272580 | 133 | { |
| kotakku | 0:b1ce54272580 | 134 | return 0; |
| kotakku | 0:b1ce54272580 | 135 | } |
| kotakku | 0:b1ce54272580 | 136 | |
| kotakku | 0:b1ce54272580 | 137 | virtual uint8_t GetAddress() |
| kotakku | 0:b1ce54272580 | 138 | { |
| kotakku | 0:b1ce54272580 | 139 | return 0; |
| kotakku | 0:b1ce54272580 | 140 | } |
| kotakku | 0:b1ce54272580 | 141 | |
| kotakku | 0:b1ce54272580 | 142 | virtual void ResetHubPort(uint8_t port __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 143 | { |
| kotakku | 0:b1ce54272580 | 144 | return; |
| kotakku | 0:b1ce54272580 | 145 | } // Note used for hubs only! |
| kotakku | 0:b1ce54272580 | 146 | |
| kotakku | 0:b1ce54272580 | 147 | virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 148 | { |
| kotakku | 0:b1ce54272580 | 149 | return false; |
| kotakku | 0:b1ce54272580 | 150 | } |
| kotakku | 0:b1ce54272580 | 151 | |
| kotakku | 0:b1ce54272580 | 152 | virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 153 | { |
| kotakku | 0:b1ce54272580 | 154 | return false; |
| kotakku | 0:b1ce54272580 | 155 | } |
| kotakku | 0:b1ce54272580 | 156 | |
| kotakku | 0:b1ce54272580 | 157 | virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) |
| kotakku | 0:b1ce54272580 | 158 | { |
| kotakku | 0:b1ce54272580 | 159 | return true; |
| kotakku | 0:b1ce54272580 | 160 | } |
| kotakku | 0:b1ce54272580 | 161 | }; |
| kotakku | 0:b1ce54272580 | 162 | |
| kotakku | 0:b1ce54272580 | 163 | /* USB Setup Packet Structure */ |
| kotakku | 0:b1ce54272580 | 164 | typedef struct |
| kotakku | 0:b1ce54272580 | 165 | { |
| kotakku | 0:b1ce54272580 | 166 | |
| kotakku | 0:b1ce54272580 | 167 | union { // offset description |
| kotakku | 0:b1ce54272580 | 168 | uint8_t bmRequestType; // 0 Bit-map of request type |
| kotakku | 0:b1ce54272580 | 169 | |
| kotakku | 0:b1ce54272580 | 170 | struct |
| kotakku | 0:b1ce54272580 | 171 | { |
| kotakku | 0:b1ce54272580 | 172 | uint8_t recipient : 5; // Recipient of the request |
| kotakku | 0:b1ce54272580 | 173 | uint8_t type : 2; // Type of request |
| kotakku | 0:b1ce54272580 | 174 | uint8_t direction : 1; // Direction of data X-fer |
| kotakku | 0:b1ce54272580 | 175 | } __attribute__((packed)); |
| kotakku | 0:b1ce54272580 | 176 | } ReqType_u; |
| kotakku | 0:b1ce54272580 | 177 | uint8_t bRequest; // 1 Request |
| kotakku | 0:b1ce54272580 | 178 | |
| kotakku | 0:b1ce54272580 | 179 | union { |
| kotakku | 0:b1ce54272580 | 180 | uint16_t wValue; // 2 Depends on bRequest |
| kotakku | 0:b1ce54272580 | 181 | |
| kotakku | 0:b1ce54272580 | 182 | struct |
| kotakku | 0:b1ce54272580 | 183 | { |
| kotakku | 0:b1ce54272580 | 184 | uint8_t wValueLo; |
| kotakku | 0:b1ce54272580 | 185 | uint8_t wValueHi; |
| kotakku | 0:b1ce54272580 | 186 | } __attribute__((packed)); |
| kotakku | 0:b1ce54272580 | 187 | } wVal_u; |
| kotakku | 0:b1ce54272580 | 188 | uint16_t wIndex; // 4 Depends on bRequest |
| kotakku | 0:b1ce54272580 | 189 | uint16_t wLength; // 6 Depends on bRequest |
| kotakku | 0:b1ce54272580 | 190 | } __attribute__((packed)) SETUP_PKT, *PSETUP_PKT; |
| kotakku | 0:b1ce54272580 | 191 | |
| kotakku | 0:b1ce54272580 | 192 | // Base class for incoming data parser |
| kotakku | 0:b1ce54272580 | 193 | |
| kotakku | 0:b1ce54272580 | 194 | class USBReadParser |
| kotakku | 0:b1ce54272580 | 195 | { |
| kotakku | 0:b1ce54272580 | 196 | public: |
| kotakku | 0:b1ce54272580 | 197 | virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0; |
| kotakku | 0:b1ce54272580 | 198 | }; |
| kotakku | 0:b1ce54272580 | 199 | |
| kotakku | 0:b1ce54272580 | 200 | class USB : public MAX3421E |
| kotakku | 0:b1ce54272580 | 201 | { |
| kotakku | 0:b1ce54272580 | 202 | AddressPoolImpl<USB_NUMDEVICES> addrPool; |
| kotakku | 0:b1ce54272580 | 203 | USBDeviceConfig *devConfig[USB_NUMDEVICES]; |
| kotakku | 0:b1ce54272580 | 204 | uint8_t bmHubPre; |
| kotakku | 0:b1ce54272580 | 205 | |
| kotakku | 0:b1ce54272580 | 206 | private: |
| kotakku | 0:b1ce54272580 | 207 | static Timer arduinoTimer; // for millis() & micros() function in Arduino |
| kotakku | 0:b1ce54272580 | 208 | public: |
| kotakku | 0:b1ce54272580 | 209 | static uint32_t read_ms() { return arduinoTimer.read_ms(); } |
| kotakku | 0:b1ce54272580 | 210 | static uint32_t read_us() { return arduinoTimer.read_us(); } |
| kotakku | 0:b1ce54272580 | 211 | |
| kotakku | 0:b1ce54272580 | 212 | public: |
| kotakku | 0:b1ce54272580 | 213 | USB(PinName mosi, PinName miso, PinName sclk, PinName ssel, PinName intr); |
| kotakku | 0:b1ce54272580 | 214 | |
| kotakku | 0:b1ce54272580 | 215 | void SetHubPreMask() |
| kotakku | 0:b1ce54272580 | 216 | { |
| kotakku | 0:b1ce54272580 | 217 | bmHubPre |= bmHUBPRE; |
| kotakku | 0:b1ce54272580 | 218 | }; |
| kotakku | 0:b1ce54272580 | 219 | |
| kotakku | 0:b1ce54272580 | 220 | void ResetHubPreMask() |
| kotakku | 0:b1ce54272580 | 221 | { |
| kotakku | 0:b1ce54272580 | 222 | bmHubPre &= (~bmHUBPRE); |
| kotakku | 0:b1ce54272580 | 223 | }; |
| kotakku | 0:b1ce54272580 | 224 | |
| kotakku | 0:b1ce54272580 | 225 | AddressPool &GetAddressPool() |
| kotakku | 0:b1ce54272580 | 226 | { |
| kotakku | 0:b1ce54272580 | 227 | return (AddressPool &)addrPool; |
| kotakku | 0:b1ce54272580 | 228 | }; |
| kotakku | 0:b1ce54272580 | 229 | |
| kotakku | 0:b1ce54272580 | 230 | uint8_t RegisterDeviceClass(USBDeviceConfig *pdev) |
| kotakku | 0:b1ce54272580 | 231 | { |
| kotakku | 0:b1ce54272580 | 232 | for (uint8_t i = 0; i < USB_NUMDEVICES; i++) |
| kotakku | 0:b1ce54272580 | 233 | { |
| kotakku | 0:b1ce54272580 | 234 | if (!devConfig[i]) |
| kotakku | 0:b1ce54272580 | 235 | { |
| kotakku | 0:b1ce54272580 | 236 | devConfig[i] = pdev; |
| kotakku | 0:b1ce54272580 | 237 | return 0; |
| kotakku | 0:b1ce54272580 | 238 | } |
| kotakku | 0:b1ce54272580 | 239 | } |
| kotakku | 0:b1ce54272580 | 240 | return USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS; |
| kotakku | 0:b1ce54272580 | 241 | }; |
| kotakku | 0:b1ce54272580 | 242 | |
| kotakku | 0:b1ce54272580 | 243 | void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) |
| kotakku | 0:b1ce54272580 | 244 | { |
| kotakku | 0:b1ce54272580 | 245 | addrPool.ForEachUsbDevice(pfunc); |
| kotakku | 0:b1ce54272580 | 246 | }; |
| kotakku | 0:b1ce54272580 | 247 | uint8_t getUsbTaskState(void); |
| kotakku | 0:b1ce54272580 | 248 | void setUsbTaskState(uint8_t state); |
| kotakku | 0:b1ce54272580 | 249 | |
| kotakku | 0:b1ce54272580 | 250 | EpInfo *getEpInfoEntry(uint8_t addr, uint8_t ep); |
| kotakku | 0:b1ce54272580 | 251 | uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo *eprecord_ptr); |
| kotakku | 0:b1ce54272580 | 252 | |
| kotakku | 0:b1ce54272580 | 253 | /* Control requests */ |
| kotakku | 0:b1ce54272580 | 254 | uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr); |
| kotakku | 0:b1ce54272580 | 255 | uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr); |
| kotakku | 0:b1ce54272580 | 256 | |
| kotakku | 0:b1ce54272580 | 257 | uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p); |
| kotakku | 0:b1ce54272580 | 258 | |
| kotakku | 0:b1ce54272580 | 259 | uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr); |
| kotakku | 0:b1ce54272580 | 260 | uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr); |
| kotakku | 0:b1ce54272580 | 261 | uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value); |
| kotakku | 0:b1ce54272580 | 262 | /**/ |
| kotakku | 0:b1ce54272580 | 263 | uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction); |
| kotakku | 0:b1ce54272580 | 264 | uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit); |
| kotakku | 0:b1ce54272580 | 265 | uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); |
| kotakku | 0:b1ce54272580 | 266 | uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data); |
| kotakku | 0:b1ce54272580 | 267 | uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); |
| kotakku | 0:b1ce54272580 | 268 | |
| kotakku | 0:b1ce54272580 | 269 | void Task(void); |
| kotakku | 0:b1ce54272580 | 270 | |
| kotakku | 0:b1ce54272580 | 271 | uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed); |
| kotakku | 0:b1ce54272580 | 272 | uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed); |
| kotakku | 0:b1ce54272580 | 273 | uint8_t ReleaseDevice(uint8_t addr); |
| kotakku | 0:b1ce54272580 | 274 | |
| kotakku | 0:b1ce54272580 | 275 | uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, |
| kotakku | 0:b1ce54272580 | 276 | uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p); |
| kotakku | 0:b1ce54272580 | 277 | |
| kotakku | 0:b1ce54272580 | 278 | private: |
| kotakku | 0:b1ce54272580 | 279 | void init(); |
| kotakku | 0:b1ce54272580 | 280 | uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit); |
| kotakku | 0:b1ce54272580 | 281 | uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data); |
| kotakku | 0:b1ce54272580 | 282 | uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); |
| kotakku | 0:b1ce54272580 | 283 | uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed); |
| kotakku | 0:b1ce54272580 | 284 | }; |
| kotakku | 0:b1ce54272580 | 285 | |
| kotakku | 0:b1ce54272580 | 286 | #if 0 //defined(USB_METHODS_INLINE) |
| kotakku | 0:b1ce54272580 | 287 | //get device descriptor |
| kotakku | 0:b1ce54272580 | 288 | |
| kotakku | 0:b1ce54272580 | 289 | inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { |
| kotakku | 0:b1ce54272580 | 290 | return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr)); |
| kotakku | 0:b1ce54272580 | 291 | } |
| kotakku | 0:b1ce54272580 | 292 | //get configuration descriptor |
| kotakku | 0:b1ce54272580 | 293 | |
| kotakku | 0:b1ce54272580 | 294 | inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { |
| kotakku | 0:b1ce54272580 | 295 | return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr)); |
| kotakku | 0:b1ce54272580 | 296 | } |
| kotakku | 0:b1ce54272580 | 297 | //get string descriptor |
| kotakku | 0:b1ce54272580 | 298 | |
| kotakku | 0:b1ce54272580 | 299 | inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) { |
| kotakku | 0:b1ce54272580 | 300 | return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr)); |
| kotakku | 0:b1ce54272580 | 301 | } |
| kotakku | 0:b1ce54272580 | 302 | //set address |
| kotakku | 0:b1ce54272580 | 303 | |
| kotakku | 0:b1ce54272580 | 304 | inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { |
| kotakku | 0:b1ce54272580 | 305 | return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, NULL)); |
| kotakku | 0:b1ce54272580 | 306 | } |
| kotakku | 0:b1ce54272580 | 307 | //set configuration |
| kotakku | 0:b1ce54272580 | 308 | |
| kotakku | 0:b1ce54272580 | 309 | inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { |
| kotakku | 0:b1ce54272580 | 310 | return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL)); |
| kotakku | 0:b1ce54272580 | 311 | } |
| kotakku | 0:b1ce54272580 | 312 | |
| robo_ichinoseki_a | 1:da31140f2a1c | 313 | //Timer USB::arduinoTimer; |
| kotakku | 0:b1ce54272580 | 314 | |
| kotakku | 0:b1ce54272580 | 315 | #endif // defined(USB_METHODS_INLINE) |
| kotakku | 0:b1ce54272580 | 316 | |
| kotakku | 0:b1ce54272580 | 317 | #endif /* USBCORE_H */ |