|
12 | 12 | #include <zephyr/kernel.h> |
13 | 13 | #include <zephyr/device.h> |
14 | 14 | #include <zephyr/drivers/gpio.h> |
| 15 | +#include <zephyr/drivers/usb/usb_bc12.h> |
15 | 16 | #include <zephyr/input/input.h> |
16 | 17 | #include <zephyr/sys/util.h> |
17 | 18 |
|
|
21 | 22 | #include <zephyr/logging/log.h> |
22 | 23 | LOG_MODULE_REGISTER(main, LOG_LEVEL_INF); |
23 | 24 |
|
| 25 | +static const struct device *bc12_dev = DEVICE_DT_GET_OR_NULL(DT_CHOSEN(zephyr_usb_bc12)); |
24 | 26 | static const struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); |
25 | 27 | static const uint8_t hid_report_desc[] = HID_MOUSE_REPORT_DESC(2); |
26 | 28 |
|
@@ -101,6 +103,40 @@ struct hid_device_ops mouse_ops = { |
101 | 103 | .get_report = mouse_get_report, |
102 | 104 | }; |
103 | 105 |
|
| 106 | +static const char *bc12type_to_str(const enum bc12_type type) |
| 107 | +{ |
| 108 | + switch (type) { |
| 109 | + case BC12_TYPE_NONE: |
| 110 | + return "NONE"; |
| 111 | + case BC12_TYPE_SDP: |
| 112 | + return "SDP"; |
| 113 | + case BC12_TYPE_DCP: |
| 114 | + return "DCP"; |
| 115 | + case BC12_TYPE_CDP: |
| 116 | + return "CDP"; |
| 117 | + case BC12_TYPE_PROPRIETARY: |
| 118 | + return "PROPRIETARY"; |
| 119 | + case BC12_TYPE_UNKNOWN: |
| 120 | + return "UNKNOWN"; |
| 121 | + default: |
| 122 | + return "ERROR"; |
| 123 | + } |
| 124 | +} |
| 125 | + |
| 126 | +static void bc12_result_cb(const struct device *dev, |
| 127 | + struct bc12_partner_state *const state, |
| 128 | + void *const user_data) |
| 129 | +{ |
| 130 | + if (state->bc12_role != BC12_PORTABLE_DEVICE) { |
| 131 | + LOG_ERR("Unexpected BC role"); |
| 132 | + return; |
| 133 | + } |
| 134 | + |
| 135 | + LOG_INF("New BC state %s (%d uV %d uA)", |
| 136 | + bc12type_to_str(state->type), state->voltage_uv, state->current_ua); |
| 137 | + |
| 138 | +} |
| 139 | + |
104 | 140 | int main(void) |
105 | 141 | { |
106 | 142 | struct usbd_context *sample_usbd; |
@@ -132,6 +168,20 @@ int main(void) |
132 | 168 | return ret; |
133 | 169 | } |
134 | 170 |
|
| 171 | + if (IS_ENABLED(CONFIG_USB_BC12)) { |
| 172 | + if (!device_is_ready(bc12_dev)) { |
| 173 | + LOG_ERR("USB BC1.2 device %s is not ready", bc12_dev->name); |
| 174 | + return -EIO; |
| 175 | + } |
| 176 | + |
| 177 | + bc12_set_result_cb(bc12_dev, &bc12_result_cb, NULL); |
| 178 | + ret = bc12_set_role(bc12_dev, BC12_PORTABLE_DEVICE); |
| 179 | + if (ret != 0) { |
| 180 | + LOG_ERR("Failed to set BC12 role"); |
| 181 | + return -EIO; |
| 182 | + } |
| 183 | + } |
| 184 | + |
135 | 185 | sample_usbd = sample_usbd_init_device(NULL); |
136 | 186 | if (sample_usbd == NULL) { |
137 | 187 | LOG_ERR("Failed to initialize USB device"); |
|
0 commit comments