Lucas Lim / Mbed 2 deprecated HSP_Temperature_Barometer_CS3237

Dependencies:   mbed

Committer:
lucaslwl
Date:
Mon Aug 26 08:11:41 2019 +0000
Revision:
22:5c07298d3383
add library folder

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucaslwl 22:5c07298d3383 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
lucaslwl 22:5c07298d3383 2 *
lucaslwl 22:5c07298d3383 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
lucaslwl 22:5c07298d3383 4 * and associated documentation files (the "Software"), to deal in the Software without
lucaslwl 22:5c07298d3383 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
lucaslwl 22:5c07298d3383 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
lucaslwl 22:5c07298d3383 7 * Software is furnished to do so, subject to the following conditions:
lucaslwl 22:5c07298d3383 8 *
lucaslwl 22:5c07298d3383 9 * The above copyright notice and this permission notice shall be included in all copies or
lucaslwl 22:5c07298d3383 10 * substantial portions of the Software.
lucaslwl 22:5c07298d3383 11 *
lucaslwl 22:5c07298d3383 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
lucaslwl 22:5c07298d3383 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
lucaslwl 22:5c07298d3383 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
lucaslwl 22:5c07298d3383 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lucaslwl 22:5c07298d3383 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
lucaslwl 22:5c07298d3383 17 */
lucaslwl 22:5c07298d3383 18
lucaslwl 22:5c07298d3383 19 #include "stdint.h"
lucaslwl 22:5c07298d3383 20 #include "USBCDC.h"
lucaslwl 22:5c07298d3383 21
lucaslwl 22:5c07298d3383 22 static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
lucaslwl 22:5c07298d3383 23
lucaslwl 22:5c07298d3383 24 #define DEFAULT_CONFIGURATION (1)
lucaslwl 22:5c07298d3383 25
lucaslwl 22:5c07298d3383 26 #define CDC_SET_LINE_CODING 0x20
lucaslwl 22:5c07298d3383 27 #define CDC_GET_LINE_CODING 0x21
lucaslwl 22:5c07298d3383 28 #define CDC_SET_CONTROL_LINE_STATE 0x22
lucaslwl 22:5c07298d3383 29
lucaslwl 22:5c07298d3383 30 // Control Line State bits
lucaslwl 22:5c07298d3383 31 #define CLS_DTR (1 << 0)
lucaslwl 22:5c07298d3383 32 #define CLS_RTS (1 << 1)
lucaslwl 22:5c07298d3383 33
lucaslwl 22:5c07298d3383 34 #define MAX_CDC_REPORT_SIZE MAX_PACKET_SIZE_EPBULK
lucaslwl 22:5c07298d3383 35
lucaslwl 22:5c07298d3383 36 USBCDC::USBCDC(uint16_t vendor_id, uint16_t product_id, uint16_t product_release, bool connect_blocking): USBDevice(vendor_id, product_id, product_release) {
lucaslwl 22:5c07298d3383 37 terminal_connected = false;
lucaslwl 22:5c07298d3383 38 USBDevice::connect(connect_blocking);
lucaslwl 22:5c07298d3383 39 }
lucaslwl 22:5c07298d3383 40
lucaslwl 22:5c07298d3383 41 bool USBCDC::USBCallback_request(void) {
lucaslwl 22:5c07298d3383 42 /* Called in ISR context */
lucaslwl 22:5c07298d3383 43
lucaslwl 22:5c07298d3383 44 bool success = false;
lucaslwl 22:5c07298d3383 45 CONTROL_TRANSFER * transfer = getTransferPtr();
lucaslwl 22:5c07298d3383 46
lucaslwl 22:5c07298d3383 47 /* Process class-specific requests */
lucaslwl 22:5c07298d3383 48
lucaslwl 22:5c07298d3383 49 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
lucaslwl 22:5c07298d3383 50 switch (transfer->setup.bRequest) {
lucaslwl 22:5c07298d3383 51 case CDC_GET_LINE_CODING:
lucaslwl 22:5c07298d3383 52 transfer->remaining = 7;
lucaslwl 22:5c07298d3383 53 transfer->ptr = cdc_line_coding;
lucaslwl 22:5c07298d3383 54 transfer->direction = DEVICE_TO_HOST;
lucaslwl 22:5c07298d3383 55 success = true;
lucaslwl 22:5c07298d3383 56 break;
lucaslwl 22:5c07298d3383 57 case CDC_SET_LINE_CODING:
lucaslwl 22:5c07298d3383 58 transfer->remaining = 7;
lucaslwl 22:5c07298d3383 59 transfer->notify = true;
lucaslwl 22:5c07298d3383 60 success = true;
lucaslwl 22:5c07298d3383 61 break;
lucaslwl 22:5c07298d3383 62 case CDC_SET_CONTROL_LINE_STATE:
lucaslwl 22:5c07298d3383 63 if (transfer->setup.wValue & CLS_DTR) {
lucaslwl 22:5c07298d3383 64 terminal_connected = true;
lucaslwl 22:5c07298d3383 65 } else {
lucaslwl 22:5c07298d3383 66 terminal_connected = false;
lucaslwl 22:5c07298d3383 67 }
lucaslwl 22:5c07298d3383 68 success = true;
lucaslwl 22:5c07298d3383 69 break;
lucaslwl 22:5c07298d3383 70 default:
lucaslwl 22:5c07298d3383 71 break;
lucaslwl 22:5c07298d3383 72 }
lucaslwl 22:5c07298d3383 73 }
lucaslwl 22:5c07298d3383 74
lucaslwl 22:5c07298d3383 75 return success;
lucaslwl 22:5c07298d3383 76 }
lucaslwl 22:5c07298d3383 77
lucaslwl 22:5c07298d3383 78 void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
lucaslwl 22:5c07298d3383 79 // Request of setting line coding has 7 bytes
lucaslwl 22:5c07298d3383 80 if (length != 7) {
lucaslwl 22:5c07298d3383 81 return;
lucaslwl 22:5c07298d3383 82 }
lucaslwl 22:5c07298d3383 83
lucaslwl 22:5c07298d3383 84 CONTROL_TRANSFER * transfer = getTransferPtr();
lucaslwl 22:5c07298d3383 85
lucaslwl 22:5c07298d3383 86 /* Process class-specific requests */
lucaslwl 22:5c07298d3383 87 if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
lucaslwl 22:5c07298d3383 88 if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
lucaslwl 22:5c07298d3383 89 if (memcmp(cdc_line_coding, buf, 7)) {
lucaslwl 22:5c07298d3383 90 memcpy(cdc_line_coding, buf, 7);
lucaslwl 22:5c07298d3383 91
lucaslwl 22:5c07298d3383 92 int baud = buf[0] + (buf[1] << 8)
lucaslwl 22:5c07298d3383 93 + (buf[2] << 16) + (buf[3] << 24);
lucaslwl 22:5c07298d3383 94 int stop = buf[4];
lucaslwl 22:5c07298d3383 95 int bits = buf[6];
lucaslwl 22:5c07298d3383 96 int parity = buf[5];
lucaslwl 22:5c07298d3383 97
lucaslwl 22:5c07298d3383 98 lineCodingChanged(baud, bits, parity, stop);
lucaslwl 22:5c07298d3383 99 }
lucaslwl 22:5c07298d3383 100 }
lucaslwl 22:5c07298d3383 101 }
lucaslwl 22:5c07298d3383 102 }
lucaslwl 22:5c07298d3383 103
lucaslwl 22:5c07298d3383 104 // Called in ISR context
lucaslwl 22:5c07298d3383 105 // Set configuration. Return false if the
lucaslwl 22:5c07298d3383 106 // configuration is not supported.
lucaslwl 22:5c07298d3383 107 bool USBCDC::USBCallback_setConfiguration(uint8_t configuration) {
lucaslwl 22:5c07298d3383 108 if (configuration != DEFAULT_CONFIGURATION) {
lucaslwl 22:5c07298d3383 109 return false;
lucaslwl 22:5c07298d3383 110 }
lucaslwl 22:5c07298d3383 111
lucaslwl 22:5c07298d3383 112 // Configure endpoints > 0
lucaslwl 22:5c07298d3383 113 addEndpoint(EPINT_IN, MAX_PACKET_SIZE_EPINT);
lucaslwl 22:5c07298d3383 114 addEndpoint(EPBULK_IN, MAX_PACKET_SIZE_EPBULK);
lucaslwl 22:5c07298d3383 115 addEndpoint(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
lucaslwl 22:5c07298d3383 116
lucaslwl 22:5c07298d3383 117 // We activate the endpoint to be able to recceive data
lucaslwl 22:5c07298d3383 118 readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK);
lucaslwl 22:5c07298d3383 119 return true;
lucaslwl 22:5c07298d3383 120 }
lucaslwl 22:5c07298d3383 121
lucaslwl 22:5c07298d3383 122 bool USBCDC::send(uint8_t * buffer, uint32_t size) {
lucaslwl 22:5c07298d3383 123 return USBDevice::write(EPBULK_IN, buffer, size, MAX_CDC_REPORT_SIZE);
lucaslwl 22:5c07298d3383 124 }
lucaslwl 22:5c07298d3383 125
lucaslwl 22:5c07298d3383 126 bool USBCDC::readEP(uint8_t * buffer, uint32_t * size) {
lucaslwl 22:5c07298d3383 127 if (!USBDevice::readEP(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
lucaslwl 22:5c07298d3383 128 return false;
lucaslwl 22:5c07298d3383 129 if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
lucaslwl 22:5c07298d3383 130 return false;
lucaslwl 22:5c07298d3383 131 return true;
lucaslwl 22:5c07298d3383 132 }
lucaslwl 22:5c07298d3383 133
lucaslwl 22:5c07298d3383 134 bool USBCDC::readEP_NB(uint8_t * buffer, uint32_t * size) {
lucaslwl 22:5c07298d3383 135 if (!USBDevice::readEP_NB(EPBULK_OUT, buffer, size, MAX_CDC_REPORT_SIZE))
lucaslwl 22:5c07298d3383 136 return false;
lucaslwl 22:5c07298d3383 137 if (!readStart(EPBULK_OUT, MAX_CDC_REPORT_SIZE))
lucaslwl 22:5c07298d3383 138 return false;
lucaslwl 22:5c07298d3383 139 return true;
lucaslwl 22:5c07298d3383 140 }
lucaslwl 22:5c07298d3383 141
lucaslwl 22:5c07298d3383 142
lucaslwl 22:5c07298d3383 143 uint8_t * USBCDC::deviceDesc() {
lucaslwl 22:5c07298d3383 144 static uint8_t deviceDescriptor[] = {
lucaslwl 22:5c07298d3383 145 18, // bLength
lucaslwl 22:5c07298d3383 146 1, // bDescriptorType
lucaslwl 22:5c07298d3383 147 0x10, 0x01, // bcdUSB
lucaslwl 22:5c07298d3383 148 2, // bDeviceClass
lucaslwl 22:5c07298d3383 149 0, // bDeviceSubClass
lucaslwl 22:5c07298d3383 150 0, // bDeviceProtocol
lucaslwl 22:5c07298d3383 151 MAX_PACKET_SIZE_EP0, // bMaxPacketSize0
lucaslwl 22:5c07298d3383 152 (uint8_t)(LSB(VENDOR_ID)), (uint8_t)(MSB(VENDOR_ID)), // idVendor
lucaslwl 22:5c07298d3383 153 (uint8_t)(LSB(PRODUCT_ID)), (uint8_t)(MSB(PRODUCT_ID)),// idProduct
lucaslwl 22:5c07298d3383 154 0x00, 0x01, // bcdDevice
lucaslwl 22:5c07298d3383 155 1, // iManufacturer
lucaslwl 22:5c07298d3383 156 2, // iProduct
lucaslwl 22:5c07298d3383 157 3, // iSerialNumber
lucaslwl 22:5c07298d3383 158 1 // bNumConfigurations
lucaslwl 22:5c07298d3383 159 };
lucaslwl 22:5c07298d3383 160 return deviceDescriptor;
lucaslwl 22:5c07298d3383 161 }
lucaslwl 22:5c07298d3383 162
lucaslwl 22:5c07298d3383 163 uint8_t * USBCDC::stringIinterfaceDesc() {
lucaslwl 22:5c07298d3383 164 static uint8_t stringIinterfaceDescriptor[] = {
lucaslwl 22:5c07298d3383 165 0x08,
lucaslwl 22:5c07298d3383 166 STRING_DESCRIPTOR,
lucaslwl 22:5c07298d3383 167 'C',0,'D',0,'C',0,
lucaslwl 22:5c07298d3383 168 };
lucaslwl 22:5c07298d3383 169 return stringIinterfaceDescriptor;
lucaslwl 22:5c07298d3383 170 }
lucaslwl 22:5c07298d3383 171
lucaslwl 22:5c07298d3383 172 uint8_t * USBCDC::stringIproductDesc() {
lucaslwl 22:5c07298d3383 173 static uint8_t stringIproductDescriptor[] = {
lucaslwl 22:5c07298d3383 174 0x16,
lucaslwl 22:5c07298d3383 175 STRING_DESCRIPTOR,
lucaslwl 22:5c07298d3383 176 'C',0,'D',0,'C',0,' ',0,'D',0,'E',0,'V',0,'I',0,'C',0,'E',0
lucaslwl 22:5c07298d3383 177 };
lucaslwl 22:5c07298d3383 178 return stringIproductDescriptor;
lucaslwl 22:5c07298d3383 179 }
lucaslwl 22:5c07298d3383 180
lucaslwl 22:5c07298d3383 181
lucaslwl 22:5c07298d3383 182 #define CONFIG1_DESC_SIZE (9+8+9+5+5+4+5+7+9+7+7)
lucaslwl 22:5c07298d3383 183
lucaslwl 22:5c07298d3383 184 uint8_t * USBCDC::configurationDesc() {
lucaslwl 22:5c07298d3383 185 static uint8_t configDescriptor[] = {
lucaslwl 22:5c07298d3383 186 // configuration descriptor
lucaslwl 22:5c07298d3383 187 9, // bLength
lucaslwl 22:5c07298d3383 188 2, // bDescriptorType
lucaslwl 22:5c07298d3383 189 LSB(CONFIG1_DESC_SIZE), // wTotalLength
lucaslwl 22:5c07298d3383 190 MSB(CONFIG1_DESC_SIZE),
lucaslwl 22:5c07298d3383 191 2, // bNumInterfaces
lucaslwl 22:5c07298d3383 192 1, // bConfigurationValue
lucaslwl 22:5c07298d3383 193 0, // iConfiguration
lucaslwl 22:5c07298d3383 194 0x80, // bmAttributes
lucaslwl 22:5c07298d3383 195 50, // bMaxPower
lucaslwl 22:5c07298d3383 196
lucaslwl 22:5c07298d3383 197 // IAD to associate the two CDC interfaces
lucaslwl 22:5c07298d3383 198 0x08, // bLength
lucaslwl 22:5c07298d3383 199 0x0b, // bDescriptorType
lucaslwl 22:5c07298d3383 200 0x00, // bFirstInterface
lucaslwl 22:5c07298d3383 201 0x02, // bInterfaceCount
lucaslwl 22:5c07298d3383 202 0x02, // bFunctionClass
lucaslwl 22:5c07298d3383 203 0x02, // bFunctionSubClass
lucaslwl 22:5c07298d3383 204 0, // bFunctionProtocol
lucaslwl 22:5c07298d3383 205 0, // iFunction
lucaslwl 22:5c07298d3383 206
lucaslwl 22:5c07298d3383 207 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
lucaslwl 22:5c07298d3383 208 9, // bLength
lucaslwl 22:5c07298d3383 209 4, // bDescriptorType
lucaslwl 22:5c07298d3383 210 0, // bInterfaceNumber
lucaslwl 22:5c07298d3383 211 0, // bAlternateSetting
lucaslwl 22:5c07298d3383 212 1, // bNumEndpoints
lucaslwl 22:5c07298d3383 213 0x02, // bInterfaceClass
lucaslwl 22:5c07298d3383 214 0x02, // bInterfaceSubClass
lucaslwl 22:5c07298d3383 215 0x01, // bInterfaceProtocol
lucaslwl 22:5c07298d3383 216 0, // iInterface
lucaslwl 22:5c07298d3383 217
lucaslwl 22:5c07298d3383 218 // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26
lucaslwl 22:5c07298d3383 219 5, // bFunctionLength
lucaslwl 22:5c07298d3383 220 0x24, // bDescriptorType
lucaslwl 22:5c07298d3383 221 0x00, // bDescriptorSubtype
lucaslwl 22:5c07298d3383 222 0x10, 0x01, // bcdCDC
lucaslwl 22:5c07298d3383 223
lucaslwl 22:5c07298d3383 224 // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27
lucaslwl 22:5c07298d3383 225 5, // bFunctionLength
lucaslwl 22:5c07298d3383 226 0x24, // bDescriptorType
lucaslwl 22:5c07298d3383 227 0x01, // bDescriptorSubtype
lucaslwl 22:5c07298d3383 228 0x03, // bmCapabilities
lucaslwl 22:5c07298d3383 229 1, // bDataInterface
lucaslwl 22:5c07298d3383 230
lucaslwl 22:5c07298d3383 231 // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28
lucaslwl 22:5c07298d3383 232 4, // bFunctionLength
lucaslwl 22:5c07298d3383 233 0x24, // bDescriptorType
lucaslwl 22:5c07298d3383 234 0x02, // bDescriptorSubtype
lucaslwl 22:5c07298d3383 235 0x06, // bmCapabilities
lucaslwl 22:5c07298d3383 236
lucaslwl 22:5c07298d3383 237 // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33
lucaslwl 22:5c07298d3383 238 5, // bFunctionLength
lucaslwl 22:5c07298d3383 239 0x24, // bDescriptorType
lucaslwl 22:5c07298d3383 240 0x06, // bDescriptorSubtype
lucaslwl 22:5c07298d3383 241 0, // bMasterInterface
lucaslwl 22:5c07298d3383 242 1, // bSlaveInterface0
lucaslwl 22:5c07298d3383 243
lucaslwl 22:5c07298d3383 244 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
lucaslwl 22:5c07298d3383 245 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
lucaslwl 22:5c07298d3383 246 ENDPOINT_DESCRIPTOR, // bDescriptorType
lucaslwl 22:5c07298d3383 247 PHY_TO_DESC(EPINT_IN), // bEndpointAddress
lucaslwl 22:5c07298d3383 248 E_INTERRUPT, // bmAttributes (0x03=intr)
lucaslwl 22:5c07298d3383 249 LSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (LSB)
lucaslwl 22:5c07298d3383 250 MSB(MAX_PACKET_SIZE_EPINT), // wMaxPacketSize (MSB)
lucaslwl 22:5c07298d3383 251 16, // bInterval
lucaslwl 22:5c07298d3383 252
lucaslwl 22:5c07298d3383 253
lucaslwl 22:5c07298d3383 254
lucaslwl 22:5c07298d3383 255
lucaslwl 22:5c07298d3383 256 // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
lucaslwl 22:5c07298d3383 257 9, // bLength
lucaslwl 22:5c07298d3383 258 4, // bDescriptorType
lucaslwl 22:5c07298d3383 259 1, // bInterfaceNumber
lucaslwl 22:5c07298d3383 260 0, // bAlternateSetting
lucaslwl 22:5c07298d3383 261 2, // bNumEndpoints
lucaslwl 22:5c07298d3383 262 0x0A, // bInterfaceClass
lucaslwl 22:5c07298d3383 263 0x00, // bInterfaceSubClass
lucaslwl 22:5c07298d3383 264 0x00, // bInterfaceProtocol
lucaslwl 22:5c07298d3383 265 0, // iInterface
lucaslwl 22:5c07298d3383 266
lucaslwl 22:5c07298d3383 267 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
lucaslwl 22:5c07298d3383 268 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
lucaslwl 22:5c07298d3383 269 ENDPOINT_DESCRIPTOR, // bDescriptorType
lucaslwl 22:5c07298d3383 270 PHY_TO_DESC(EPBULK_IN), // bEndpointAddress
lucaslwl 22:5c07298d3383 271 E_BULK, // bmAttributes (0x02=bulk)
lucaslwl 22:5c07298d3383 272 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
lucaslwl 22:5c07298d3383 273 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
lucaslwl 22:5c07298d3383 274 0, // bInterval
lucaslwl 22:5c07298d3383 275
lucaslwl 22:5c07298d3383 276 // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
lucaslwl 22:5c07298d3383 277 ENDPOINT_DESCRIPTOR_LENGTH, // bLength
lucaslwl 22:5c07298d3383 278 ENDPOINT_DESCRIPTOR, // bDescriptorType
lucaslwl 22:5c07298d3383 279 PHY_TO_DESC(EPBULK_OUT), // bEndpointAddress
lucaslwl 22:5c07298d3383 280 E_BULK, // bmAttributes (0x02=bulk)
lucaslwl 22:5c07298d3383 281 LSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (LSB)
lucaslwl 22:5c07298d3383 282 MSB(MAX_PACKET_SIZE_EPBULK),// wMaxPacketSize (MSB)
lucaslwl 22:5c07298d3383 283 0 // bInterval
lucaslwl 22:5c07298d3383 284 };
lucaslwl 22:5c07298d3383 285 return configDescriptor;
lucaslwl 22:5c07298d3383 286 }