|
1 | 1 | #include "usb.h" |
2 | 2 | #include "config.h" |
3 | 3 | #include "pico/bootrom.h" |
4 | | - |
5 | 4 | // TODO: implement vendor-reset interface |
6 | 5 |
|
7 | 6 | void usb_init(void) { |
@@ -67,3 +66,72 @@ void tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_line_coding) |
67 | 66 | reset_usb_boot(0, 0); |
68 | 67 | } |
69 | 68 | } |
| 69 | + |
| 70 | +uint8_t to_send[6] = {9, 9, 9, 9, 9, 9}; |
| 71 | +bool veandor_request_temperature_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) |
| 72 | +{ |
| 73 | + bool result = false; |
| 74 | + |
| 75 | + if (request->bmRequestType_bit.direction == TUSB_DIR_IN) { |
| 76 | + io_say_f(" DIR_IN\n"); |
| 77 | + switch (stage) { |
| 78 | + case CONTROL_STAGE_SETUP: |
| 79 | + result = tud_control_xfer(rhport, request, &to_send, sizeof(to_send)); |
| 80 | + break; |
| 81 | + case CONTROL_STAGE_DATA: |
| 82 | + case CONTROL_STAGE_ACK: |
| 83 | + result = true; |
| 84 | + break; |
| 85 | + } |
| 86 | + } else { |
| 87 | + io_say_f(" DIR_OUT\n"); |
| 88 | + switch (stage) { |
| 89 | + case CONTROL_STAGE_SETUP: |
| 90 | + result = tud_control_xfer(rhport, request, &to_send, sizeof(to_send)); |
| 91 | + break; |
| 92 | + case CONTROL_STAGE_DATA: |
| 93 | + case CONTROL_STAGE_ACK: |
| 94 | + result = true; |
| 95 | + break; |
| 96 | + } |
| 97 | + } |
| 98 | + return result; |
| 99 | +} |
| 100 | + |
| 101 | +bool vendor_request_temperature_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) |
| 102 | +{ |
| 103 | + if (request->bmRequestType_bit.direction != TUSB_DIR_IN) |
| 104 | + return false; |
| 105 | + |
| 106 | + if (stage != CONTROL_STAGE_SETUP) |
| 107 | + return true; |
| 108 | + |
| 109 | + uint8_t reg = 0; |
| 110 | + uint8_t buffer[2] = {0}; |
| 111 | + i2c_write_blocking_until(PWR_BRD_I2C_INST, PWR_BRD_TEMP_SENS_ADDR, ®, 1, true, make_timeout_time_ms(20)); |
| 112 | + i2c_read_blocking_until(PWR_BRD_I2C_INST, PWR_BRD_TEMP_SENS_ADDR, &buffer, 2, false, make_timeout_time_ms(20)); |
| 113 | + |
| 114 | + return tud_control_xfer(rhport, request, &buffer, sizeof(buffer)); |
| 115 | +} |
| 116 | + |
| 117 | + |
| 118 | +bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* request) { |
| 119 | + bool result = false; |
| 120 | + switch (request->bmRequestType_bit.type) { |
| 121 | + case TUSB_REQ_TYPE_VENDOR: |
| 122 | + io_say_f("XFER: bRequest=%d, wValue=%d, wIndex=%d, wLength=%d\n", request->bRequest, request->wValue, request->wIndex, request->wLength); |
| 123 | + switch (request->bRequest) { |
| 124 | + case VENDOR_REQUEST_TEMPERATURE: |
| 125 | + result = vendor_request_temperature_cb(rhport, stage, request); |
| 126 | + break; |
| 127 | + } |
| 128 | + break; |
| 129 | + case TUSB_REQ_TYPE_STANDARD: |
| 130 | + io_say_f("STANDARD: bRequest=%d\n", request->bRequest); |
| 131 | + break; |
| 132 | + case TUSB_REQ_TYPE_CLASS: |
| 133 | + io_say_f("CLASS: bRequest=%d\n", request->bRequest); |
| 134 | + break; |
| 135 | + } |
| 136 | + return result; |
| 137 | +} |
0 commit comments