summaryrefslogtreecommitdiff
path: root/examples/host/src
diff options
context:
space:
mode:
Diffstat (limited to 'examples/host/src')
-rw-r--r--examples/host/src/app_os_prio.h82
-rw-r--r--examples/host/src/cdc_serial_host_app.c169
-rw-r--r--examples/host/src/cdc_serial_host_app.h74
-rw-r--r--examples/host/src/keyboard_host_app.c176
-rw-r--r--examples/host/src/keyboard_host_app.h80
-rw-r--r--examples/host/src/main.c143
-rw-r--r--examples/host/src/mouse_host_app.c181
-rw-r--r--examples/host/src/mouse_host_app.h83
-rw-r--r--examples/host/src/msc_cli.c485
-rw-r--r--examples/host/src/msc_cli.h62
-rw-r--r--examples/host/src/msc_host_app.c182
-rw-r--r--examples/host/src/msc_host_app.h75
-rw-r--r--examples/host/src/rndis_host_app.c76
-rw-r--r--examples/host/src/rndis_host_app.h75
-rw-r--r--examples/host/src/tusb_config.h115
15 files changed, 2058 insertions, 0 deletions
diff --git a/examples/host/src/app_os_prio.h b/examples/host/src/app_os_prio.h
new file mode 100644
index 000000000..99be2de0c
--- /dev/null
+++ b/examples/host/src/app_os_prio.h
@@ -0,0 +1,82 @@
+/**************************************************************************/
+/*!
+ @file app_os_prio.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_APP_OS_PRIO_H_
+#define _TUSB_APP_OS_PRIO_H_
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "tusb.h"
+
+#if TUSB_CFG_OS == TUSB_OS_NONE
+ #define LOWER_PRIO(x) 0 // does not matter
+#elif TUSB_CFG_OS == TUSB_OS_FREERTOS
+ #define LOWER_PRIO(x) ((x)-1) // freeRTOS lower number --> lower priority
+#elif TUSB_CFG_OS == TUSB_OS_CMSIS_RTX
+ #define LOWER_PRIO(x) ((x)-1) // CMSIS-RTOS lower number --> lower priority
+#else
+ #error Priority is not configured for this RTOS
+#endif
+
+enum {
+ STANDARD_APP_TASK_PRIO = LOWER_PRIO(TUSB_CFG_OS_TASK_PRIO), // Application Task is lower than usb system task
+ LED_BLINKING_APP_TASK_PRIO = LOWER_PRIO(STANDARD_APP_TASK_PRIO), // Blinking task is lower than normal task
+
+ KEYBOARD_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO,
+ MOUSE_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO,
+ CDC_SERIAL_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO,
+ MSC_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO
+};
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_APP_OS_PRIO_H_ */
+
+/** @} */
diff --git a/examples/host/src/cdc_serial_host_app.c b/examples/host/src/cdc_serial_host_app.c
new file mode 100644
index 000000000..768e3a146
--- /dev/null
+++ b/examples/host/src/cdc_serial_host_app.c
@@ -0,0 +1,169 @@
+/**************************************************************************/
+/*!
+ @file cdc_serial_host_app.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "cdc_serial_host_app.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_HOST_CDC
+
+#define QUEUE_SERIAL_DEPTH 100
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+static osal_semaphore_t sem_hdl;
+
+enum { SERIAL_BUFFER_SIZE = 64 };
+TUSB_CFG_ATTR_USBRAM static uint8_t serial_in_buffer[SERIAL_BUFFER_SIZE];
+TUSB_CFG_ATTR_USBRAM static uint8_t serial_out_buffer[SERIAL_BUFFER_SIZE];
+
+static uint8_t received_bytes; // set by transfer complete callback
+
+//--------------------------------------------------------------------+
+// tinyusb callbacks
+//--------------------------------------------------------------------+
+void tuh_cdc_mounted_cb(uint8_t dev_addr)
+{ // application set-up
+ printf("\na CDC device (address %d) is mounted\n", dev_addr);
+
+ memclr_(serial_in_buffer, sizeof(serial_in_buffer));
+ memclr_(serial_out_buffer, sizeof(serial_out_buffer));
+ received_bytes = 0;
+
+ osal_semaphore_reset(sem_hdl);
+ tuh_cdc_receive(dev_addr, serial_in_buffer, SERIAL_BUFFER_SIZE, true); // schedule first transfer
+}
+
+void tuh_cdc_unmounted_cb(uint8_t dev_addr)
+{ // application tear-down
+ printf("\na CDC device (address %d) is unmounted \n", dev_addr);
+}
+
+// invoked ISR context
+void tuh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes)
+{
+ (void) dev_addr; // compiler warnings
+
+ switch ( pipe_id )
+ {
+ case CDC_PIPE_DATA_IN:
+ switch(event)
+ {
+ case TUSB_EVENT_XFER_COMPLETE:
+ received_bytes = xferred_bytes;
+ osal_semaphore_post(sem_hdl); // notify main task
+ break;
+
+ case TUSB_EVENT_XFER_ERROR:
+ received_bytes = 0; // ignore
+ tuh_cdc_receive(dev_addr, serial_in_buffer, SERIAL_BUFFER_SIZE, true); // waiting for next data
+ break;
+
+ case TUSB_EVENT_XFER_STALLED:
+ default :
+ break;
+ }
+ break;
+
+ case CDC_PIPE_DATA_OUT:
+ case CDC_PIPE_NOTIFICATION:
+ default:
+ break;
+ }
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION
+//--------------------------------------------------------------------+
+void cdc_serial_host_app_init(void)
+{
+ sem_hdl = osal_semaphore_create(1, 0);
+ ASSERT_PTR( sem_hdl, VOID_RETURN);
+
+ VERIFY( osal_task_create(cdc_serial_host_app_task, "cdc", 128, NULL, CDC_SERIAL_APP_TASK_PRIO), );
+}
+
+//------------- main task -------------//
+void cdc_serial_host_app_task( void* param )
+{
+ (void) param;
+
+ OSAL_TASK_BEGIN
+
+ //------------- send characters got from uart terminal to the first CDC device -------------//
+ for(uint8_t dev_addr=1; dev_addr <= TUSB_CFG_HOST_DEVICE_MAX; dev_addr++)
+ {
+ if ( tuh_cdc_serial_is_mounted(dev_addr) )
+ {
+ int ch_tx = getchar();
+ if ( ch_tx > 0 )
+ { // USB is much faster than serial, here we assume usb is always complete. There could be some characters missing though
+ serial_out_buffer[0] = (uint8_t) ch_tx;
+
+ if ( !tuh_cdc_is_busy(dev_addr, CDC_PIPE_DATA_OUT) )
+ {
+ tuh_cdc_send(dev_addr, serial_out_buffer, 1, false); // no need for callback on serial out pipe
+ }
+ }
+ break; // demo app only communicate with the first CDC-capable device
+ }
+ }
+
+ //------------- print out received characters -------------//
+ tusb_error_t error;
+ osal_semaphore_wait(sem_hdl, 100, &error); // waiting for incoming data
+
+ if ( TUSB_ERROR_NONE == error)
+ {
+ for(uint8_t i=0; i<received_bytes; i++) putchar(serial_in_buffer[i]);
+
+ for(uint8_t dev_addr=1; dev_addr <= TUSB_CFG_HOST_DEVICE_MAX; dev_addr++)
+ {
+ if ( tuh_cdc_serial_is_mounted(dev_addr) )
+ {
+ tuh_cdc_receive(dev_addr, serial_in_buffer, SERIAL_BUFFER_SIZE, true);
+
+ break; // demo app only communicate with the first CDC-capable device
+ }
+ }
+ }
+
+ OSAL_TASK_END
+}
+
+#endif
diff --git a/examples/host/src/cdc_serial_host_app.h b/examples/host/src/cdc_serial_host_app.h
new file mode 100644
index 000000000..4efc6cb8c
--- /dev/null
+++ b/examples/host/src/cdc_serial_host_app.h
@@ -0,0 +1,74 @@
+/**************************************************************************/
+/*!
+ @file cdc_serial_host_app.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_CDC_SERIAL_HOST_APP_H_
+#define _TUSB_CDC_SERIAL_HOST_APP_H_
+
+#include "board.h"
+#include "tusb.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if TUSB_CFG_HOST_CDC
+
+void cdc_serial_host_app_init(void);
+void cdc_serial_host_app_task(void* param);
+
+#else
+
+#define cdc_serial_host_app_init()
+#define cdc_serial_host_app_task(x)
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_CDC_SERIAL_HOST_APP_H_ */
+
+/** @} */
diff --git a/examples/host/src/keyboard_host_app.c b/examples/host/src/keyboard_host_app.c
new file mode 100644
index 000000000..f0d2fcd73
--- /dev/null
+++ b/examples/host/src/keyboard_host_app.c
@@ -0,0 +1,176 @@
+/**************************************************************************/
+/*!
+ @file keyboard_host_app.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "keyboard_host_app.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_HOST_HID_KEYBOARD
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+#define QUEUE_KEYBOARD_REPORT_DEPTH 4
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+static osal_queue_t queue_kbd_hdl;
+TUSB_CFG_ATTR_USBRAM static hid_keyboard_report_t usb_keyboard_report;
+
+static inline uint8_t keycode_to_ascii(uint8_t modifier, uint8_t keycode) ATTR_CONST ATTR_ALWAYS_INLINE;
+static inline void process_kbd_report(hid_keyboard_report_t const * report);
+
+//--------------------------------------------------------------------+
+// tinyusb callbacks
+//--------------------------------------------------------------------+
+void tuh_hid_keyboard_mounted_cb(uint8_t dev_addr)
+{
+ // application set-up
+ printf("\na Keyboard device (address %d) is mounted\n", dev_addr);
+
+ osal_queue_flush(queue_kbd_hdl);
+ tuh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // first report
+}
+
+void tuh_hid_keyboard_unmounted_cb(uint8_t dev_addr)
+{
+ // application tear-down
+ printf("\na Keyboard device (address %d) is unmounted\n", dev_addr);
+}
+
+// invoked ISR context
+void tuh_hid_keyboard_isr(uint8_t dev_addr, tusb_event_t event)
+{
+ switch(event)
+ {
+ case TUSB_EVENT_XFER_COMPLETE:
+ osal_queue_send(queue_kbd_hdl, &usb_keyboard_report);
+ tuh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report);
+ break;
+
+ case TUSB_EVENT_XFER_ERROR:
+ tuh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // ignore & continue
+ break;
+
+ default :
+ break;
+ }
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION
+//--------------------------------------------------------------------+
+void keyboard_host_app_init(void)
+{
+ memclr_(&usb_keyboard_report, sizeof(hid_keyboard_report_t));
+
+ queue_kbd_hdl = osal_queue_create( QUEUE_KEYBOARD_REPORT_DEPTH, sizeof(hid_keyboard_report_t) );
+ ASSERT_PTR( queue_kbd_hdl, VOID_RETURN );
+
+ VERIFY( osal_task_create(keyboard_host_app_task, "kbd", 128, NULL, KEYBOARD_APP_TASK_PRIO), );
+}
+
+//------------- main task -------------//
+void keyboard_host_app_task(void* param)
+{
+ (void) param;
+
+ OSAL_TASK_BEGIN
+
+ hid_keyboard_report_t kbd_report;
+ tusb_error_t error;
+
+ osal_queue_receive(queue_kbd_hdl, &kbd_report, OSAL_TIMEOUT_WAIT_FOREVER, &error);
+ (void) error; // suppress compiler warning
+
+ process_kbd_report(&kbd_report);
+
+ OSAL_TASK_END
+}
+
+//--------------------------------------------------------------------+
+// HELPER
+//--------------------------------------------------------------------+
+// look up new key in previous keys
+static inline bool find_key_in_report(hid_keyboard_report_t const *p_report, uint8_t keycode)
+{
+ for(uint8_t i=0; i<6; i++)
+ {
+ if (p_report->keycode[i] == keycode) return true;
+ }
+
+ return false;
+}
+
+static inline void process_kbd_report(hid_keyboard_report_t const *p_new_report)
+{
+ static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
+
+ //------------- example code ignore control (non-printable) key affects -------------//
+ for(uint8_t i=0; i<6; i++)
+ {
+ if ( p_new_report->keycode[i] )
+ {
+ if ( find_key_in_report(&prev_report, p_new_report->keycode[i]) )
+ {
+ // exist in previous report means the current key is holding
+ }else
+ {
+ // not existed in previous report means the current key is pressed
+ uint8_t ch = keycode_to_ascii(p_new_report->modifier, p_new_report->keycode[i]);
+ putchar(ch);
+ if ( ch == '\r' ) putchar('\n'); // added new line for enter key
+ }
+ }
+ // TODO example skips key released
+ }
+
+ prev_report = *p_new_report;
+}
+
+static inline uint8_t keycode_to_ascii(uint8_t modifier, uint8_t keycode)
+{
+ // TODO max of keycode_ascii_tbl
+ return keycode > 128 ? 0 :
+ hid_keycode_to_ascii_tbl [modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT) ? 1 : 0] [keycode];
+}
+
+#endif
diff --git a/examples/host/src/keyboard_host_app.h b/examples/host/src/keyboard_host_app.h
new file mode 100644
index 000000000..2b99373a3
--- /dev/null
+++ b/examples/host/src/keyboard_host_app.h
@@ -0,0 +1,80 @@
+/**************************************************************************/
+/*!
+ @file keyboard_host_app.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \file
+ * \brief TBD
+ *
+ * \note TBD
+ */
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_KEYBOARD_HOST_APP_H_
+#define _TUSB_KEYBOARD_HOST_APP_H_
+
+#include "board.h"
+#include "tusb.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if TUSB_CFG_HOST_HID_KEYBOARD
+
+void keyboard_host_app_init(void);
+void keyboard_host_app_task(void* param);
+
+#else
+
+#define keyboard_host_app_init()
+#define keyboard_host_app_task(x)
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_KEYBOARD_HOST_APP_H_ */
+
+/** @} */
diff --git a/examples/host/src/main.c b/examples/host/src/main.c
new file mode 100644
index 000000000..897e538b3
--- /dev/null
+++ b/examples/host/src/main.c
@@ -0,0 +1,143 @@
+/**************************************************************************/
+/*!
+ @file main.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "board.h"
+#include "tusb.h"
+
+#include "mouse_host_app.h"
+#include "keyboard_host_app.h"
+#include "msc_host_app.h"
+#include "cdc_serial_host_app.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+void print_greeting(void);
+
+//--------------------------------------------------------------------+
+// IMPLEMENTATION
+//--------------------------------------------------------------------+
+
+#if TUSB_CFG_OS == TUSB_OS_NONE
+// like a real RTOS, this function is a main loop invoking each task in application and never return
+void os_none_start_scheduler(void)
+{
+ while (1)
+ {
+ tusb_task_runner();
+ led_blinking_task(NULL);
+
+ keyboard_host_app_task(NULL);
+ mouse_host_app_task(NULL);
+ msc_host_app_task(NULL);
+ cdc_serial_host_app_task(NULL);
+ }
+}
+#endif
+
+int main(void)
+{
+#if TUSB_CFG_OS == TUSB_OS_CMSIS_RTX
+ osKernelInitialize(); // CMSIS RTX requires kernel init before any other OS functions
+#endif
+
+ board_init();
+ print_greeting();
+
+ tusb_init();
+
+ //------------- application task init -------------//
+ led_blinking_init();
+
+ keyboard_host_app_init();
+ mouse_host_app_init();
+ msc_host_app_init();
+ cdc_serial_host_app_init();
+
+ //------------- start OS scheduler (never return) -------------//
+#if TUSB_CFG_OS == TUSB_OS_FREERTOS
+ vTaskStartScheduler();
+#elif TUSB_CFG_OS == TUSB_OS_NONE
+ os_none_start_scheduler();
+#elif TUSB_CFG_OS == TUSB_OS_CMSIS_RTX
+ osKernelStart();
+#else
+ #error need to start RTOS schduler
+#endif
+
+ return 0;
+}
+
+//--------------------------------------------------------------------+
+// HELPER FUNCTION
+//--------------------------------------------------------------------+
+void print_greeting(void)
+{
+ char const * const rtos_name[] =
+ {
+ [TUSB_OS_NONE] = "None",
+ [TUSB_OS_FREERTOS] = "FreeRTOS",
+ };
+
+ puts("\n\
+--------------------------------------------------------------------\n\
+- Host Demo (a tinyusb example)\n\
+- if you find any bugs or get any questions, feel free to file an\n\
+- issue at https://github.com/hathach/tinyusb\n\
+--------------------------------------------------------------------\n"
+ );
+
+ puts("This HOST demo is configured to support:");
+ printf(" - RTOS = %s\n", rtos_name[TUSB_CFG_OS]);
+ if (TUSB_CFG_HOST_HUB ) puts(" - Hub (1 level only)");
+ if (TUSB_CFG_HOST_HID_MOUSE ) puts(" - HID Mouse");
+ if (TUSB_CFG_HOST_HID_KEYBOARD ) puts(" - HID Keyboard");
+ if (TUSB_CFG_HOST_MSC ) puts(" - Mass Storage");
+ if (TUSB_CFG_HOST_CDC ) puts(" - Communication Device Class");
+}
diff --git a/examples/host/src/mouse_host_app.c b/examples/host/src/mouse_host_app.c
new file mode 100644
index 000000000..f392e0ace
--- /dev/null
+++ b/examples/host/src/mouse_host_app.c
@@ -0,0 +1,181 @@
+/**************************************************************************/
+/*!
+ @file mouse_host_app.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "mouse_host_app.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_HOST_HID_MOUSE
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+#define QUEUE_MOUSE_REPORT_DEPTH 4
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+static osal_queue_t queue_mouse_hdl;
+TUSB_CFG_ATTR_USBRAM static hid_mouse_report_t usb_mouse_report;
+
+static inline void process_mouse_report(hid_mouse_report_t const * p_report);
+
+//--------------------------------------------------------------------+
+// tinyusb callbacks
+//--------------------------------------------------------------------+
+void tuh_hid_mouse_mounted_cb(uint8_t dev_addr)
+{
+ // application set-up
+ printf("\na Mouse device (address %d) is mounted\n", dev_addr);
+
+ osal_queue_flush(queue_mouse_hdl);
+ (void) tuh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // first report
+}
+
+void tuh_hid_mouse_unmounted_cb(uint8_t dev_addr)
+{
+ // application tear-down
+ printf("\na Mouse device (address %d) is unmounted\n", dev_addr);
+}
+
+// invoked ISR context
+void tuh_hid_mouse_isr(uint8_t dev_addr, tusb_event_t event)
+{
+ switch(event)
+ {
+ case TUSB_EVENT_XFER_COMPLETE:
+ osal_queue_send(queue_mouse_hdl, &usb_mouse_report);
+ (void) tuh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report);
+ break;
+
+ case TUSB_EVENT_XFER_ERROR:
+ (void) tuh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // ignore & continue
+ break;
+
+ default :
+ break;
+ }
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION CODE
+// NOTICE: MOUSE REPORT IS NOT CORRECT UNTIL A DECENT HID PARSER IS
+// IMPLEMENTED, MEANWHILE IT CAN MISS DISPLAY BUTTONS OR X,Y etc
+//--------------------------------------------------------------------+
+void mouse_host_app_init(void)
+{
+ memclr_(&usb_mouse_report, sizeof(hid_mouse_report_t));
+
+ queue_mouse_hdl = osal_queue_create( QUEUE_MOUSE_REPORT_DEPTH, sizeof(hid_mouse_report_t) );
+ ASSERT_PTR( queue_mouse_hdl, VOID_RETURN);
+
+ VERIFY( osal_task_create(mouse_host_app_task, "mouse", 128, NULL, MOUSE_APP_TASK_PRIO), );
+}
+
+//------------- main task -------------//
+void mouse_host_app_task(void* param)
+{
+ (void) param;
+
+ OSAL_TASK_BEGIN
+
+ tusb_error_t error;
+ hid_mouse_report_t mouse_report;
+
+ osal_queue_receive(queue_mouse_hdl, &mouse_report, OSAL_TIMEOUT_WAIT_FOREVER, &error);
+ (void) error; // suppress compiler's warnings
+
+ process_mouse_report(&mouse_report);
+
+ OSAL_TASK_END
+}
+
+//--------------------------------------------------------------------+
+// HELPER
+//--------------------------------------------------------------------+
+void cursor_movement(int8_t x, int8_t y, int8_t wheel)
+{
+ //------------- X -------------//
+ if ( x < 0)
+ {
+ printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left
+ }else if ( x > 0)
+ {
+ printf(ANSI_CURSOR_FORWARD(%d), x); // move right
+ }else { }
+
+ //------------- Y -------------//
+ if ( y < 0)
+ {
+ printf(ANSI_CURSOR_UP(%d), (-y)); // move up
+ }else if ( y > 0)
+ {
+ printf(ANSI_CURSOR_DOWN(%d), y); // move down
+ }else { }
+
+ //------------- wheel -------------//
+ if (wheel < 0)
+ {
+ printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up
+ }else if (wheel > 0)
+ {
+ printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down
+ }else { }
+}
+
+static inline void process_mouse_report(hid_mouse_report_t const * p_report)
+{
+ static hid_mouse_report_t prev_report = { 0, 0, 0, 0 };
+
+ //------------- button state -------------//
+ uint8_t button_changed_mask = p_report->buttons ^ prev_report.buttons;
+ if ( button_changed_mask & p_report->buttons)
+ {
+ printf(" %c%c%c ",
+ p_report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',
+ p_report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',
+ p_report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');
+ }
+
+ //------------- cursor movement -------------//
+ cursor_movement(p_report->x, p_report->y, p_report->wheel);
+}
+
+#endif
diff --git a/examples/host/src/mouse_host_app.h b/examples/host/src/mouse_host_app.h
new file mode 100644
index 000000000..967444454
--- /dev/null
+++ b/examples/host/src/mouse_host_app.h
@@ -0,0 +1,83 @@
+/**************************************************************************/
+/*!
+ @file mouse_host_app.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \file
+ * \brief TBD
+ *
+ * \note TBD
+ */
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_MOUSE_HOST_APP_H_
+#define _TUSB_MOUSE_HOST_APP_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "board.h"
+#include "tusb.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if TUSB_CFG_HOST_HID_MOUSE
+
+void mouse_host_app_init(void);
+void mouse_host_app_task(void* param);
+
+#else
+
+#define mouse_host_app_init()
+#define mouse_host_app_task(x)
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_MOUSE_HOST_APP_H_ */
+
+/** @} */
diff --git a/examples/host/src/msc_cli.c b/examples/host/src/msc_cli.c
new file mode 100644
index 000000000..e4cb2cb28
--- /dev/null
+++ b/examples/host/src/msc_cli.c
@@ -0,0 +1,485 @@
+/**************************************************************************/
+/*!
+ @file msc_cli.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**************************************************************************/
+
+#include "msc_cli.h"
+#include "ctype.h"
+
+#if TUSB_CFG_HOST_MSC
+
+#include "ff.h"
+#include "diskio.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+#define CLI_MAX_BUFFER 256
+#define CLI_FILE_READ_BUFFER (4*1024)
+
+enum {
+ ASCII_BACKSPACE = 8,
+};
+
+typedef enum
+{
+ CLI_ERROR_NONE = 0,
+ CLI_ERROR_INVALID_PARA,
+ CLI_ERROR_INVALID_PATH,
+ CLI_ERROR_FILE_EXISTED,
+ CLI_ERROR_FAILED
+}cli_error_t;
+
+static char const * const cli_error_message[] =
+{
+ [CLI_ERROR_NONE ] = 0,
+ [CLI_ERROR_INVALID_PARA ] = "Invalid parameter(s)",
+ [CLI_ERROR_INVALID_PATH ] = "No such file or directory",
+ [CLI_ERROR_FILE_EXISTED ] = "file or directory already exists",
+ [CLI_ERROR_FAILED ] = "failed to execute"
+};
+
+//--------------------------------------------------------------------+
+// CLI Database definition
+//--------------------------------------------------------------------+
+
+// command, function, description
+#define CLI_COMMAND_TABLE(ENTRY) \
+ ENTRY(unknown , cli_cmd_unknown , NULL ) \
+ ENTRY(help , cli_cmd_help , NULL ) \
+ ENTRY(cls , cli_cmd_clear , "Clear the screen.\n cls\n" ) \
+ ENTRY(ls , cli_cmd_list , "List information of the FILEs.\n ls\n" ) \
+ ENTRY(cd , cli_cmd_changedir, "change the current directory.\n cd a_folder\n" ) \
+ ENTRY(cat , cli_cmd_cat , "display contents of a file.\n cat a_file.txt\n" ) \
+ ENTRY(cp , cli_cmd_copy , "Copies one or more files to another location.\n cp a_file.txt dir1/another_file.txt\n cp a_file.txt dir1\n" ) \
+ ENTRY(mkdir , cli_cmd_mkdir , "Create a DIRECTORY, if it does not already exist.\n mkdir <new folder>\n" ) \
+ ENTRY(mv , cli_cmd_move , "Rename or move a DIRECTORY or a FILE.\n mv old_name.txt new_name.txt\n mv old_name.txt dir1/new_name.txt\n" ) \
+ ENTRY(rm , cli_cmd_remove , "Remove (delete) an empty DIRECTORY or FILE.\n rm deleted_name.txt\n rm empty_dir\n" ) \
+
+//--------------------------------------------------------------------+
+// Expands the function to have the standard function signature
+//--------------------------------------------------------------------+
+#define CLI_PROTOTYPE_EXPAND(command, function, description) \
+ cli_error_t function(char * p_para);
+
+CLI_COMMAND_TABLE(CLI_PROTOTYPE_EXPAND)
+
+//--------------------------------------------------------------------+
+// Expand to enum value
+//--------------------------------------------------------------------+
+#define CLI_ENUM_EXPAND(command, function, description) CLI_CMDTYPE_##command,
+typedef enum
+{
+ CLI_COMMAND_TABLE(CLI_ENUM_EXPAND)
+ CLI_CMDTYPE_COUNT
+}cli_cmdtype_t;
+
+//--------------------------------------------------------------------+
+// Expand to string table
+//--------------------------------------------------------------------+
+#define CLI_STRING_EXPAND(command, function, description) #command,
+char const* const cli_string_tbl[] =
+{
+ CLI_COMMAND_TABLE(CLI_STRING_EXPAND)
+};
+
+//--------------------------------------------------------------------+
+// Expand to Description table
+//--------------------------------------------------------------------+
+#define CLI_DESCRIPTION_EXPAND(command, function, description) description,
+char const* const cli_description_tbl[] =
+{
+ CLI_COMMAND_TABLE(CLI_DESCRIPTION_EXPAND)
+};
+
+
+//--------------------------------------------------------------------+
+// Expand to Command Lookup Table
+//--------------------------------------------------------------------+
+#define CMD_LOOKUP_EXPAND(command, function, description)\
+ [CLI_CMDTYPE_##command] = function,\
+
+typedef cli_error_t (* const cli_cmdfunc_t)(char *);
+static cli_cmdfunc_t cli_command_tbl[] =
+{
+ CLI_COMMAND_TABLE(CMD_LOOKUP_EXPAND)
+};
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+TUSB_CFG_ATTR_USBRAM uint8_t fileread_buffer[CLI_FILE_READ_BUFFER];
+static char cli_buffer[CLI_MAX_BUFFER];
+static char volume_label[20];
+
+static inline void drive_number2letter(char * p_path) ATTR_ALWAYS_INLINE;
+static inline void drive_number2letter(char * p_path)
+{
+ if (p_path[1] == ':')
+ {
+ p_path[0] = 'E' + p_path[0] - '0' ;
+ }
+}
+
+static inline void drive_letter2number(char * p_path) ATTR_ALWAYS_INLINE;
+static inline void drive_letter2number(char * p_path)
+{
+ if (p_path[1] == ':')
+ {
+ p_path[0] = p_path[0] - 'E' + '0';
+ }
+}
+
+
+//--------------------------------------------------------------------+
+// IMPLEMENTATION
+//--------------------------------------------------------------------+
+// NOTES: prompt re-use cli_buffer --> should not be called when cli_buffer has contents
+void cli_command_prompt(void)
+{
+ f_getcwd(cli_buffer, CLI_MAX_BUFFER);
+ drive_number2letter(cli_buffer);
+ printf("\n%s %s\n$ ",
+ (volume_label[0] !=0) ? volume_label : "No Label",
+ cli_buffer);
+
+ memclr_(cli_buffer, CLI_MAX_BUFFER);
+}
+
+void cli_init(void)
+{
+ memclr_(cli_buffer, CLI_MAX_BUFFER);
+ f_getlabel(NULL, volume_label, NULL);
+ cli_command_prompt();
+}
+
+void cli_poll(char ch)
+{
+ if ( isprint(ch) )
+ { // accumulate & echo
+ if (strlen(cli_buffer) < CLI_MAX_BUFFER)
+ {
+ cli_buffer[ strlen(cli_buffer) ] = ch;
+ putchar(ch);
+ }else
+ {
+ puts("cli buffer overflows");
+ memclr_(cli_buffer, CLI_MAX_BUFFER);
+ }
+ }
+ else if ( ch == ASCII_BACKSPACE && strlen(cli_buffer))
+ {
+ printf(ANSI_CURSOR_BACKWARD(1) ANSI_ERASE_LINE(0) ); // move cursor back & clear to the end of line
+ cli_buffer[ strlen(cli_buffer)-1 ] = 0;
+ }
+ else if ( ch == '\r')
+ { // execute command
+ //------------- Separate Command & Parameter -------------//
+ putchar('\n');
+ char* p_space = strchr(cli_buffer, ' ');
+ uint32_t command_len = (p_space == NULL) ? strlen(cli_buffer) : (uint32_t) (p_space - cli_buffer);
+ char* p_para = (p_space == NULL) ? (cli_buffer+command_len) : (p_space+1); // point to NULL-character or after space
+
+ //------------- Find entered command in lookup table & execute it -------------//
+ uint8_t cmd_id;
+ for(cmd_id = CLI_CMDTYPE_COUNT - 1; cmd_id > CLI_CMDTYPE_unknown; cmd_id--)
+ {
+ if( 0 == strncmp(cli_buffer, cli_string_tbl[cmd_id], command_len) ) break;
+ }
+
+ cli_error_t error = cli_command_tbl[cmd_id]( p_para ); // command execution, (unknown command if cannot find)
+
+ if (CLI_ERROR_NONE != error) puts(cli_error_message[error]); // error message output if any
+ cli_command_prompt(); // print out current path
+ }
+ else if (ch=='\t') // \t may be used for auto-complete later
+ {
+
+ }
+}
+
+//--------------------------------------------------------------------+
+// UNKNOWN Command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_unknown(char * p_para)
+{
+ (void) p_para;
+ puts("unknown command, please type \"help\" for list of supported commands");
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// HELP command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_help(char * p_para)
+{
+ (void) p_para;
+
+ puts("current supported commands are:");
+ for(uint8_t cmd_id = CLI_CMDTYPE_help+1; cmd_id < CLI_CMDTYPE_COUNT; cmd_id++)
+ {
+ printf("%s\t%s\n", cli_string_tbl[cmd_id], cli_description_tbl[cmd_id]);
+ }
+
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// Clear Screen Command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_clear(char* p_para)
+{
+ (void) p_para;
+ printf(ANSI_ERASE_SCREEN(2) ANSI_CURSOR_POSITION(1,1) );
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// LS Command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_list(char * p_para)
+{
+ if ( strlen(p_para) == 0 ) // list current directory
+ {
+ DIR target_dir;
+ if ( FR_OK != f_opendir(&target_dir, ".") ) return CLI_ERROR_FAILED;
+
+ TCHAR long_filename[_MAX_LFN];
+ FILINFO dir_entry =
+ {
+ .lfname = long_filename,
+ .lfsize = _MAX_LFN
+ };
+ while( (f_readdir(&target_dir, &dir_entry) == FR_OK) && dir_entry.fname[0] != 0)
+ {
+ if ( dir_entry.fname[0] != '.' ) // ignore . and .. entry
+ {
+ TCHAR const * const p_name = (dir_entry.lfname[0] != 0) ? dir_entry.lfname : dir_entry.fname;
+ if ( dir_entry.fattrib & AM_DIR ) // directory
+ {
+ printf("/%s", p_name);
+ }else
+ {
+ printf("%-40s%d KB", p_name, dir_entry.fsize / 1000);
+ }
+ putchar('\n');
+ }
+ }
+
+// (void) f_closedir(&target_dir);
+ }
+ else
+ {
+ puts("ls only supports list current directory only, try to cd to that folder first");
+ return CLI_ERROR_INVALID_PARA;
+ }
+
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// CD Command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_changedir(char * p_para)
+{
+ if ( strlen(p_para) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ drive_letter2number(p_para);
+
+ if ( FR_OK != f_chdir(p_para) )
+ {
+ return CLI_ERROR_INVALID_PATH;
+ }
+
+ if ( p_para[1] == ':')
+ { // path has drive letter --> change drive, update volume label
+ f_chdrive(p_para[0] - '0');
+ f_getlabel(NULL, volume_label, NULL);
+ }
+
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// CAT Command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_cat(char *p_para)
+{
+ if ( strlen(p_para) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ FIL file;
+
+ switch( f_open(&file, p_para, FA_READ) )
+ {
+ case FR_OK:
+ {
+ uint32_t bytes_read = 0;
+
+ if ( (FR_OK == f_read(&file, fileread_buffer, CLI_FILE_READ_BUFFER, &bytes_read)) && (bytes_read > 0) )
+ {
+ if ( file.fsize < 0x80000 ) // ~ 500KB
+ {
+ putchar('\n');
+ do {
+ for(uint32_t i=0; i<bytes_read; i++) putchar( fileread_buffer[i] );
+ }while( (FR_OK == f_read(&file, fileread_buffer, CLI_FILE_READ_BUFFER, &bytes_read)) && (bytes_read > 0) );
+ }else
+ { // not display file contents if first character is not printable (high chance of binary file)
+ printf("%s 's contents is too large\n", p_para);
+ }
+ }
+ f_close(&file);
+ }
+ break;
+
+ case FR_INVALID_NAME:
+ return CLI_ERROR_INVALID_PATH;
+
+ default :
+ return CLI_ERROR_FAILED;
+ }
+
+ return CLI_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// Make Directory command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_mkdir(char *p_para)
+{
+ if ( strlen(p_para) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ return (f_mkdir(p_para) == FR_OK) ? CLI_ERROR_NONE : CLI_ERROR_FAILED;
+}
+
+//--------------------------------------------------------------------+
+// COPY command
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_copy(char *p_para)
+{
+ char* p_space = strchr(p_para, ' ');
+ if ( p_space == NULL ) return CLI_ERROR_INVALID_PARA;
+ *p_space = 0; // replace space by NULL-character
+
+ char* p_dest = p_space+1;
+ if ( strlen(p_dest) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ drive_letter2number(p_para);
+ drive_letter2number(p_dest);
+
+ //------------- Check Existence of source file -------------//
+ FIL src_file;
+ if ( FR_OK != f_open(&src_file , p_para, FA_READ) ) return CLI_ERROR_INVALID_PATH;
+
+ //------------- Check if dest path is a folder or a non-existing file (overwritten is not allowed) -------------//
+ FILINFO dest_entry;
+ if ( (f_stat(p_dest, &dest_entry) == FR_OK) && (dest_entry.fattrib & AM_DIR) )
+ { // the destination is an existed folder --> auto append dest filename to be the folder
+ strcat(p_dest, "/");
+ strcat(p_dest, p_para);
+ }
+
+ //------------- Open dest file and start the copy -------------//
+ cli_error_t error = CLI_ERROR_NONE;
+ FIL dest_file;
+
+ switch ( f_open(&dest_file, p_dest, FA_WRITE | FA_CREATE_NEW) )
+ {
+ case FR_EXIST:
+ error = CLI_ERROR_FILE_EXISTED;
+ break;
+
+ case FR_OK:
+ while(1) // copying
+ {
+ uint32_t bytes_read = 0;
+ uint32_t bytes_write = 0;
+ FRESULT res;
+
+ res = f_read(&src_file, fileread_buffer, CLI_FILE_READ_BUFFER, &bytes_read); /* Read a chunk of src file */
+ if ( (res != FR_OK) || (bytes_read == 0) ) break; /* error or eof */
+
+ res = f_write(&dest_file, fileread_buffer, bytes_read, &bytes_write); /* Write it to the dst file */
+ if ( (res != FR_OK) || (bytes_write < bytes_read) ) break; /* error or disk full */
+ }
+
+ f_close(&dest_file);
+ break;
+
+ default:
+ error = CLI_ERROR_FAILED;
+ break;
+ }
+
+ f_close(&src_file);
+
+ return error;
+}
+
+//--------------------------------------------------------------------+
+// MOVE/RENAME
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_move(char *p_para)
+{
+ char* p_space = strchr(p_para, ' ');
+ if ( p_space == NULL ) return CLI_ERROR_INVALID_PARA;
+ *p_space = 0; // replace space by NULL-character
+
+ char* p_dest = p_space+1;
+ if ( strlen(p_dest) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ return (f_rename(p_para, p_dest) == FR_OK ) ? CLI_ERROR_NONE : CLI_ERROR_FAILED;
+}
+
+//--------------------------------------------------------------------+
+// REMOVE
+//--------------------------------------------------------------------+
+cli_error_t cli_cmd_remove(char *p_para)
+{
+ if ( strlen(p_para) == 0 ) return CLI_ERROR_INVALID_PARA;
+
+ switch( f_unlink(p_para) )
+ {
+ case FR_OK: return CLI_ERROR_NONE;
+
+ case FR_DENIED:
+ printf("cannot remove readonly file/foler or non-empty folder\n");
+ break;
+
+ default: break;
+ }
+
+ return CLI_ERROR_FAILED;
+}
+#endif
diff --git a/examples/host/src/msc_cli.h b/examples/host/src/msc_cli.h
new file mode 100644
index 000000000..052ad05ee
--- /dev/null
+++ b/examples/host/src/msc_cli.h
@@ -0,0 +1,62 @@
+/**************************************************************************/
+/*!
+ @file msc_cli.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/**************************************************************************/
+#ifndef _TUSB_MSC_CLI_H_
+#define _TUSB_MSC_CLI_H_
+
+#include "board.h"
+#include "tusb.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+//--------------------------------------------------------------------+
+// PUBLIC API
+//--------------------------------------------------------------------+
+void cli_init(void);
+void cli_poll(char ch);
+
+//--------------------------------------------------------------------+
+// Callback API
+//--------------------------------------------------------------------+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _TUSB_CLI_H_
diff --git a/examples/host/src/msc_host_app.c b/examples/host/src/msc_host_app.c
new file mode 100644
index 000000000..6faac68c3
--- /dev/null
+++ b/examples/host/src/msc_host_app.c
@@ -0,0 +1,182 @@
+/**************************************************************************/
+/*!
+ @file msc_host_app.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "msc_host_app.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_HOST_MSC
+
+#include "msc_cli.h"
+#include "ff.h"
+#include "diskio.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+TUSB_CFG_ATTR_USBRAM static FATFS fatfs[TUSB_CFG_HOST_DEVICE_MAX];
+
+//--------------------------------------------------------------------+
+// tinyusb callbacks
+//--------------------------------------------------------------------+
+void tuh_msc_mounted_cb(uint8_t dev_addr)
+{
+ puts("\na MassStorage device is mounted");
+
+ //------------- Disk Information -------------//
+ // SCSI VendorID[8] & ProductID[16] from Inquiry Command
+ uint8_t const* p_vendor = tuh_msc_get_vendor_name(dev_addr);
+ uint8_t const* p_product = tuh_msc_get_product_name(dev_addr);
+
+ for(uint8_t i=0; i<8; i++) putchar(p_vendor[i]);
+
+ putchar(' ');
+ for(uint8_t i=0; i<16; i++) putchar(p_product[i]);
+ putchar('\n');
+
+ uint32_t last_lba, block_size;
+ tuh_msc_get_capacity(dev_addr, &last_lba, &block_size);
+ printf("Disk Size: %d MB\n", (last_lba+1)/ ((1024*1024)/block_size) );
+ printf("LBA 0-0x%X Block Size: %d\n", last_lba, block_size);
+
+ //------------- file system (only 1 LUN support) -------------//
+ uint8_t phy_disk = dev_addr-1;
+ disk_initialize(phy_disk);
+
+ if ( disk_is_ready(phy_disk) )
+ {
+ if ( f_mount(phy_disk, &fatfs[phy_disk]) != FR_OK )
+ {
+ puts("mount failed");
+ return;
+ }
+
+ puts("---------------------------------------------------------------------");
+ puts("- MASSSTORAGE CLASS CLI IS A IMMATURE CODE. DISK-WRITING COMMANDS");
+ puts("- SUCH AS cp(COPY), mkdir(MAKE DIRECTORY) ARE POTENTIAL TO DAMAGE");
+ puts("- YOUR USB THUMBDRIVE. USING THOSE COMMANDS ARE AT YOUR OWN RISK.");
+ puts("- THE AUTHOR HAS NO RESPONSIBILITY WITH YOUR DEVICE NOR ITS DATA");
+ puts("---------------------------------------------------------------------");
+
+ f_chdrive(phy_disk); // change to newly mounted drive
+ f_chdir("/"); // root as current dir
+
+ cli_init();
+ }
+}
+
+void tuh_msc_unmounted_cb(uint8_t dev_addr)
+{
+ puts("\na MassStorage device is unmounted");
+
+ uint8_t phy_disk = dev_addr-1;
+
+ f_mount(phy_disk, NULL); // unmount disk
+ disk_deinitialize(phy_disk);
+
+ if ( phy_disk == f_get_current_drive() )
+ { // active drive is unplugged --> change to other drive
+ for(uint8_t i=0; i<TUSB_CFG_HOST_DEVICE_MAX; i++)
+ {
+ if ( disk_is_ready(i) )
+ {
+ f_chdrive(i);
+ cli_init(); // refractor, rename
+ }
+ }
+ }
+}
+
+// invoked ISR context
+void tuh_msc_isr(uint8_t dev_addr, tusb_event_t event, uint32_t xferred_bytes)
+{
+ (void) dev_addr;
+ (void) event;
+ (void) xferred_bytes;
+}
+
+//--------------------------------------------------------------------+
+// APPLICATION CODE
+//--------------------------------------------------------------------+
+void msc_host_app_init(void)
+{
+ osal_task_create( msc_host_app_task, "msc", 512, NULL, MSC_APP_TASK_PRIO);
+ diskio_init();
+}
+
+//------------- main task -------------//
+void msc_host_app_task(void* param)
+{
+ (void) param;;
+
+ OSAL_TASK_BEGIN
+
+ bool is_any_disk_mounted;
+
+ osal_task_delay(10);
+
+ is_any_disk_mounted = false;
+
+ for(uint8_t phy_disk=0; phy_disk < TUSB_CFG_HOST_DEVICE_MAX; phy_disk++)
+ {
+ if ( disk_is_ready(phy_disk) )
+ {
+ is_any_disk_mounted = true;
+ break;
+ }
+ }
+
+ if ( is_any_disk_mounted )
+ {
+ int ch = getchar();
+ if ( ch > 0 )
+ {
+ cli_poll( (char) ch);
+ }
+ }
+
+ OSAL_TASK_END
+}
+
+#endif
diff --git a/examples/host/src/msc_host_app.h b/examples/host/src/msc_host_app.h
new file mode 100644
index 000000000..25ece8816
--- /dev/null
+++ b/examples/host/src/msc_host_app.h
@@ -0,0 +1,75 @@
+/**************************************************************************/
+/*!
+ @file msc_host_app.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_MSC_HOST_APP_H_
+#define _TUSB_MSC_HOST_APP_H_
+
+#include "board.h"
+#include "tusb.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if TUSB_CFG_HOST_MSC
+
+void msc_host_app_init(void);
+void msc_host_app_task(void* param);
+
+#else
+
+#define msc_host_app_init()
+#define msc_host_app_task(x)
+
+#endif
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_MSC_HOST_APP_H_ */
+
+/** @} */
diff --git a/examples/host/src/rndis_host_app.c b/examples/host/src/rndis_host_app.c
new file mode 100644
index 000000000..e6b37e4d3
--- /dev/null
+++ b/examples/host/src/rndis_host_app.c
@@ -0,0 +1,76 @@
+/**************************************************************************/
+/*!
+ @file rndis_host_app.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "rndis_host_app.h"
+#include "app_os_prio.h"
+
+#if TUSB_CFG_HOST_CDC && TUSB_CFG_HOST_CDC_RNDIS
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+void tusbh_cdc_rndis_mounted_cb(uint8_t dev_addr)
+{ // application set-up
+ uint8_t mac_address[6];
+
+ printf("\nan RNDIS device is mounted\n");
+ tusbh_cdc_rndis_get_mac_addr(dev_addr, mac_address);
+
+ printf("MAC Address ");
+ for(uint8_t i=0; i<6; i++) printf("%X ", mac_address[i]);
+ printf("\n");
+}
+
+void tusbh_cdc_rndis_unmounted_cb(uint8_t dev_addr)
+{
+ // application tear-down
+ printf("\nan RNDIS device is unmounted\n");
+}
+
+void rndis_host_app_init(void)
+{
+
+}
+
+void rndis_host_app_task(void* param)
+{
+ OSAL_TASK_BEGIN
+ OSAL_TASK_END
+}
+
+#endif
diff --git a/examples/host/src/rndis_host_app.h b/examples/host/src/rndis_host_app.h
new file mode 100644
index 000000000..e4fcacf46
--- /dev/null
+++ b/examples/host/src/rndis_host_app.h
@@ -0,0 +1,75 @@
+/**************************************************************************/
+/*!
+ @file rndis_host_app.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_RNDIS_HOST_APP_H_
+#define _TUSB_RNDIS_HOST_APP_H_
+
+#include "board.h"
+#include "tusb.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#if TUSB_CFG_HOST_CDC && TUSB_CFG_HOST_CDC_RNDIS
+
+void rndis_host_app_init(void);
+void rndis_host_app_task(void* param);
+
+#else
+
+#define rndis_host_app_init()
+#define rndis_host_app_task(x)
+
+#endif
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_RNDIS_HOST_APP_H_ */
+
+/** @} */
diff --git a/examples/host/src/tusb_config.h b/examples/host/src/tusb_config.h
new file mode 100644
index 000000000..04fd7e889
--- /dev/null
+++ b/examples/host/src/tusb_config.h
@@ -0,0 +1,115 @@
+/**************************************************************************/
+/*!
+ @file tusb_config.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#ifndef _TUSB_TUSB_CONFIG_H_
+#define _TUSB_TUSB_CONFIG_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+//--------------------------------------------------------------------+
+// CONTROLLER CONFIGURATION
+//--------------------------------------------------------------------+
+//#define TUSB_CFG_MCU will be passed from IDE for easy board/mcu switching
+#define TUSB_CFG_CONTROLLER_0_MODE (TUSB_MODE_HOST)
+
+//--------------------------------------------------------------------+
+// HOST CONFIGURATION
+//--------------------------------------------------------------------+
+
+//------------- CLASS -------------//
+#define TUSB_CFG_HOST_HUB 1
+#define TUSB_CFG_HOST_HID_KEYBOARD 1
+#define TUSB_CFG_HOST_HID_MOUSE 1
+#define TUSB_CFG_HOST_HID_GENERIC 0 // (not yet supported)
+#define TUSB_CFG_HOST_MSC 1
+#define TUSB_CFG_HOST_CDC 1
+
+#define TUSB_CFG_HOST_DEVICE_MAX (TUSB_CFG_HOST_HUB ? 5 : 1) // normal hub has 4 ports
+
+//--------------------------------------------------------------------+
+// COMMON CONFIGURATION
+//--------------------------------------------------------------------+
+#define TUSB_CFG_DEBUG 2
+
+//#define TUSB_CFG_OS TUSB_OS_NONE // defined using eclipse build
+//#define TUSB_CFG_OS_TASK_PRIO 0 // defined using eclipse build
+
+#define TUSB_CFG_TICKS_HZ 1000
+
+//--------------------------------------------------------------------+
+// USB RAM PLACEMENT
+//--------------------------------------------------------------------+
+#ifdef __CODE_RED // make use of code red's support for ram region macros
+
+ #if TUSB_CFG_MCU == MCU_LPC175X_6X
+ #define TUSB_CFG_ATTR_USBRAM // LPC17xx USB DMA can access all address
+ #elif (TUSB_CFG_MCU == MCU_LPC43XX)
+ #define TUSB_CFG_ATTR_USBRAM ATTR_SECTION(.data.$RAM3)
+ #endif
+
+#elif defined __CC_ARM // Compiled with Keil armcc
+
+ #if (TUSB_CFG_MCU == MCU_LPC175X_6X)
+ #define TUSB_CFG_ATTR_USBRAM // LPC17xx USB DMA can access all address
+ #elif (TUSB_CFG_MCU == MCU_LPC43XX)
+ #define TUSB_CFG_ATTR_USBRAM // Use keil tool configure to have AHB SRAM as default memory
+ #endif
+
+#elif defined __ICCARM__ // compiled with IAR
+
+ #if (TUSB_CFG_MCU == MCU_LPC175X_6X)
+ // LP175x_6x can access all but CMSIS-RTX causes overflow in 32KB SRAM --> move to AHB ram
+ #define TUSB_CFG_ATTR_USBRAM _Pragma("location=\".sram\"")
+ #elif (TUSB_CFG_MCU == MCU_LPC43XX)
+ #define TUSB_CFG_ATTR_USBRAM _Pragma("location=\".ahb_sram1\"")
+ #endif
+
+#else
+
+ #error compiler not specified
+
+#endif
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_TUSB_CONFIG_H_ */