From bfd6c8bc1ee1597dbc1453893504901319e8ce40 Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 24 Mar 2014 16:00:14 +0700 Subject: rename host demo sourc files --- demos/host/src/cdc_serial_app.c | 169 ------------ demos/host/src/cdc_serial_app.h | 74 ------ demos/host/src/cdc_serial_host_app.c | 169 ++++++++++++ demos/host/src/cdc_serial_host_app.h | 74 ++++++ demos/host/src/cli.c | 483 ----------------------------------- demos/host/src/cli.h | 62 ----- demos/host/src/keyboard_app.c | 180 ------------- demos/host/src/keyboard_app.h | 80 ------ demos/host/src/keyboard_host_app.c | 180 +++++++++++++ demos/host/src/keyboard_host_app.h | 80 ++++++ demos/host/src/mouse_app.c | 184 ------------- demos/host/src/mouse_app.h | 83 ------ demos/host/src/mouse_host_app.c | 184 +++++++++++++ demos/host/src/mouse_host_app.h | 83 ++++++ demos/host/src/msc_app.c | 183 ------------- demos/host/src/msc_app.h | 75 ------ demos/host/src/msc_cli.c | 483 +++++++++++++++++++++++++++++++++++ demos/host/src/msc_cli.h | 62 +++++ demos/host/src/msc_host_app.c | 183 +++++++++++++ demos/host/src/msc_host_app.h | 75 ++++++ demos/host/src/rndis_app.c | 76 ------ demos/host/src/rndis_app.h | 75 ------ demos/host/src/rndis_host_app.c | 76 ++++++ demos/host/src/rndis_host_app.h | 75 ++++++ 24 files changed, 1724 insertions(+), 1724 deletions(-) delete mode 100644 demos/host/src/cdc_serial_app.c delete mode 100644 demos/host/src/cdc_serial_app.h create mode 100644 demos/host/src/cdc_serial_host_app.c create mode 100644 demos/host/src/cdc_serial_host_app.h delete mode 100644 demos/host/src/cli.c delete mode 100644 demos/host/src/cli.h delete mode 100644 demos/host/src/keyboard_app.c delete mode 100644 demos/host/src/keyboard_app.h create mode 100644 demos/host/src/keyboard_host_app.c create mode 100644 demos/host/src/keyboard_host_app.h delete mode 100644 demos/host/src/mouse_app.c delete mode 100644 demos/host/src/mouse_app.h create mode 100644 demos/host/src/mouse_host_app.c create mode 100644 demos/host/src/mouse_host_app.h delete mode 100644 demos/host/src/msc_app.c delete mode 100644 demos/host/src/msc_app.h create mode 100644 demos/host/src/msc_cli.c create mode 100644 demos/host/src/msc_cli.h create mode 100644 demos/host/src/msc_host_app.c create mode 100644 demos/host/src/msc_host_app.h delete mode 100644 demos/host/src/rndis_app.c delete mode 100644 demos/host/src/rndis_app.h create mode 100644 demos/host/src/rndis_host_app.c create mode 100644 demos/host/src/rndis_host_app.h diff --git a/demos/host/src/cdc_serial_app.c b/demos/host/src/cdc_serial_app.c deleted file mode 100644 index cffc5b401..000000000 --- a/demos/host/src/cdc_serial_app.c +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************/ -/*! - @file cdc_serial_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_app.h" -#include "app_os_prio.h" - -#if TUSB_CFG_HOST_CDC - -#define QUEUE_SERIAL_DEPTH 100 - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(cdc_serial_app_task, 128, CDC_SERIAL_APP_TASK_PRIO); -OSAL_SEM_DEF(serial_semaphore); - -static osal_semaphore_handle_t sem_hdl; - -TUSB_CFG_ATTR_USBRAM static uint8_t serial_in_buffer[32]; -TUSB_CFG_ATTR_USBRAM static uint8_t serial_out_buffer[32]; - -static uint8_t received_bytes; // set by transfer complete callback - -//--------------------------------------------------------------------+ -// tinyusb Callbacks -//--------------------------------------------------------------------+ -void tusbh_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); - tusbh_cdc_receive(dev_addr, serial_in_buffer, sizeof(serial_in_buffer), true); // schedule first transfer -} - -void tusbh_cdc_unmounted_cb(uint8_t dev_addr) -{ // application tear-down - printf("\na CDC device (address %d) is unmounted \n", dev_addr); -} - -void tusbh_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 - break; - - case TUSB_EVENT_XFER_STALLED: - default : - break; - } - break; - - case CDC_PIPE_DATA_OUT: - case CDC_PIPE_NOTIFICATION: - default: - break; - } -} - -//--------------------------------------------------------------------+ -// APPLICATION -//--------------------------------------------------------------------+ -void cdc_serial_app_init(void) -{ - sem_hdl = osal_semaphore_create( OSAL_SEM_REF(serial_semaphore) ); - ASSERT_PTR( sem_hdl, VOID_RETURN); - - ASSERT( TUSB_ERROR_NONE == osal_task_create(OSAL_TASK_REF(cdc_serial_app_task)), VOID_RETURN); -} - -//------------- main task -------------// -OSAL_TASK_FUNCTION( cdc_serial_app_task, p_task_para) -{ - (void) p_task_para; - - OSAL_TASK_LOOP_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 ( tusbh_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 - serial_out_buffer[0] = (uint8_t) ch_tx; - - if ( !tusbh_cdc_is_busy(dev_addr, CDC_PIPE_DATA_OUT) ) - { - tusbh_cdc_send(dev_addr, serial_out_buffer, 1, false); // no need for interrupt 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 0 ) + { // USB is much faster than serial, here we assume usb is always complete. There could be some characters missing + serial_out_buffer[0] = (uint8_t) ch_tx; + + if ( !tusbh_cdc_is_busy(dev_addr, CDC_PIPE_DATA_OUT) ) + { + tusbh_cdc_send(dev_addr, serial_out_buffer, 1, false); // no need for interrupt 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\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) a empty DIRECTORY or a 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 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/demos/host/src/cli.h b/demos/host/src/cli.h deleted file mode 100644 index c1637e126..000000000 --- a/demos/host/src/cli.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************/ -/*! - @file 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_CLI_H_ -#define _TUSB_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/demos/host/src/keyboard_app.c b/demos/host/src/keyboard_app.c deleted file mode 100644 index 07505ae5f..000000000 --- a/demos/host/src/keyboard_app.c +++ /dev/null @@ -1,180 +0,0 @@ -/**************************************************************************/ -/*! - @file keyboard_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_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 -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(keyboard_app_task, 128, KEYBOARD_APP_TASK_PRIO); -OSAL_QUEUE_DEF(queue_kbd_def, QUEUE_KEYBOARD_REPORT_DEPTH, hid_keyboard_report_t); - -static osal_queue_handle_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 callback (ISR context) -//--------------------------------------------------------------------+ -void tusbh_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); - tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // first report -} - -void tusbh_hid_keyboard_unmounted_cb(uint8_t dev_addr) -{ - // application tear-down - printf("\na Keyboard device (address %d) is unmounted\n", dev_addr); -} - -void tusbh_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); - tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); - break; - - case TUSB_EVENT_XFER_ERROR: - tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // ignore & continue - break; - - default : - break; - } -} - -//--------------------------------------------------------------------+ -// APPLICATION -//--------------------------------------------------------------------+ -void keyboard_app_init(void) -{ - memclr_(&usb_keyboard_report, sizeof(hid_keyboard_report_t)); - - queue_kbd_hdl = osal_queue_create( OSAL_QUEUE_REF(queue_kbd_def) ); - ASSERT_PTR( queue_kbd_hdl, VOID_RETURN ); - - ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(keyboard_app_task) ) , - VOID_RETURN); -} - -//------------- main task -------------// -OSAL_TASK_FUNCTION( keyboard_app_task, p_task_para) -{ - (void) p_task_para; - - hid_keyboard_report_t kbd_report; - tusb_error_t error; - - OSAL_TASK_LOOP_BEGIN - - 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_LOOP_END -} - -//--------------------------------------------------------------------+ -// HELPER -//--------------------------------------------------------------------+ - -// look up new key in previous keys -static inline bool is_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 ( is_key_in_report(&prev_report, p_new_report->keycode[i]) ) - { - // exist in previous report means the current key is holding - }else - { - // not exist 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/demos/host/src/keyboard_app.h b/demos/host/src/keyboard_app.h deleted file mode 100644 index ae43fe0c2..000000000 --- a/demos/host/src/keyboard_app.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************/ -/*! - @file keyboard_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_APP_H_ -#define _TUSB_KEYBOARD_APP_H_ - -#include "board.h" -#include "tusb.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#if TUSB_CFG_HOST_HID_KEYBOARD - -void keyboard_app_init(void); -OSAL_TASK_FUNCTION( keyboard_app_task, p_task_para); - -#else - -#define keyboard_app_init() -#define keyboard_app_task(x) - -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_KEYBOARD_APP_H_ */ - -/** @} */ diff --git a/demos/host/src/keyboard_host_app.c b/demos/host/src/keyboard_host_app.c new file mode 100644 index 000000000..07505ae5f --- /dev/null +++ b/demos/host/src/keyboard_host_app.c @@ -0,0 +1,180 @@ +/**************************************************************************/ +/*! + @file keyboard_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_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 +//--------------------------------------------------------------------+ +OSAL_TASK_DEF(keyboard_app_task, 128, KEYBOARD_APP_TASK_PRIO); +OSAL_QUEUE_DEF(queue_kbd_def, QUEUE_KEYBOARD_REPORT_DEPTH, hid_keyboard_report_t); + +static osal_queue_handle_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 callback (ISR context) +//--------------------------------------------------------------------+ +void tusbh_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); + tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // first report +} + +void tusbh_hid_keyboard_unmounted_cb(uint8_t dev_addr) +{ + // application tear-down + printf("\na Keyboard device (address %d) is unmounted\n", dev_addr); +} + +void tusbh_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); + tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); + break; + + case TUSB_EVENT_XFER_ERROR: + tusbh_hid_keyboard_get_report(dev_addr, (uint8_t*) &usb_keyboard_report); // ignore & continue + break; + + default : + break; + } +} + +//--------------------------------------------------------------------+ +// APPLICATION +//--------------------------------------------------------------------+ +void keyboard_app_init(void) +{ + memclr_(&usb_keyboard_report, sizeof(hid_keyboard_report_t)); + + queue_kbd_hdl = osal_queue_create( OSAL_QUEUE_REF(queue_kbd_def) ); + ASSERT_PTR( queue_kbd_hdl, VOID_RETURN ); + + ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(keyboard_app_task) ) , + VOID_RETURN); +} + +//------------- main task -------------// +OSAL_TASK_FUNCTION( keyboard_app_task, p_task_para) +{ + (void) p_task_para; + + hid_keyboard_report_t kbd_report; + tusb_error_t error; + + OSAL_TASK_LOOP_BEGIN + + 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_LOOP_END +} + +//--------------------------------------------------------------------+ +// HELPER +//--------------------------------------------------------------------+ + +// look up new key in previous keys +static inline bool is_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 ( is_key_in_report(&prev_report, p_new_report->keycode[i]) ) + { + // exist in previous report means the current key is holding + }else + { + // not exist 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/demos/host/src/keyboard_host_app.h b/demos/host/src/keyboard_host_app.h new file mode 100644 index 000000000..ae43fe0c2 --- /dev/null +++ b/demos/host/src/keyboard_host_app.h @@ -0,0 +1,80 @@ +/**************************************************************************/ +/*! + @file keyboard_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_APP_H_ +#define _TUSB_KEYBOARD_APP_H_ + +#include "board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_HOST_HID_KEYBOARD + +void keyboard_app_init(void); +OSAL_TASK_FUNCTION( keyboard_app_task, p_task_para); + +#else + +#define keyboard_app_init() +#define keyboard_app_task(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_KEYBOARD_APP_H_ */ + +/** @} */ diff --git a/demos/host/src/mouse_app.c b/demos/host/src/mouse_app.c deleted file mode 100644 index cff84bbba..000000000 --- a/demos/host/src/mouse_app.c +++ /dev/null @@ -1,184 +0,0 @@ -/**************************************************************************/ -/*! - @file mouse_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_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 -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(mouse_app_task, 128, MOUSE_APP_TASK_PRIO); -OSAL_QUEUE_DEF(queue_mouse_def, QUEUE_MOUSE_REPORT_DEPTH, hid_mouse_report_t); - -static osal_queue_handle_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 callback (ISR context) -//--------------------------------------------------------------------+ -void tusbh_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) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // first report -} - -void tusbh_hid_mouse_unmounted_cb(uint8_t dev_addr) -{ - // application tear-down - printf("\na Mouse device (address %d) is unmounted\n", dev_addr); -} - -void tusbh_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) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); - break; - - case TUSB_EVENT_XFER_ERROR: - (void) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // ignore & continue - break; - - default : - break; - } -} - -//--------------------------------------------------------------------+ -// APPLICATION -// 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_app_init(void) -{ - memclr_(&usb_mouse_report, sizeof(hid_mouse_report_t)); - - queue_mouse_hdl = osal_queue_create( OSAL_QUEUE_REF(queue_mouse_def) ); - ASSERT_PTR( queue_mouse_hdl, VOID_RETURN); - - ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(mouse_app_task) ), - VOID_RETURN ); -} - -//------------- main task -------------// -OSAL_TASK_FUNCTION( mouse_app_task, p_task_para) -{ - (void) p_task_para; - - tusb_error_t error; - hid_mouse_report_t mouse_report; - - OSAL_TASK_LOOP_BEGIN - - osal_queue_receive(queue_mouse_hdl, &mouse_report, OSAL_TIMEOUT_WAIT_FOREVER, &error); - (void) error; // supporess compiler's warninig - - process_mouse_report(&mouse_report); - - OSAL_TASK_LOOP_END -} - -//--------------------------------------------------------------------+ -// HELPER -//--------------------------------------------------------------------+ -void cursor_movement(int8_t x, int8_t y, int8_t wheel) -{ - //------------- X -------------// - if ( x < 0) - { // move left - printf(ANSI_CURSOR_BACKWARD(%d), (-x)); - }else if ( x > 0) - { // move right - printf(ANSI_CURSOR_FORWARD(%d), x); - }else { } - - //------------- Y -------------// - if ( y < 0) - { // move up - printf(ANSI_CURSOR_UP(%d), (-y)); - }else if ( y > 0) - { // move down - printf(ANSI_CURSOR_DOWN(%d), y); - }else { } - - //------------- wheel -------------// - if (wheel < 0) - { // scroll up - printf(ANSI_SCROLL_UP(%d), (-wheel)); - }else if (wheel > 0) - { // scroll down - printf(ANSI_SCROLL_DOWN(%d), wheel); - }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/demos/host/src/mouse_app.h b/demos/host/src/mouse_app.h deleted file mode 100644 index d8f63d0e5..000000000 --- a/demos/host/src/mouse_app.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************/ -/*! - @file mouse_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_APP_H_ -#define _TUSB_MOUSE_APP_H_ - -#include -#include - -#include "board.h" -#include "tusb.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#if TUSB_CFG_HOST_HID_MOUSE - -void mouse_app_init(void); -OSAL_TASK_FUNCTION( mouse_app_task, p_task_para); - -#else - -#define mouse_app_init() -#define mouse_app_task(x) - -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_MOUSE_APP_H_ */ - -/** @} */ diff --git a/demos/host/src/mouse_host_app.c b/demos/host/src/mouse_host_app.c new file mode 100644 index 000000000..cff84bbba --- /dev/null +++ b/demos/host/src/mouse_host_app.c @@ -0,0 +1,184 @@ +/**************************************************************************/ +/*! + @file mouse_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_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 +//--------------------------------------------------------------------+ +OSAL_TASK_DEF(mouse_app_task, 128, MOUSE_APP_TASK_PRIO); +OSAL_QUEUE_DEF(queue_mouse_def, QUEUE_MOUSE_REPORT_DEPTH, hid_mouse_report_t); + +static osal_queue_handle_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 callback (ISR context) +//--------------------------------------------------------------------+ +void tusbh_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) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // first report +} + +void tusbh_hid_mouse_unmounted_cb(uint8_t dev_addr) +{ + // application tear-down + printf("\na Mouse device (address %d) is unmounted\n", dev_addr); +} + +void tusbh_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) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); + break; + + case TUSB_EVENT_XFER_ERROR: + (void) tusbh_hid_mouse_get_report(dev_addr, (uint8_t*) &usb_mouse_report); // ignore & continue + break; + + default : + break; + } +} + +//--------------------------------------------------------------------+ +// APPLICATION +// 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_app_init(void) +{ + memclr_(&usb_mouse_report, sizeof(hid_mouse_report_t)); + + queue_mouse_hdl = osal_queue_create( OSAL_QUEUE_REF(queue_mouse_def) ); + ASSERT_PTR( queue_mouse_hdl, VOID_RETURN); + + ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(mouse_app_task) ), + VOID_RETURN ); +} + +//------------- main task -------------// +OSAL_TASK_FUNCTION( mouse_app_task, p_task_para) +{ + (void) p_task_para; + + tusb_error_t error; + hid_mouse_report_t mouse_report; + + OSAL_TASK_LOOP_BEGIN + + osal_queue_receive(queue_mouse_hdl, &mouse_report, OSAL_TIMEOUT_WAIT_FOREVER, &error); + (void) error; // supporess compiler's warninig + + process_mouse_report(&mouse_report); + + OSAL_TASK_LOOP_END +} + +//--------------------------------------------------------------------+ +// HELPER +//--------------------------------------------------------------------+ +void cursor_movement(int8_t x, int8_t y, int8_t wheel) +{ + //------------- X -------------// + if ( x < 0) + { // move left + printf(ANSI_CURSOR_BACKWARD(%d), (-x)); + }else if ( x > 0) + { // move right + printf(ANSI_CURSOR_FORWARD(%d), x); + }else { } + + //------------- Y -------------// + if ( y < 0) + { // move up + printf(ANSI_CURSOR_UP(%d), (-y)); + }else if ( y > 0) + { // move down + printf(ANSI_CURSOR_DOWN(%d), y); + }else { } + + //------------- wheel -------------// + if (wheel < 0) + { // scroll up + printf(ANSI_SCROLL_UP(%d), (-wheel)); + }else if (wheel > 0) + { // scroll down + printf(ANSI_SCROLL_DOWN(%d), wheel); + }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/demos/host/src/mouse_host_app.h b/demos/host/src/mouse_host_app.h new file mode 100644 index 000000000..d8f63d0e5 --- /dev/null +++ b/demos/host/src/mouse_host_app.h @@ -0,0 +1,83 @@ +/**************************************************************************/ +/*! + @file mouse_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_APP_H_ +#define _TUSB_MOUSE_APP_H_ + +#include +#include + +#include "board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_HOST_HID_MOUSE + +void mouse_app_init(void); +OSAL_TASK_FUNCTION( mouse_app_task, p_task_para); + +#else + +#define mouse_app_init() +#define mouse_app_task(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MOUSE_APP_H_ */ + +/** @} */ diff --git a/demos/host/src/msc_app.c b/demos/host/src/msc_app.c deleted file mode 100644 index e6df5d6be..000000000 --- a/demos/host/src/msc_app.c +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************/ -/*! - @file msc_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_app.h" -#include "app_os_prio.h" - -#if TUSB_CFG_HOST_MSC - -#include "cli.h" -#include "ff.h" -#include "diskio.h" - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(msc_app_task, 512, MSC_APP_TASK_PRIO); - -TUSB_CFG_ATTR_USBRAM static FATFS fatfs[TUSB_CFG_HOST_DEVICE_MAX]; - -//--------------------------------------------------------------------+ -// tinyusb callback (ISR context) -//--------------------------------------------------------------------+ -void tusbh_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 = tusbh_msc_get_vendor_name(dev_addr); - uint8_t const* p_product = tusbh_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; - tusbh_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 tusbh_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 0 ) - { - cli_poll( (char) ch); - } - } - - OSAL_TASK_LOOP_END -} - -#endif diff --git a/demos/host/src/msc_app.h b/demos/host/src/msc_app.h deleted file mode 100644 index 0b34510e3..000000000 --- a/demos/host/src/msc_app.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************/ -/*! - @file msc_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_APP_H_ -#define _TUSB_MSC_APP_H_ - -#include "board.h" -#include "tusb.h" - - -#ifdef __cplusplus - extern "C" { -#endif - -#if TUSB_CFG_HOST_MSC - -void msc_app_init(void); -OSAL_TASK_FUNCTION( msc_app_task, p_task_para); - -#else - -#define msc_app_init() -#define msc_app_task(x) - -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_MSC_APP_H_ */ - -/** @} */ diff --git a/demos/host/src/msc_cli.c b/demos/host/src/msc_cli.c new file mode 100644 index 000000000..da3f2efb8 --- /dev/null +++ b/demos/host/src/msc_cli.c @@ -0,0 +1,483 @@ +/**************************************************************************/ +/*! + @file 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 "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 \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) a empty DIRECTORY or a 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 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/demos/host/src/msc_cli.h b/demos/host/src/msc_cli.h new file mode 100644 index 000000000..c1637e126 --- /dev/null +++ b/demos/host/src/msc_cli.h @@ -0,0 +1,62 @@ +/**************************************************************************/ +/*! + @file 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_CLI_H_ +#define _TUSB_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/demos/host/src/msc_host_app.c b/demos/host/src/msc_host_app.c new file mode 100644 index 000000000..e6df5d6be --- /dev/null +++ b/demos/host/src/msc_host_app.c @@ -0,0 +1,183 @@ +/**************************************************************************/ +/*! + @file msc_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_app.h" +#include "app_os_prio.h" + +#if TUSB_CFG_HOST_MSC + +#include "cli.h" +#include "ff.h" +#include "diskio.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +OSAL_TASK_DEF(msc_app_task, 512, MSC_APP_TASK_PRIO); + +TUSB_CFG_ATTR_USBRAM static FATFS fatfs[TUSB_CFG_HOST_DEVICE_MAX]; + +//--------------------------------------------------------------------+ +// tinyusb callback (ISR context) +//--------------------------------------------------------------------+ +void tusbh_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 = tusbh_msc_get_vendor_name(dev_addr); + uint8_t const* p_product = tusbh_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; + tusbh_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 tusbh_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 0 ) + { + cli_poll( (char) ch); + } + } + + OSAL_TASK_LOOP_END +} + +#endif diff --git a/demos/host/src/msc_host_app.h b/demos/host/src/msc_host_app.h new file mode 100644 index 000000000..0b34510e3 --- /dev/null +++ b/demos/host/src/msc_host_app.h @@ -0,0 +1,75 @@ +/**************************************************************************/ +/*! + @file msc_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_APP_H_ +#define _TUSB_MSC_APP_H_ + +#include "board.h" +#include "tusb.h" + + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_HOST_MSC + +void msc_app_init(void); +OSAL_TASK_FUNCTION( msc_app_task, p_task_para); + +#else + +#define msc_app_init() +#define msc_app_task(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MSC_APP_H_ */ + +/** @} */ diff --git a/demos/host/src/rndis_app.c b/demos/host/src/rndis_app.c deleted file mode 100644 index 8371d6985..000000000 --- a/demos/host/src/rndis_app.c +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************************/ -/*! - @file rndis_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_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_app_init(void) -{ - -} - -OSAL_TASK_FUNCTION( rndis_app_task ) (void* p_task_para) -{ - OSAL_TASK_LOOP_BEGIN - OSAL_TASK_LOOP_END -} - -#endif diff --git a/demos/host/src/rndis_app.h b/demos/host/src/rndis_app.h deleted file mode 100644 index e420f341e..000000000 --- a/demos/host/src/rndis_app.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************/ -/*! - @file rndis_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_APP_H_ -#define _TUSB_RNDIS_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_app_init(void); -OSAL_TASK_FUNCTION( rndis_app_task ) (void* p_task_para); - -#else - -#define rndis_app_init() -#define rndis_app_task(x) - -#endif - - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_RNDIS_APP_H_ */ - -/** @} */ diff --git a/demos/host/src/rndis_host_app.c b/demos/host/src/rndis_host_app.c new file mode 100644 index 000000000..8371d6985 --- /dev/null +++ b/demos/host/src/rndis_host_app.c @@ -0,0 +1,76 @@ +/**************************************************************************/ +/*! + @file rndis_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_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_app_init(void) +{ + +} + +OSAL_TASK_FUNCTION( rndis_app_task ) (void* p_task_para) +{ + OSAL_TASK_LOOP_BEGIN + OSAL_TASK_LOOP_END +} + +#endif diff --git a/demos/host/src/rndis_host_app.h b/demos/host/src/rndis_host_app.h new file mode 100644 index 000000000..e420f341e --- /dev/null +++ b/demos/host/src/rndis_host_app.h @@ -0,0 +1,75 @@ +/**************************************************************************/ +/*! + @file rndis_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_APP_H_ +#define _TUSB_RNDIS_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_app_init(void); +OSAL_TASK_FUNCTION( rndis_app_task ) (void* p_task_para); + +#else + +#define rndis_app_init() +#define rndis_app_task(x) + +#endif + + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_RNDIS_APP_H_ */ + +/** @} */ -- cgit v1.3.1