Pico-PIO-USB/examples/usb_device/usb_device.c
hathach 7b98da86c8 make pico-pio-usb compatible with arduino lib
- rename example folder to examples, update ci accordingly
- added generated usb_rx/tx.pio.h
- added library.properties
2022-06-17 15:17:49 +07:00

148 lines
No EOL
4 KiB
C

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "pico/bootrom.h"
#include "pio_usb.h"
// Use tinyUSB header to define USB descriptors
#include "device/usbd.h"
#include "class/hid/hid_device.h"
static usb_device_t *usb_device = NULL;
tusb_desc_device_t const desc_device = {.bLength = sizeof(tusb_desc_device_t),
.bDescriptorType = TUSB_DESC_DEVICE,
.bcdUSB = 0x0110,
.bDeviceClass = 0x00,
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
.bMaxPacketSize0 = 64,
.idVendor = 0xCafe,
.idProduct = 0,
.bcdDevice = 0x0100,
.iManufacturer = 0x01,
.iProduct = 0x02,
.iSerialNumber = 0x03,
.bNumConfigurations = 0x01};
enum {
ITF_NUM_KEYBOARD,
ITF_NUM_MOUSE,
ITF_NUM_TOTAL,
};
enum {
EPNUM_KEYBOARD = 0x81,
EPNUM_MOUSE = 0x82,
};
uint8_t const desc_hid_keyboard_report[] =
{
TUD_HID_REPORT_DESC_KEYBOARD()
};
uint8_t const desc_hid_mouse_report[] =
{
TUD_HID_REPORT_DESC_MOUSE()
};
const uint8_t *report_desc[] = {desc_hid_keyboard_report,
desc_hid_mouse_report};
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + 2*TUD_HID_DESC_LEN)
uint8_t const desc_configuration[] = {
TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN,
TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
TUD_HID_DESCRIPTOR(ITF_NUM_KEYBOARD, 0, HID_ITF_PROTOCOL_KEYBOARD,
sizeof(desc_hid_keyboard_report), EPNUM_KEYBOARD,
CFG_TUD_HID_EP_BUFSIZE, 10),
TUD_HID_DESCRIPTOR(ITF_NUM_MOUSE, 0, HID_ITF_PROTOCOL_MOUSE,
sizeof(desc_hid_mouse_report), EPNUM_MOUSE,
CFG_TUD_HID_EP_BUFSIZE, 10),
};
static_assert(sizeof(desc_device) == 18, "device desc size error");
const char *string_descriptors_base[] = {
[0] = (const char[]){0x09, 0x04},
[1] = "Pico PIO USB",
[2] = "Pico PIO USB Device",
[3] = "123456",
};
static string_descriptor_t str_desc[4];
static void init_string_desc(void) {
for (int idx = 0; idx < 4; idx++) {
uint8_t len = 0;
uint16_t *wchar_str = (uint16_t *)&str_desc[idx];
if (idx == 0) {
wchar_str[1] = string_descriptors_base[0][0] |
((uint16_t)string_descriptors_base[0][1] << 8);
len = 1;
} else if (idx <= 3) {
len = strnlen(string_descriptors_base[idx], 31);
for (int i = 0; i < len; i++) {
wchar_str[i + 1] = string_descriptors_base[idx][i];
}
} else {
len = 0;
}
wchar_str[0] = (TUSB_DESC_STRING << 8) | (2 * len + 2);
}
}
static usb_descriptor_buffers_t desc = {
.device = (uint8_t *)&desc_device,
.config = desc_configuration,
.hid_report = report_desc,
.string = str_desc
};
void core1_main() {
sleep_ms(10);
static pio_usb_configuration_t config = PIO_USB_DEFAULT_CONFIG;
init_string_desc();
usb_device = pio_usb_device_init(&config, &desc);
while (true) {
pio_usb_device_task();
}
}
int main() {
// default 125MHz is not appropreate. Sysclock should be multiple of 12MHz.
set_sys_clock_khz(120000, true);
stdio_init_all();
printf("hello!");
sleep_ms(10);
multicore_reset_core1();
// all USB task run in core1
multicore_launch_core1(core1_main);
// move mouse pointer every 0.5s
while (true) {
if (usb_device != NULL) {
hid_mouse_report_t mouse_report = {0};
mouse_report.x = 1;
endpoint_t *ep = pio_usb_get_endpoint(usb_device, 2);
pio_usb_set_out_data(ep, (uint8_t *)&mouse_report, sizeof(mouse_report));
}
sleep_ms(500);
}
}