summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2022-05-16 16:29:20 +0700
committerGitHub <[email protected]>2022-05-16 16:29:20 +0700
commitc2bcda86e2de35cc01628f4e909e2a7869a7322b (patch)
tree948f913855f9fb2f6b4e9dd726491649a21313d4 /examples
parentd23c9b7cd681b972d310e401b418f4368507e06f (diff)
parente0e9426c2a912c2c405da602b1bf8d75d16f92e7 (diff)
Merge pull request #1412 from hathach/pio-host
PIO USB support
Diffstat (limited to 'examples')
-rw-r--r--examples/device/hid_boot_interface/src/tusb_config.h4
-rw-r--r--examples/dual/host_hid_to_device_cdc/CMakeLists.txt (renamed from examples/host/hid_to_cdc/CMakeLists.txt)4
-rw-r--r--examples/dual/host_hid_to_device_cdc/Makefile (renamed from examples/host/hid_to_cdc/Makefile)0
-rw-r--r--examples/dual/host_hid_to_device_cdc/only.txt (renamed from examples/host/hid_to_cdc/only.txt)1
-rw-r--r--examples/dual/host_hid_to_device_cdc/src/main.c (renamed from examples/host/hid_to_cdc/src/main.c)215
-rw-r--r--examples/dual/host_hid_to_device_cdc/src/tusb_config.h (renamed from examples/host/hid_to_cdc/src/tusb_config.h)12
-rw-r--r--examples/dual/host_hid_to_device_cdc/src/usb_descriptors.c (renamed from examples/host/hid_to_cdc/src/usb_descriptors.c)1
-rw-r--r--examples/host/bare_api/CMakeLists.txt5
-rw-r--r--examples/host/cdc_msc_hid/CMakeLists.txt5
-rw-r--r--examples/host/cdc_msc_hid/src/tusb_config.h7
-rw-r--r--examples/host/hid_controller/CMakeLists.txt5
-rw-r--r--examples/rules.mk2
12 files changed, 129 insertions, 132 deletions
diff --git a/examples/device/hid_boot_interface/src/tusb_config.h b/examples/device/hid_boot_interface/src/tusb_config.h
index 1c8fa40b2..8bc85b722 100644
--- a/examples/device/hid_boot_interface/src/tusb_config.h
+++ b/examples/device/hid_boot_interface/src/tusb_config.h
@@ -39,6 +39,10 @@
#error CFG_TUSB_MCU must be defined
#endif
+// Use raspberry pio-usb for device
+// #define CFG_TUD_RPI_PIO_USB 1
+// #define BOARD_DEVICE_RHPORT_NUM 1
+
// RHPort number used for device can be defined by board.mk, default to port 0
#ifndef BOARD_DEVICE_RHPORT_NUM
#define BOARD_DEVICE_RHPORT_NUM 0
diff --git a/examples/host/hid_to_cdc/CMakeLists.txt b/examples/dual/host_hid_to_device_cdc/CMakeLists.txt
index abc4d91da..24ebfdec3 100644
--- a/examples/host/hid_to_cdc/CMakeLists.txt
+++ b/examples/dual/host_hid_to_device_cdc/CMakeLists.txt
@@ -25,4 +25,6 @@ target_include_directories(${PROJECT} PUBLIC
# Configure compilation flags and libraries for the example... see the corresponding function
# in hw/bsp/FAMILY/family.cmake for details.
-family_configure_device_example(${PROJECT}) \ No newline at end of file
+family_configure_device_example(${PROJECT})
+family_configure_host_example(${PROJECT})
+family_configure_pico_pio_usb_example(${PROJECT})
diff --git a/examples/host/hid_to_cdc/Makefile b/examples/dual/host_hid_to_device_cdc/Makefile
index 3fe9b0888..3fe9b0888 100644
--- a/examples/host/hid_to_cdc/Makefile
+++ b/examples/dual/host_hid_to_device_cdc/Makefile
diff --git a/examples/host/hid_to_cdc/only.txt b/examples/dual/host_hid_to_device_cdc/only.txt
index 78d94e3ce..6ee8e3fde 100644
--- a/examples/host/hid_to_cdc/only.txt
+++ b/examples/dual/host_hid_to_device_cdc/only.txt
@@ -1,2 +1,3 @@
board:mimxrt1060_evk
board:mimxrt1064_evk
+mcu:RP2040
diff --git a/examples/host/hid_to_cdc/src/main.c b/examples/dual/host_hid_to_device_cdc/src/main.c
index cdf5d264e..62ecb2c3f 100644
--- a/examples/host/hid_to_cdc/src/main.c
+++ b/examples/dual/host_hid_to_device_cdc/src/main.c
@@ -23,10 +23,8 @@
*
*/
-// This example runs both host and device concurrently. The USB host looks for
-// any HID device with reports that are 8 bytes long and then assumes they are
-// keyboard reports. It translates the keypresses of the reports to ASCII and
-// transmits it over CDC to the device's host.
+// This example runs both host and device concurrently. The USB host receive
+// reports from HID device and print it out over USB Device CDC interface.
#include <stdlib.h>
#include <stdio.h>
@@ -73,12 +71,14 @@ enum {
static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;
void led_blinking_task(void);
-void cdc_task(void);
/*------------- MAIN -------------*/
int main(void)
{
board_init();
+
+ printf("TinyUSB Host HID <-> Device CDC Example\r\n");
+
tusb_init();
while (1)
@@ -86,15 +86,13 @@ int main(void)
tud_task(); // tinyusb device task
tuh_task(); // tinyusb host task
led_blinking_task();
-
- cdc_task();
}
return 0;
}
//--------------------------------------------------------------------+
-// Device callbacks
+// Device CDC
//--------------------------------------------------------------------+
// Invoked when device is mounted
@@ -124,8 +122,20 @@ void tud_resume_cb(void)
blink_interval_ms = BLINK_MOUNTED;
}
+// Invoked when CDC interface received data from host
+void tud_cdc_rx_cb(uint8_t itf)
+{
+ (void) itf;
+
+ char buf[64];
+ uint32_t count = tud_cdc_read(buf, sizeof(buf));
+
+ // TODO control LED on keyboard of host stack
+ (void) count;
+}
+
//--------------------------------------------------------------------+
-// Host callbacks
+// Host HID
//--------------------------------------------------------------------+
// Invoked when device with hid interface is mounted
@@ -137,169 +147,140 @@ void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_re
{
(void)desc_report;
(void)desc_len;
+
+ // Interface protocol (hid_interface_protocol_enum_t)
+ const char* protocol_str[] = { "None", "Keyboard", "Mouse" };
+ uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
+
uint16_t vid, pid;
tuh_vid_pid_get(dev_addr, &vid, &pid);
- printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance);
- printf("VID = %04x, PID = %04x\r\n", vid, pid);
+ char tempbuf[256];
+ int count = sprintf(tempbuf, "[%04x:%04x][%u] HID Interface%u, Protocol = %s\r\n", vid, pid, dev_addr, instance, protocol_str[itf_protocol]);
- // Receive any report and treat it like a keyboard.
+ tud_cdc_write(tempbuf, count);
+ tud_cdc_write_flush();
+
+ // Receive report from boot keyboard & mouse only
// tuh_hid_report_received_cb() will be invoked when report is available
- if ( !tuh_hid_receive_report(dev_addr, instance) )
+ if (itf_protocol == HID_ITF_PROTOCOL_KEYBOARD || itf_protocol == HID_ITF_PROTOCOL_MOUSE)
{
- printf("Error: cannot request to receive report\r\n");
+ if ( !tuh_hid_receive_report(dev_addr, instance) )
+ {
+ tud_cdc_write_str("Error: cannot request report\r\n");
+ }
}
}
// Invoked when device with hid interface is un-mounted
void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance)
{
- printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance);
+ char tempbuf[256];
+ int count = sprintf(tempbuf, "[%u] HID Interface%u is unmounted\r\n", dev_addr, instance);
+ tud_cdc_write(tempbuf, count);
+ tud_cdc_write_flush();
}
-// keycodes from last report to check if key is holding or newly pressed
-uint8_t last_keycodes[6] = {0};
-
// look up new key in previous keys
-static inline bool key_in_last_report(const uint8_t key_arr[6], uint8_t keycode)
+static inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode)
{
for(uint8_t i=0; i<6; i++)
{
- if (key_arr[i] == keycode) return true;
+ if (report->keycode[i] == keycode) return true;
}
return false;
}
-// Invoked when received report from device via interrupt endpoint
-void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
-{
- if (len != 8)
- {
- char ch_num;
-
- tud_cdc_write_str("incorrect report len: ");
-
- if ( len > 10 )
- {
- ch_num = '0' + (len / 10);
- tud_cdc_write(&ch_num, 1);
- len = len % 10;
- }
-
- ch_num = '0' + len;
- tud_cdc_write(&ch_num, 1);
-
- tud_cdc_write_str("\r\n");
- tud_cdc_write_flush();
-
- // Don't request a new report for a wrong sized endpoint.
- return;
- }
- uint8_t const modifiers = report[0];
+// convert hid keycode to ascii and print via usb device CDC (ignore non-printable)
+static void process_kbd_report(uint8_t dev_addr, hid_keyboard_report_t const *report)
+{
+ (void) dev_addr;
+ static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
bool flush = false;
- for (int i = 2; i < 8; i++)
+ for(uint8_t i=0; i<6; i++)
{
- uint8_t keycode = report[i];
-
- if (keycode)
+ uint8_t keycode = report->keycode[i];
+ if ( keycode )
{
- if ( key_in_last_report(last_keycodes, keycode) )
+ if ( find_key_in_report(&prev_report, keycode) )
{
// exist in previous report means the current key is holding
- // do nothing
}else
{
// not existed in previous report means the current key is pressed
- // Only print keycodes 0 - 128.
- if (keycode < 128)
- {
- // remap the key code for Colemak layout so @tannewt can type.
- #ifdef KEYBOARD_COLEMAK
- uint8_t colemak_key_code = colemak[keycode];
- if (colemak_key_code != 0) keycode = colemak_key_code;
- #endif
- bool const is_shift = modifiers & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
- char c = keycode2ascii[keycode][is_shift ? 1 : 0];
- if (c)
- {
- if (c == '\n') tud_cdc_write("\r", 1);
- tud_cdc_write(&c, 1);
- flush = true;
- }
+ // remap the key code for Colemak layout
+ #ifdef KEYBOARD_COLEMAK
+ uint8_t colemak_key_code = colemak[keycode];
+ if (colemak_key_code != 0) keycode = colemak_key_code;
+ #endif
+
+ bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
+ uint8_t ch = keycode2ascii[keycode][is_shift ? 1 : 0];
+
+ if (ch)
+ {
+ if (ch == '\n') tud_cdc_write("\r", 1);
+ tud_cdc_write(&ch, 1);
+ flush = true;
}
}
}
+ // TODO example skips key released
}
if (flush) tud_cdc_write_flush();
- // save current report
- memcpy(last_keycodes, report+2, 6);
-
- // continue to request to receive report
- if ( !tuh_hid_receive_report(dev_addr, instance) )
- {
- printf("Error: cannot request to receive report\r\n");
- }
+ prev_report = *report;
}
-
-
-//--------------------------------------------------------------------+
-// USB CDC
-//--------------------------------------------------------------------+
-void cdc_task(void)
+// send mouse report to usb device CDC
+static void process_mouse_report(uint8_t dev_addr, hid_mouse_report_t const * report)
{
- // connected() check for DTR bit
- // Most but not all terminal client set this when making connection
- // if ( tud_cdc_connected() )
- {
- // connected and there are data available
- if ( tud_cdc_available() )
- {
- // read datas
- char buf[64];
- uint32_t count = tud_cdc_read(buf, sizeof(buf));
- (void) count;
+ //------------- button state -------------//
+ //uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;
+ char l = report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-';
+ char m = report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-';
+ char r = report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-';
- // Echo back
- // Note: Skip echo by commenting out write() and write_flush()
- // for throughput test e.g
- // $ dd if=/dev/zero of=/dev/ttyACM0 count=10000
- tud_cdc_write(buf, count);
- tud_cdc_write_flush();
- }
- }
+ char tempbuf[32];
+ int count = sprintf(tempbuf, "[%u] %c%c%c %d %d %d\r\n", dev_addr, l, m, r, report->x, report->y, report->wheel);
+
+ tud_cdc_write(tempbuf, count);
+ tud_cdc_write_flush();
}
-// Invoked when cdc when line state changed e.g connected/disconnected
-void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts)
+// Invoked when received report from device via interrupt endpoint
+void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
{
- (void) itf;
- (void) rts;
+ (void) len;
+ uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
- // TODO set some indicator
- if ( dtr )
+ switch(itf_protocol)
{
- // Terminal connected
- }else
- {
- // Terminal disconnected
+ case HID_ITF_PROTOCOL_KEYBOARD:
+ process_kbd_report(dev_addr, (hid_keyboard_report_t const*) report );
+ break;
+
+ case HID_ITF_PROTOCOL_MOUSE:
+ process_mouse_report(dev_addr, (hid_mouse_report_t const*) report );
+ break;
+
+ default: break;
}
-}
-// Invoked when CDC interface received data from host
-void tud_cdc_rx_cb(uint8_t itf)
-{
- (void) itf;
+ // continue to request to receive report
+ if ( !tuh_hid_receive_report(dev_addr, instance) )
+ {
+ tud_cdc_write_str("Error: cannot request report\r\n");
+ }
}
//--------------------------------------------------------------------+
-// BLINKING TASK
+// Blinking Task
//--------------------------------------------------------------------+
void led_blinking_task(void)
{
diff --git a/examples/host/hid_to_cdc/src/tusb_config.h b/examples/dual/host_hid_to_device_cdc/src/tusb_config.h
index 9a35ffc30..0fa4899a9 100644
--- a/examples/host/hid_to_cdc/src/tusb_config.h
+++ b/examples/dual/host_hid_to_device_cdc/src/tusb_config.h
@@ -49,6 +49,9 @@
#define BOARD_HOST_RHPORT_NUM 1
#endif
+// Use raspberry pio-usb for host
+#define CFG_TUH_RPI_PIO_USB 1
+
// RHPort max operational speed can defined by board.mk
// Default to Highspeed for MCU with internal HighSpeed PHY (can be port specific), otherwise FullSpeed
#ifndef BOARD_DEVICE_RHPORT_SPEED
@@ -124,10 +127,6 @@
//------------- CLASS -------------//
#define CFG_TUD_CDC 1
-#define CFG_TUD_MSC 0
-#define CFG_TUD_HID 0
-#define CFG_TUD_MIDI 0
-#define CFG_TUD_VENDOR 0
// CDC FIFO size of TX and RX
#define CFG_TUD_CDC_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)
@@ -144,14 +143,9 @@
#define CFG_TUH_ENUMERATION_BUFSIZE 256
#define CFG_TUH_HUB 1
-#define CFG_TUH_CDC 0
-#define CFG_TUH_MSC 0
-#define CFG_TUH_VENDOR 0
-
// max device support (excluding hub device)
#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports
-//------------- HID -------------//
#define CFG_TUH_HID 4
#define CFG_TUH_HID_EPIN_BUFSIZE 64
#define CFG_TUH_HID_EPOUT_BUFSIZE 64
diff --git a/examples/host/hid_to_cdc/src/usb_descriptors.c b/examples/dual/host_hid_to_device_cdc/src/usb_descriptors.c
index 7dd73937c..e55899f65 100644
--- a/examples/host/hid_to_cdc/src/usb_descriptors.c
+++ b/examples/dual/host_hid_to_device_cdc/src/usb_descriptors.c
@@ -81,7 +81,6 @@ enum
{
ITF_NUM_CDC = 0,
ITF_NUM_CDC_DATA,
- ITF_NUM_MSC,
ITF_NUM_TOTAL
};
diff --git a/examples/host/bare_api/CMakeLists.txt b/examples/host/bare_api/CMakeLists.txt
index bff281a8c..607ef22eb 100644
--- a/examples/host/bare_api/CMakeLists.txt
+++ b/examples/host/bare_api/CMakeLists.txt
@@ -24,4 +24,7 @@ target_include_directories(${PROJECT} PUBLIC
# Configure compilation flags and libraries for the example... see the corresponding function
# in hw/bsp/FAMILY/family.cmake for details.
-family_configure_host_example(${PROJECT}) \ No newline at end of file
+family_configure_host_example(${PROJECT})
+
+# For rp2040, un-comment to enable pico-pio-usb
+# family_configure_pico_pio_usb_example(${PROJECT})
diff --git a/examples/host/cdc_msc_hid/CMakeLists.txt b/examples/host/cdc_msc_hid/CMakeLists.txt
index 0a99bc3a9..214e9f2e7 100644
--- a/examples/host/cdc_msc_hid/CMakeLists.txt
+++ b/examples/host/cdc_msc_hid/CMakeLists.txt
@@ -26,4 +26,7 @@ target_include_directories(${PROJECT} PUBLIC
# Configure compilation flags and libraries for the example... see the corresponding function
# in hw/bsp/FAMILY/family.cmake for details.
-family_configure_host_example(${PROJECT}) \ No newline at end of file
+family_configure_host_example(${PROJECT})
+
+# For rp2040, un-comment to enable pico-pio-usb
+# family_configure_pico_pio_usb_example(${PROJECT})
diff --git a/examples/host/cdc_msc_hid/src/tusb_config.h b/examples/host/cdc_msc_hid/src/tusb_config.h
index bc6c68e5b..e9e68cf5a 100644
--- a/examples/host/cdc_msc_hid/src/tusb_config.h
+++ b/examples/host/cdc_msc_hid/src/tusb_config.h
@@ -39,8 +39,15 @@
#error CFG_TUSB_MCU must be defined
#endif
+// Use raspberry pio-usb for host
+// #define CFG_TUH_RPI_PIO_USB 1
+// #define CFG_TUH_RPI_PIO_USB 1
+
#if CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX
#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_HOST | OPT_MODE_HIGH_SPEED)
+#elif defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB
+ // rp2040: port0 is native, port 1 for PIO-USB
+ #define CFG_TUSB_RHPORT1_MODE OPT_MODE_HOST
#else
#define CFG_TUSB_RHPORT0_MODE OPT_MODE_HOST
#endif
diff --git a/examples/host/hid_controller/CMakeLists.txt b/examples/host/hid_controller/CMakeLists.txt
index aaf8bc34f..6227e0790 100644
--- a/examples/host/hid_controller/CMakeLists.txt
+++ b/examples/host/hid_controller/CMakeLists.txt
@@ -25,4 +25,7 @@ target_include_directories(${PROJECT} PUBLIC
# Configure compilation flags and libraries for the example... see the corresponding function
# in hw/bsp/FAMILY/family.cmake for details.
-family_configure_host_example(${PROJECT}) \ No newline at end of file
+family_configure_host_example(${PROJECT})
+
+# For rp2040, un-comment to enable pico-pio-usb
+# family_configure_pico_pio_usb_example(${PROJECT})
diff --git a/examples/rules.mk b/examples/rules.mk
index 97f6956fa..538dffbcf 100644
--- a/examples/rules.mk
+++ b/examples/rules.mk
@@ -199,7 +199,7 @@ flash-xfel: $(BUILD)/$(PROJECT)-sunxi.bin
PYOCD_OPTION ?=
flash-pyocd: $(BUILD)/$(PROJECT).hex
pyocd flash -t $(PYOCD_TARGET) $(PYOCD_OPTION) $<
- pyocd reset -t $(PYOCD_TARGET)
+ #pyocd reset -t $(PYOCD_TARGET)
# Flash using openocd
OPENOCD_OPTION ?=