From 8de6ee22dc81d871a14d3c3cb63aa3863a5cb2d6 Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 24 Dec 2013 16:15:18 +0700 Subject: move device app code --- demos/device/device_os_none/cdcd_app.c | 151 --------- demos/device/device_os_none/cdcd_app.h | 75 ----- demos/device/device_os_none/keyboardd_app.c | 157 --------- demos/device/device_os_none/keyboardd_app.h | 74 ----- demos/device/device_os_none/main.c | 157 --------- demos/device/device_os_none/moused_app.c | 124 ------- demos/device/device_os_none/moused_app.h | 74 ----- demos/device/device_os_none/mscd_app.c | 164 --------- demos/device/device_os_none/mscd_app.h | 93 ------ demos/device/device_os_none/mscd_app_ramdisk.c | 236 ------------- demos/device/device_os_none/mscd_app_romdisk.c | 119 ------- demos/device/device_os_none/tusb_config.h | 140 -------- demos/device/device_os_none/tusb_descriptors.c | 438 ------------------------- demos/device/device_os_none/tusb_descriptors.h | 193 ----------- demos/device/src/cdcd_app.c | 151 +++++++++ demos/device/src/cdcd_app.h | 75 +++++ demos/device/src/keyboardd_app.c | 157 +++++++++ demos/device/src/keyboardd_app.h | 74 +++++ demos/device/src/main.c | 157 +++++++++ demos/device/src/moused_app.c | 124 +++++++ demos/device/src/moused_app.h | 74 +++++ demos/device/src/mscd_app.c | 164 +++++++++ demos/device/src/mscd_app.h | 93 ++++++ demos/device/src/mscd_app_ramdisk.c | 236 +++++++++++++ demos/device/src/mscd_app_romdisk.c | 119 +++++++ demos/device/src/tusb_config.h | 140 ++++++++ demos/device/src/tusb_descriptors.c | 438 +++++++++++++++++++++++++ demos/device/src/tusb_descriptors.h | 193 +++++++++++ 28 files changed, 2195 insertions(+), 2195 deletions(-) delete mode 100644 demos/device/device_os_none/cdcd_app.c delete mode 100644 demos/device/device_os_none/cdcd_app.h delete mode 100644 demos/device/device_os_none/keyboardd_app.c delete mode 100644 demos/device/device_os_none/keyboardd_app.h delete mode 100644 demos/device/device_os_none/main.c delete mode 100644 demos/device/device_os_none/moused_app.c delete mode 100644 demos/device/device_os_none/moused_app.h delete mode 100644 demos/device/device_os_none/mscd_app.c delete mode 100644 demos/device/device_os_none/mscd_app.h delete mode 100644 demos/device/device_os_none/mscd_app_ramdisk.c delete mode 100644 demos/device/device_os_none/mscd_app_romdisk.c delete mode 100644 demos/device/device_os_none/tusb_config.h delete mode 100644 demos/device/device_os_none/tusb_descriptors.c delete mode 100644 demos/device/device_os_none/tusb_descriptors.h create mode 100644 demos/device/src/cdcd_app.c create mode 100644 demos/device/src/cdcd_app.h create mode 100644 demos/device/src/keyboardd_app.c create mode 100644 demos/device/src/keyboardd_app.h create mode 100644 demos/device/src/main.c create mode 100644 demos/device/src/moused_app.c create mode 100644 demos/device/src/moused_app.h create mode 100644 demos/device/src/mscd_app.c create mode 100644 demos/device/src/mscd_app.h create mode 100644 demos/device/src/mscd_app_ramdisk.c create mode 100644 demos/device/src/mscd_app_romdisk.c create mode 100644 demos/device/src/tusb_config.h create mode 100644 demos/device/src/tusb_descriptors.c create mode 100644 demos/device/src/tusb_descriptors.h diff --git a/demos/device/device_os_none/cdcd_app.c b/demos/device/device_os_none/cdcd_app.c deleted file mode 100644 index 44e06ddf4..000000000 --- a/demos/device/device_os_none/cdcd_app.c +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************/ -/*! - @file cdcd_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 "cdcd_app.h" - -#if TUSB_CFG_DEVICE_CDC - -#include "common/fifo.h" // TODO refractor - -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ -enum { - CDCD_APP_BUFFER_SIZE = 64 -}; - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(cdcd_serial_app_task, 128, CDCD_SERIAL_APP_TASK_PRIO); -OSAL_SEM_DEF(cdcd_semaphore); - -static osal_semaphore_handle_t sem_hdl; - -ATTR_USB_MIN_ALIGNMENT static uint8_t serial_rx_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM; -ATTR_USB_MIN_ALIGNMENT static uint8_t serial_tx_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM; - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -FIFO_DEF(fifo_serial, CDCD_APP_BUFFER_SIZE, uint8_t, true); - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ -void cdcd_serial_app_init(void) -{ - sem_hdl = osal_semaphore_create( OSAL_SEM_REF(cdcd_semaphore) ); - ASSERT_PTR( sem_hdl, VOID_RETURN); - - ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(cdcd_serial_app_task) ), VOID_RETURN); -} - -void tusbd_cdc_mounted_cb(uint8_t coreid) -{ - osal_semaphore_reset(sem_hdl); - - tusbd_cdc_receive(coreid, serial_rx_buffer, CDCD_APP_BUFFER_SIZE, true); -} - -void tusbd_cdc_xfer_cb(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes) -{ - switch ( pipe_id ) - { - case CDC_PIPE_DATA_OUT: - switch(event) - { - case TUSB_EVENT_XFER_COMPLETE: - for(uint8_t i=0; i -#include -#include - -#include "boards/board.h" -#include "tusb.h" - -#include "mscd_app.h" -#include "keyboardd_app.h" -#include "moused_app.h" -#include "cdcd_app.h" - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para); -OSAL_TASK_DEF(led_blinking_task, 128, LED_BLINKING_APP_TASK_PRIO); - -void print_greeting(void); - -#if TUSB_CFG_OS == TUSB_OS_NONE -// like a real RTOS, this function is a main loop invoking each task in application and never return -void os_none_start_scheduler(void) -{ - while (1) - { - tusb_task_runner(); - led_blinking_task(NULL); - - keyboardd_app_task(NULL); - moused_app_task(NULL); - cdcd_serial_app_task(NULL); - } -} -#endif - -int main(void) -{ - board_init(); - print_greeting(); - - tusb_init(); - - //------------- application task init -------------// - (void) osal_task_create( OSAL_TASK_REF(led_blinking_task) ); - - msc_dev_app_init(); - keyboardd_app_init(); - moused_app_init(); - cdcd_serial_app_init(); - - //------------- start OS scheduler (never return) -------------// -#if TUSB_CFG_OS == TUSB_OS_FREERTOS - vTaskStartScheduler(); -#elif TUSB_CFG_OS == TUSB_OS_NONE - os_none_start_scheduler(); -#elif TUSB_CFG_OS == TUSB_OS_CMSIS_RTX - while(1) - { - osDelay(osWaitForever); // CMSIS RTX osKernelStart already started, main() is a task - } -#else - #error need to start RTOS schduler -#endif - - while(1) { } // should not reach here - - return 0; -} - -//--------------------------------------------------------------------+ -// BLINKING TASK -//--------------------------------------------------------------------+ -static uint32_t led_blink_interval_ms = 1000; // default is 1 seconda -void led_blinking_set_interval(uint32_t ms) -{ - led_blink_interval_ms = ms; -} - -OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para) -{ - OSAL_TASK_LOOP_BEGIN - - static uint32_t led_on_mask = 0; - - osal_task_delay(led_blink_interval_ms); - - board_leds(led_on_mask, 1 - led_on_mask); - led_on_mask = 1 - led_on_mask; // toggle - - OSAL_TASK_LOOP_END -} - -//--------------------------------------------------------------------+ -// HELPER FUNCTION -//--------------------------------------------------------------------+ -void print_greeting(void) -{ - printf("\n\ ---------------------------------------------------------------------\n\ -- Device Demo (a tinyusb example)\n\ -- if you find any bugs or get any questions, feel free to file an\n\ -- issue at https://github.com/hathach/tinyusb\n\ ---------------------------------------------------------------------\n\n" - ); - - puts("This demo supports the following classes"); - if (TUSB_CFG_DEVICE_HID_MOUSE ) puts(" - HID Mouse"); - if (TUSB_CFG_DEVICE_HID_KEYBOARD ) puts(" - HID Keyboard"); - if (TUSB_CFG_DEVICE_MSC ) puts(" - Mass Storage"); - if (TUSB_CFG_DEVICE_CDC ) puts(" - Communication Device Class"); -} diff --git a/demos/device/device_os_none/moused_app.c b/demos/device/device_os_none/moused_app.c deleted file mode 100644 index dd6600131..000000000 --- a/demos/device/device_os_none/moused_app.c +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************/ -/*! - @file moused_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 "moused_app.h" - -#if TUSB_CFG_DEVICE_HID_MOUSE -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -OSAL_TASK_DEF(moused_app_task, 128, MOUSED_APP_TASK_PRIO); - -ATTR_USB_MIN_ALIGNMENT hid_mouse_report_t mouse_report TUSB_CFG_ATTR_USBRAM; - -static uint8_t moused_report_count; // number of reports sent each mounted - -//--------------------------------------------------------------------+ -// tinyusb Callbacks -//--------------------------------------------------------------------+ -void tusbd_hid_mouse_mounted_cb(uint8_t coreid) -{ - moused_report_count = 0; -} - -void tusbd_hid_mouse_unmounted_cb(uint8_t coreid) -{ - -} - -void tusbd_hid_mouse_cb(uint8_t coreid, tusb_event_t event, uint32_t xferred_bytes) -{ - switch(event) - { - case TUSB_EVENT_XFER_COMPLETE: - case TUSB_EVENT_XFER_ERROR: - case TUSB_EVENT_XFER_STALLED: - default: break; - } -} - -uint16_t tusbd_hid_mouse_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report, uint16_t requested_length) -{ - if ( report_type != HID_REQUEST_REPORT_INPUT ) return 0; // not support other report type for this mouse demo - - (*pp_report) = &mouse_report; - return requested_length; -} - -void tusbd_hid_mouse_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t report_data[], uint16_t length) -{ - // mouse demo does not support set report --> return 0 will result in rejecting (STALL) this request - return 0; -} -//--------------------------------------------------------------------+ -// APPLICATION CODE -//--------------------------------------------------------------------+ -void moused_app_init(void) -{ - ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(moused_app_task) ), VOID_RETURN); -} - -OSAL_TASK_FUNCTION( moused_app_task ) (void* p_task_para) -{ - OSAL_TASK_LOOP_BEGIN - - // only send 5 reports - if (tusbd_is_configured(0) && (moused_report_count++ < 5) ) - { - if ( !tusbd_hid_mouse_is_busy(0) ) - { - mouse_report.x = mouse_report.y = 20; - tusbd_hid_mouse_send(0, &mouse_report ); - } - } - - osal_task_delay(1000); - - OSAL_TASK_LOOP_END -} - -#endif - diff --git a/demos/device/device_os_none/moused_app.h b/demos/device/device_os_none/moused_app.h deleted file mode 100644 index 2b49d4373..000000000 --- a/demos/device/device_os_none/moused_app.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************/ -/*! - @file moused_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_MOUSED_APP_H_ -#define _TUSB_MOUSED_APP_H_ - -#include "boards/board.h" -#include "tusb.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#if TUSB_CFG_DEVICE_HID_MOUSE - -void moused_app_init(void); -OSAL_TASK_FUNCTION( moused_app_task ) (void* p_task_para); - -#else - -#define moused_app_init() -#define moused_app_task(x) - -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_MOUSED_APP_H_ */ - -/** @} */ diff --git a/demos/device/device_os_none/mscd_app.c b/demos/device/device_os_none/mscd_app.c deleted file mode 100644 index 755153458..000000000 --- a/demos/device/device_os_none/mscd_app.c +++ /dev/null @@ -1,164 +0,0 @@ -/**************************************************************************/ -/*! - @file mscd_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 "mscd_app.h" - -#if TUSB_CFG_DEVICE_MSC -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ -ATTR_USB_MIN_ALIGNMENT -static scsi_inquiry_data_t mscd_inquiry_data TUSB_CFG_ATTR_USBRAM = -{ - .is_removable = 1, - .version = 2, - .response_data_format = 2, - .vendor_id = "tinyusb", - .product_id = "MSC Example", - .product_revision = "0.01" -}; - -ATTR_USB_MIN_ALIGNMENT -static scsi_read_capacity10_data_t mscd_read_capacity10_data TUSB_CFG_ATTR_USBRAM = -{ - .last_lba = __n2be(DISK_BLOCK_NUM-1), // read capacity - .block_size = __n2be(DISK_BLOCK_SIZE) -}; - -ATTR_USB_MIN_ALIGNMENT -scsi_sense_fixed_data_t mscd_sense_data TUSB_CFG_ATTR_USBRAM = -{ - .response_code = 0x70, - .sense_key = 0, // no errors - .additional_sense_len = sizeof(scsi_sense_fixed_data_t) - 8 -}; - -ATTR_USB_MIN_ALIGNMENT -static scsi_read_format_capacity_data_t mscd_format_capacity_data TUSB_CFG_ATTR_USBRAM = -{ - .list_length = 8, - .block_num = __n2be(DISK_BLOCK_NUM), // write capacity - .descriptor_type = 2, // TODO formatted media, refractor to const - .block_size_u16 = __n2be_16(DISK_BLOCK_SIZE) -}; - -ATTR_USB_MIN_ALIGNMENT -static scsi_mode_parameters_t msc_dev_mode_para TUSB_CFG_ATTR_USBRAM = -{ - .mode_data_length = 3, - .medium_type = 0, - .device_specific_para = 0, - .block_descriptor_length = 0 -}; - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// tinyusb callback (ISR context) -//--------------------------------------------------------------------+ -msc_csw_status_t tusbd_msc_scsi_received_isr (uint8_t coreid, uint8_t lun, uint8_t scsi_cmd[16], void ** pp_buffer, uint16_t* p_length) -{ - // read10 & write10 has their own callback and MUST not be handled here - switch (scsi_cmd[0]) - { - case SCSI_CMD_INQUIRY: - (*pp_buffer) = &mscd_inquiry_data; - (*p_length) = sizeof(scsi_inquiry_data_t); - break; - - case SCSI_CMD_READ_CAPACITY_10: - (*pp_buffer) = &mscd_read_capacity10_data; - (*p_length) = sizeof(scsi_read_capacity10_data_t); - break; - - case SCSI_CMD_REQUEST_SENSE: - (*pp_buffer) = &mscd_sense_data; - (*p_length) = sizeof(scsi_sense_fixed_data_t); - break; - - case SCSI_CMD_READ_FORMAT_CAPACITY: - (*pp_buffer) = &mscd_format_capacity_data; - (*p_length) = sizeof(scsi_read_format_capacity_data_t); - break; - - case SCSI_CMD_MODE_SENSE_6: - (*pp_buffer) = &msc_dev_mode_para; - (*p_length) = sizeof(msc_dev_mode_para); - break; - - case SCSI_CMD_TEST_UNIT_READY: - (*pp_buffer) = NULL; - (*p_length) = 0; - break; - - case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: - (*pp_buffer) = NULL; - (*p_length) = 0; - break; - - default: return MSC_CSW_STATUS_FAILED; - } - - //------------- clear sense data if it is not request sense command -------------// - if ( SCSI_CMD_REQUEST_SENSE != scsi_cmd[0] ) - { - mscd_sense_data.sense_key = SCSI_SENSEKEY_NONE; - mscd_sense_data.additional_sense_code = 0; - mscd_sense_data.additional_sense_qualifier = 0; - } - - return MSC_CSW_STATUS_PASSED; -} - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ - -void msc_dev_app_init (void) -{ - -} - - -#endif diff --git a/demos/device/device_os_none/mscd_app.h b/demos/device/device_os_none/mscd_app.h deleted file mode 100644 index f9f1d20bc..000000000 --- a/demos/device/device_os_none/mscd_app.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************/ -/*! - @file mscd_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_MSCD_APP_H_ -#define _TUSB_MSCD_APP_H_ - -#include "boards/board.h" -#include "tusb.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#if TUSB_CFG_DEVICE_MSC - -enum -{ - DISK_BLOCK_NUM = 16, // 8KB is the smallest size that windows allow to mount - DISK_BLOCK_SIZE = 512 -}; - -#define README_CONTENTS \ -"This is tinyusb's MassStorage Class demo.\r\n\r\n\ -If you find any bugs or get any questions, feel free to file an\r\n\ -issue at github.com/hathach/tinyusb" - -#if TUSB_CFG_MCU==MCU_LPC11UXX || TUSB_CFG_MCU==MCU_LPC13UXX - #define MSCD_APP_ROMDISK -#else // defaults is ram disk - #define MSCD_APP_RAMDISK -#endif - -void msc_dev_app_init(void); -OSAL_TASK_FUNCTION( msc_dev_app_task ) (void* p_task_para); - -extern scsi_sense_fixed_data_t mscd_sense_data; - -#else - -#define msc_dev_app_init() -#define msc_dev_app_task(x) - -#endif - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_MSCD_APP_H_ */ - -/** @} */ diff --git a/demos/device/device_os_none/mscd_app_ramdisk.c b/demos/device/device_os_none/mscd_app_ramdisk.c deleted file mode 100644 index e78ac4030..000000000 --- a/demos/device/device_os_none/mscd_app_ramdisk.c +++ /dev/null @@ -1,236 +0,0 @@ -/**************************************************************************/ -/*! - @file mscd_app_ramdisk.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 "mscd_app.h" - -#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_RAMDISK) - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -ATTR_USB_MIN_ALIGNMENT -uint8_t mscd_app_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] TUSB_CFG_ATTR_USBRAM = -{ - //------------- Boot Sector -------------// - // byte_per_sector = DISK_BLOCK_SIZE; fat12_sector_num_16 = DISK_BLOCK_NUM; - // sector_per_cluster = 1; reserved_sectors = 1; - // fat_num = 1; fat12_root_entry_num = 16; - // sector_per_fat = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0; - // drive_number = 0x80; media_type = 0xf8; extended_boot_signature = 0x29; - // filesystem_type = "FAT12 "; volume_serial_number = 0x1234; volume_label = "tinyusb msc"; - [0] = - { - 0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00, - 0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 0x74, 0x69, 0x6E, 0x79, 0x75, - 0x73, 0x62, 0x20, 0x6D, 0x73, 0x63, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00, - [510] = 0x55, [511] = 0xAA // FAT magic code - }, - - //------------- FAT12 Table -------------// - [1] = - { - 0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file - }, - - //------------- Root Directory -------------// - [2] = - { - // first entry is volume label - 0x54, 0x49, 0x4E, 0x59, 0x55, 0x53, 0x42, 0x20, 0x4D, 0x53, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // second entry is readme file - 'R' , 'E' , 'A' , 'D' , 'M' , 'E' , ' ' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D, - 0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00, - sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's filesize (4 Bytes) - }, - - //------------- Readme Content -------------// - [3] = README_CONTENTS -}; - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ -uint16_t tusbd_msc_read10_cb (uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) -{ - (*pp_buffer) = mscd_app_ramdisk[lba]; - - return min16_of(block_count, DISK_BLOCK_NUM); -} -uint16_t tusbd_msc_write10_cb(uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) -{ - (*pp_buffer) = mscd_app_ramdisk[lba]; - - return min16_of(block_count, DISK_BLOCK_NUM); -} - -//--------------------------------------------------------------------+ -// HELPER -//--------------------------------------------------------------------+ - -#if 0 // no need to use fat12 helper -typedef ATTR_PACKED_STRUCT(struct) { - //------------- common -------------// - uint8_t jump_code[3] ; ///< Assembly instruction to jump to boot code. - uint8_t oem_name[8] ; ///< OEM Name in ASCII. - uint16_t byte_per_sector ; ///< Bytes per sector. Allowed values include 512, 1024, 2048, and 4096. - uint8_t sector_per_cluster ; ///< Sectors per cluster (data unit). Allowed values are powers of 2, but the cluster size must be 32KB or smaller. - uint16_t reserved_sectors ; ///< Size in sectors of the reserved area. - uint8_t fat_num ; ///< Number of FATs. Typically two for redundancy, but according to Microsoft it can be one for some small storage devices. - uint16_t fat12_root_entry_num ; ///< Maximum number of files in the root directory for FAT12 and FAT16. This is 0 for FAT32 and typically 512 for FAT16. - uint16_t fat12_sector_num_16 ; ///< 16-bit number of sectors in file system. If the number of sectors is larger than can be represented in this 2-byte value, a 4-byte value exists later in the data structure and this should be 0. - uint8_t media_type ; ///< 0xf8 should be used for fixed disks and 0xf0 for removable. - uint16_t sector_per_fat ; ///< 16-bit size in sectors of each FAT for FAT12 and FAT16. For FAT32, this field is 0. - uint16_t sector_per_track ; ///< Sectors per track of storage device. - uint16_t head_num ; ///< Number of heads in storage device. - uint32_t hidden_sectors ; ///< Number of sectors before the start of partition. - uint32_t sector_num_32 ; ///< 32-bit value of number of sectors in file system. Either this value or the 16-bit value above must be 0. - - //------------- FAT32 -------------// - uint8_t drive_number ; ///< Physical drive number (0x00 for (first) removable media, 0x80 for (first) fixed disk - uint8_t reserved ; - uint8_t extended_boot_signature ; ///< should be 0x29 - uint32_t volume_serial_number ; ///< Volume serial number, which some versions of Windows will calculate based on the creation date and time. - uint8_t volume_label[11] ; - uint8_t filesystem_type[8] ; ///< File system type label in ASCII, padded with blank (0x20). Standard values include "FAT," "FAT12," and "FAT16," but nothing is required. - uint8_t reserved2[448] ; - uint16_t fat_signature ; ///< Signature value (0xAA55). -}fat12_boot_sector_t; - -STATIC_ASSERT(sizeof(fat12_boot_sector_t) == 512, "size is not correct"); - -typedef ATTR_PACKED_STRUCT(struct) { - uint8_t name[11]; - - ATTR_PACKED_STRUCT(struct){ - uint8_t readonly : 1; - uint8_t hidden : 1; - uint8_t system : 1; - uint8_t volume_label : 1; - uint8_t directory : 1; - uint8_t archive : 1; - } attr; // Long File Name = 0x0f - - uint8_t reserved; - uint8_t created_time_tenths_of_seconds; - uint16_t created_time; - uint16_t created_date; - uint16_t accessed_date; - uint16_t cluster_high; - uint16_t written_time; - uint16_t written_date; - uint16_t cluster_low; - uint32_t file_size; -}fat_directory_t; - -STATIC_ASSERT(sizeof(fat_directory_t) == 32, "size is not correct"); - -void fat12_fs_init(uint8_t mscd_app_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE]) -{ - uint8_t const readme_contents[] = -"This is tinyusb's MassStorage Class demo.\r\n\r\n\ -If you find any bugs or get any questions, feel free to file an\r\n\ -issue at https://github.com/hathach/tinyusb"; - - //------------- Boot Sector -------------// - fat12_boot_sector_t* p_boot_fat = (fat12_boot_sector_t* ) mscd_app_ramdisk[0]; - memclr_(p_boot_fat, sizeof(fat12_boot_sector_t)); - - memcpy(p_boot_fat->jump_code, "\xEB\x3C\x90", 3); - memcpy(p_boot_fat->oem_name, "MSDOS5.0", 8); - p_boot_fat->byte_per_sector = DISK_BLOCK_SIZE; - p_boot_fat->sector_per_cluster = 1; - p_boot_fat->reserved_sectors = 1; - p_boot_fat->fat_num = 1; - p_boot_fat->fat12_root_entry_num = 16; - p_boot_fat->fat12_sector_num_16 = DISK_BLOCK_NUM; - p_boot_fat->media_type = 0xf8; // fixed disk - p_boot_fat->sector_per_fat = 1; - p_boot_fat->sector_per_track = 1; - p_boot_fat->head_num = 1; - p_boot_fat->hidden_sectors = 0; - - p_boot_fat->drive_number = 0x80; - p_boot_fat->extended_boot_signature = 0x29; - p_boot_fat->volume_serial_number = 0x1234; - memcpy(p_boot_fat->volume_label , "tinyusb msc", 11); - memcpy(p_boot_fat->filesystem_type, "FAT12 ", 8); - p_boot_fat->fat_signature = 0xAA55; - - //------------- FAT12 Table (first 2 entries are F8FF, third entry is cluster end of readme file-------------// - memcpy(mscd_app_ramdisk[1], "\xF8\xFF\xFF\xFF\x0F", 5); - - //------------- Root Directory -------------// - fat_directory_t* p_entry = (fat_directory_t*) mscd_app_ramdisk[2]; - - // first entry is volume label - (*p_entry) = (fat_directory_t) - { - .name = "TINYUSB MSC", - .attr.volume_label = 1, - }; - - p_entry += 1; // advance to second entry, second entry is readme file - (*p_entry) = (fat_directory_t) - { - .name = "README TXT", - - .created_time = 0x6D52, - .written_time = 0x6D52, - - .created_date = 0x4365, - .accessed_date = 0x4365, - .written_date = 0x4365, - - .cluster_high = 0, - .cluster_low = 2, - .file_size = sizeof(readme_contents)-1 // exculde NULL - }; // first entry is volume label - - //------------- Readme Content -------------// - memcpy(mscd_app_ramdisk[3], readme_contents, sizeof(readme_contents)-1); - -} -#endif - -#endif diff --git a/demos/device/device_os_none/mscd_app_romdisk.c b/demos/device/device_os_none/mscd_app_romdisk.c deleted file mode 100644 index 751800f02..000000000 --- a/demos/device/device_os_none/mscd_app_romdisk.c +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************/ -/*! - @file mscd_app_romdisk.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 "mscd_app.h" - -#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_ROMDISK) - -//--------------------------------------------------------------------+ -// INCLUDE -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// INTERNAL OBJECT & FUNCTION DECLARATION -//--------------------------------------------------------------------+ -const uint8_t mscd_app_rommdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = -{ - //------------- Boot Sector -------------// - // byte_per_sector = DISK_BLOCK_SIZE; fat12_sector_num_16 = DISK_BLOCK_NUM; - // sector_per_cluster = 1; reserved_sectors = 1; - // fat_num = 1; fat12_root_entry_num = 16; - // sector_per_fat = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0; - // drive_number = 0x80; media_type = 0xf8; extended_boot_signature = 0x29; - // filesystem_type = "FAT12 "; volume_serial_number = 0x1234; volume_label = "tinyusb msc"; - [0] = - { - 0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00, - 0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 0x74, 0x69, 0x6E, 0x79, 0x75, - 0x73, 0x62, 0x20, 0x6D, 0x73, 0x63, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00, - [510] = 0x55, [511] = 0xAA // FAT magic code - }, - - //------------- FAT12 Table -------------// - [1] = - { - 0xF8, 0xFF, 0xFF, 0xFF, 0x0F // first 2 entries must be F8FF, third entry is cluster end of readme file - }, - - //------------- Root Directory -------------// - [2] = - { - // first entry is volume label - 0x54, 0x49, 0x4E, 0x59, 0x55, 0x53, 0x42, 0x20, 0x4D, 0x53, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // second entry is readme file - 0x52, 0x45, 0x41, 0x44, 0x4D, 0x45, 0x20, 0x20, 0x54, 0x58, 0x54, 0x20, 0x00, 0xC6, 0x52, 0x6D, - 0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00, - sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's filesize - }, - - //------------- Readme Content -------------// - [3] = README_CONTENTS -}; - -ATTR_USB_MIN_ALIGNMENT -static uint8_t sector_buffer[DISK_BLOCK_SIZE] TUSB_CFG_ATTR_USBRAM; - -//--------------------------------------------------------------------+ -// IMPLEMENTATION -//--------------------------------------------------------------------+ -uint16_t tusbd_msc_read10_cb (uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) -{ - memcpy(sector_buffer, mscd_app_rommdisk[lba], DISK_BLOCK_SIZE); - (*pp_buffer) = sector_buffer; - - return 1; -} - -// Stall write10 as this is readonly disk -uint16_t tusbd_msc_write10_cb(uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) -{ - (*pp_buffer) = NULL; - - mscd_sense_data.sense_key = SCSI_SENSEKEY_DATA_PROTECT; // let host know that this is read-only disk - - return 0; -} - -#endif - diff --git a/demos/device/device_os_none/tusb_config.h b/demos/device/device_os_none/tusb_config.h deleted file mode 100644 index 527103091..000000000 --- a/demos/device/device_os_none/tusb_config.h +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************/ -/*! - @file tusb_config.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -/** \ingroup TBD - * \defgroup TBD - * \brief TBD - * - * @{ - */ - -#ifndef _TUSB_TUSB_CONFIG_H_ -#define _TUSB_TUSB_CONFIG_H_ - -#ifdef __cplusplus - extern "C" { -#endif - -//--------------------------------------------------------------------+ -// CONTROLLER CONFIGURATION -//--------------------------------------------------------------------+ -//#define TUSB_CFG_MCU will be passed from IDE for easy board/mcu switching - -#define TUSB_CFG_CONTROLLER_0_MODE (TUSB_MODE_DEVICE) -#define TUSB_CFG_CONTROLLER_1_MODE (TUSB_MODE_NONE) // TODO not yet tested - -//--------------------------------------------------------------------+ -// HOST CONFIGURATION -//--------------------------------------------------------------------+ -#define TUSB_CFG_HOST_DEVICE_MAX 1 -#define TUSB_CFG_CONFIGURATION_MAX 1 - -//------------- USBD -------------// -#define TUSB_CFG_HOST_ENUM_BUFFER_SIZE 256 - -//------------- CLASS -------------// -#define TUSB_CFG_HOST_HUB 0 -#define TUSB_CFG_HOST_HID_KEYBOARD 0 -#define TUSB_CFG_HOST_HID_MOUSE 0 -#define TUSB_CFG_HOST_HID_GENERIC 0 -#define TUSB_CFG_HOST_MSC 0 -#define TUSB_CFG_HOST_CDC 0 -#define TUSB_CFG_HOST_CDC_RNDIS 0 - -//--------------------------------------------------------------------+ -// DEVICE CONFIGURATION -//--------------------------------------------------------------------+ -#define TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE 64 // TODO refractor remove -#define TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT 4 - -#define TUSB_CFG_DEVICE_FULLSPEED 1 // TODO refractor, remove - -//------------- CLASS -------------// -#define TUSB_CFG_DEVICE_HID_KEYBOARD 0 -#define TUSB_CFG_DEVICE_HID_MOUSE 0 -#define TUSB_CFG_DEVICE_HID_GENERIC 0 -#define TUSB_CFG_DEVICE_MSC 1 -#define TUSB_CFG_DEVICE_CDC 1 - - - -//--------------------------------------------------------------------+ -// COMMON CONFIGURATION -//--------------------------------------------------------------------+ -#define TUSB_CFG_DEBUG 3 - -//#define TUSB_CFG_OS TUSB_OS_NONE // defined using eclipse build -//#define TUSB_CFG_OS_TASK_PRIO - -#define TUSB_CFG_OS_TICKS_PER_SECOND 1000 - -#ifdef __CODE_RED // make use of code red's support for ram region macros - #if (TUSB_CFG_MCU == MCU_LPC11UXX) || (TUSB_CFG_MCU == MCU_LPC13UXX) - #define TUSB_RAM_SECTION ".data.$RAM2" - #elif (TUSB_CFG_MCU == MCU_LPC43XX) - #define TUSB_RAM_SECTION ".data.$RAM3" - #elif (TUSB_CFG_MCU == MCU_LPC175X_6X) - #define TUSB_RAM_SECTION ".data.$RAM2" - #else - #error Please define USB RAM section - #endif - - #define TUSB_CFG_ATTR_USBRAM __attribute__ ((section(TUSB_RAM_SECTION))) - -#elif defined __CC_ARM // Compiled with Keil armcc - - #define TUSB_CFG_ATTR_USBRAM - -#elif __ICCARM__ // compiled with IAR - - #define TUSB_CFG_ATTR_USBRAM @ ".ahb_sram1" - -#else - - #error compiler not specified - -#endif - - -#ifdef __cplusplus - } -#endif - -#endif /* _TUSB_TUSB_CONFIG_H_ */ - -/** @} */ diff --git a/demos/device/device_os_none/tusb_descriptors.c b/demos/device/device_os_none/tusb_descriptors.c deleted file mode 100644 index 51088f324..000000000 --- a/demos/device/device_os_none/tusb_descriptors.c +++ /dev/null @@ -1,438 +0,0 @@ -/**************************************************************************/ -/*! - @file tusb_descriptors.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 "tusb_descriptors.h" - -#if TUSB_CFG_DEVICE_HID_KEYBOARD -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -uint8_t app_tusb_keyboard_desc_report[] = { - HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), - HID_USAGE ( HID_USAGE_DESKTOP_KEYBOARD ), - HID_COLLECTION ( HID_COLLECTION_APPLICATION ), - HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ), - HID_USAGE_MIN ( 224 ), - HID_USAGE_MAX ( 231 ), - HID_LOGICAL_MIN ( 0 ), - HID_LOGICAL_MAX ( 1 ), - - HID_REPORT_SIZE ( 1 ), - HID_REPORT_COUNT ( 8 ), /* 8 bits */ - HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* maskable modifier key */ - - HID_REPORT_SIZE ( 8 ), - HID_REPORT_COUNT ( 1 ), - HID_INPUT ( HID_CONSTANT ), /* reserved */ - - HID_USAGE_PAGE ( HID_USAGE_PAGE_LED ), - HID_USAGE_MIN ( 1 ), - HID_USAGE_MAX ( 5 ), - HID_REPORT_COUNT ( 5 ), - HID_REPORT_SIZE ( 1 ), - HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* 5-bit Led report */ - - HID_REPORT_SIZE ( 3 ), /* led padding */ - HID_REPORT_COUNT ( 1 ), - HID_OUTPUT ( HID_CONSTANT ), - - HID_USAGE_PAGE (HID_USAGE_PAGE_KEYBOARD), - HID_USAGE_MIN ( 0 ), - HID_USAGE_MAX ( 101 ), - HID_LOGICAL_MIN ( 0 ), - HID_LOGICAL_MAX ( 101 ), - - HID_REPORT_SIZE ( 8 ), - HID_REPORT_COUNT ( 6 ), - HID_INPUT ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ), /* keycodes array 6 items */ - HID_COLLECTION_END -}; -#endif - -#if TUSB_CFG_DEVICE_HID_MOUSE -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -uint8_t app_tusb_mouse_desc_report[] = { - HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), - HID_USAGE ( HID_USAGE_DESKTOP_MOUSE ), - HID_COLLECTION ( HID_COLLECTION_APPLICATION ), - HID_USAGE (HID_USAGE_DESKTOP_POINTER), - - HID_COLLECTION ( HID_COLLECTION_PHYSICAL ), - HID_USAGE_PAGE ( HID_USAGE_PAGE_BUTTON ), - HID_USAGE_MIN ( 1 ), - HID_USAGE_MAX ( 3 ), - HID_LOGICAL_MIN ( 0 ), - HID_LOGICAL_MAX ( 1 ), - - HID_REPORT_SIZE ( 1 ), - HID_REPORT_COUNT ( 3 ), /* Left, Right and Middle mouse*/ - HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), - - HID_REPORT_SIZE ( 5 ), - HID_REPORT_COUNT ( 1 ), - HID_INPUT ( HID_CONSTANT ), /* 5 bit padding followed 3 bit buttons */ - - HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), - HID_USAGE ( HID_USAGE_DESKTOP_X ), - HID_USAGE ( HID_USAGE_DESKTOP_Y ), - HID_LOGICAL_MIN ( 0x81 ), /* -127 */ - HID_LOGICAL_MAX ( 0x7f ), /* 127 */ - - HID_REPORT_SIZE ( 8 ), - HID_REPORT_COUNT ( 2 ), /* X, Y position */ - HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */ - - HID_USAGE ( HID_USAGE_DESKTOP_WHEEL ), /* mouse scroll */ - HID_LOGICAL_MIN ( 0x81 ), /* -127 */ - HID_LOGICAL_MAX ( 0x7f ), /* 127 */ - HID_REPORT_COUNT( 1 ), - HID_REPORT_SIZE ( 8 ), /* 8-bit value */ - HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */ - - HID_COLLECTION_END, - - HID_COLLECTION_END -}; -#endif - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -tusb_descriptor_device_t app_tusb_desc_device = -{ - .bLength = sizeof(tusb_descriptor_device_t), - .bDescriptorType = TUSB_DESC_TYPE_DEVICE, - .bcdUSB = 0x0200, - #if IAD_DESC_REQUIRED - // Multiple Interfaces Using Interface Association Descriptor (IAD) - // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) - .bDeviceClass = TUSB_CLASS_MISC, - .bDeviceSubClass = MISC_SUBCLASS_COMMON, - .bDeviceProtocol = MISC_PROTOCOL_IAD, - #else - .bDeviceClass = 0x00, - .bDeviceSubClass = 0x00, - .bDeviceProtocol = 0x00, - #endif - - .bMaxPacketSize0 = TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE, - - .idVendor = CFG_VENDORID, - .idProduct = CFG_PRODUCTID, - .bcdDevice = 0x0100, - - .iManufacturer = 0x01, - .iProduct = 0x02, - .iSerialNumber = 0x03, - - .bNumConfigurations = 0x01 // TODO multiple configurations -}; - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -app_descriptor_configuration_t app_tusb_desc_configuration = -{ - .configuration = - { - .bLength = sizeof(tusb_descriptor_configuration_t), - .bDescriptorType = TUSB_DESC_TYPE_CONFIGURATION, - - .wTotalLength = sizeof(app_descriptor_configuration_t), - .bNumInterfaces = TOTAL_INTEFACES, - - .bConfigurationValue = 1, - .iConfiguration = 0x00, - .bmAttributes = TUSB_DESC_CONFIG_ATT_BUS_POWER, - .bMaxPower = TUSB_DESC_CONFIG_POWER_MA(100) - }, - - #if IAD_DESC_REQUIRED - // IAD points to CDC Interfaces - .cdc_iad = - { - .bLength = sizeof(tusb_descriptor_interface_association_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_ASSOCIATION, - - .bFirstInterface = INTERFACE_NUM_CDC, - .bInterfaceCount = 2, - - .bFunctionClass = TUSB_CLASS_CDC, - .bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, - .bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND, - .iFunction = 0 - }, - #endif - - #if TUSB_CFG_DEVICE_CDC - //------------- CDC Communication Interface -------------// - .cdc_comm_interface = - { - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = INTERFACE_NUM_CDC, - .bAlternateSetting = 0, - .bNumEndpoints = 1, - .bInterfaceClass = TUSB_CLASS_CDC, - .bInterfaceSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, - .bInterfaceProtocol = CDC_COMM_PROTOCOL_ATCOMMAND, - .iInterface = 0x00 - }, - - .cdc_header = - { - .bLength = sizeof(cdc_desc_func_header_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, - .bDescriptorSubType = CDC_FUNC_DESC_HEADER, - .bcdCDC = 0x0120 - }, - - .cdc_acm = - { - .bLength = sizeof(cdc_desc_func_abstract_control_management_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, - .bDescriptorSubType = CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, - .bmCapabilities = { // 0x06 - .support_line_request = 1, - .support_send_break = 1 - } - }, - - .cdc_union = - { - .bLength = sizeof(cdc_desc_func_union_t), // plus number of - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, - .bDescriptorSubType = CDC_FUNC_DESC_UNION, - .bControlInterface = 0, - .bSubordinateInterface = 1, - }, - - .cdc_endpoint_notification = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = CDC_EDPT_NOTIFICATION_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, - .wMaxPacketSize = { .size = 0x08 }, - .bInterval = 0x0a - }, - - //------------- CDC Data Interface -------------// - .cdc_data_interface = - { - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = INTERFACE_NUM_CDC+1, - .bAlternateSetting = 0x00, - .bNumEndpoints = 2, - .bInterfaceClass = TUSB_CLASS_CDC_DATA, - .bInterfaceSubClass = 0, - .bInterfaceProtocol = 0, - .iInterface = 0x00 - }, - - .cdc_endpoint_out = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = CDC_EDPT_DATA_OUT_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_BULK }, - .wMaxPacketSize = { .size = CDC_EDPT_DATA_PACKETSIZE }, - .bInterval = 0 - }, - - .cdc_endpoint_in = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = CDC_EDPT_DATA_IN_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_BULK }, - .wMaxPacketSize = { .size = CDC_EDPT_DATA_PACKETSIZE }, - .bInterval = 0 - }, - #endif - - //------------- HID Keyboard -------------// - #if TUSB_CFG_DEVICE_HID_KEYBOARD - .keyboard_interface = - { - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = INTERFACE_NUM_HID_KEYBOARD, - .bAlternateSetting = 0x00, - .bNumEndpoints = 1, - .bInterfaceClass = TUSB_CLASS_HID, - .bInterfaceSubClass = HID_SUBCLASS_BOOT, - .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, - .iInterface = 0x00 - }, - - .keyboard_hid = - { - .bLength = sizeof(tusb_hid_descriptor_hid_t), - .bDescriptorType = HID_DESC_TYPE_HID, - .bcdHID = 0x0111, - .bCountryCode = HID_Local_NotSupported, - .bNumDescriptors = 1, - .bReportType = HID_DESC_TYPE_REPORT, - .wReportLength = sizeof(app_tusb_keyboard_desc_report) - }, - - .keyboard_endpoint = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = HID_KEYBOARD_EDPT_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, - .wMaxPacketSize = { .size = HID_KEYBOARD_EDPT_PACKETSIZE }, - .bInterval = 0x0A - }, - #endif - - //------------- HID Mouse -------------// - #if TUSB_CFG_DEVICE_HID_MOUSE - .mouse_interface = - { - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = INTERFACE_NUM_HID_MOUSE, - .bAlternateSetting = 0x00, - .bNumEndpoints = 1, - .bInterfaceClass = TUSB_CLASS_HID, - .bInterfaceSubClass = HID_SUBCLASS_BOOT, - .bInterfaceProtocol = HID_PROTOCOL_MOUSE, - .iInterface = 0x00 - }, - - .mouse_hid = - { - .bLength = sizeof(tusb_hid_descriptor_hid_t), - .bDescriptorType = HID_DESC_TYPE_HID, - .bcdHID = 0x0111, - .bCountryCode = HID_Local_NotSupported, - .bNumDescriptors = 1, - .bReportType = HID_DESC_TYPE_REPORT, - .wReportLength = sizeof(app_tusb_mouse_desc_report) - }, - - .mouse_endpoint = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = HID_MOUSE_EDPT_ADDR, // TODO - .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, - .wMaxPacketSize = { .size = HID_MOUSE_EDPT_PACKETSIZE }, - .bInterval = 0x0A - }, - #endif - - //------------- Mass Storage -------------// - #if TUSB_CFG_DEVICE_MSC - .msc_interface = - { - .bLength = sizeof(tusb_descriptor_interface_t), - .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = INTERFACE_NUM_MSC, - .bAlternateSetting = 0x00, - .bNumEndpoints = 2, - .bInterfaceClass = TUSB_CLASS_MSC, - .bInterfaceSubClass = MSC_SUBCLASS_SCSI, - .bInterfaceProtocol = MSC_PROTOCOL_BOT, - .iInterface = 0x00 - }, - - .msc_endpoint_in = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = MSC_EDPT_IN_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_BULK }, - .wMaxPacketSize = { .size = MSC_EDPT_PACKETSIZE }, - .bInterval = 1 - }, - - .msc_endpoint_out = - { - .bLength = sizeof(tusb_descriptor_endpoint_t), - .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = MSC_EDPT_OUT_ADDR, - .bmAttributes = { .xfer = TUSB_XFER_BULK }, - .wMaxPacketSize = { .size = MSC_EDPT_PACKETSIZE }, - .bInterval = 1 - }, - #endif -}; - -//--------------------------------------------------------------------+ -// STRING DESCRIPTORS -//--------------------------------------------------------------------+ -#define STRING_LEN_UNICODE(n) (2 + (2*(n))) // also includes 2 byte header - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -tusb_descriptor_string_t desc_str_language = -{ - .bLength = STRING_LEN_UNICODE(1), - .bDescriptorType = TUSB_DESC_TYPE_STRING, - .unicode_string = { 0x0409 } -}; - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -tusb_descriptor_string_t desc_str_manufacturer = -{ - .bLength = STRING_LEN_UNICODE(11), - .bDescriptorType = TUSB_DESC_TYPE_STRING, - .unicode_string = { 't', 'i', 'n', 'y', 'u', 's', 'b', '.', 'o', 'r', 'g' } // len = 11 -}; - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -tusb_descriptor_string_t desc_str_product = -{ - .bLength = STRING_LEN_UNICODE(14), - .bDescriptorType = TUSB_DESC_TYPE_STRING, - .unicode_string = { 't', 'i', 'n', 'y', 'u', 's', 'b', ' ', 'D', 'e', 'v', 'i', 'c', 'e' } // len = 14 -}; - -ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM -tusb_descriptor_string_t desc_str_serial = -{ - .bLength = STRING_LEN_UNICODE(4), - .bDescriptorType = TUSB_DESC_TYPE_STRING, - .unicode_string = { '1', '2', '3', '4' } // len = 4 -}; - -tusb_descriptor_string_t * const desc_str_table [TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT] = -{ - &desc_str_language, - &desc_str_manufacturer, - &desc_str_product, - &desc_str_serial -}; diff --git a/demos/device/device_os_none/tusb_descriptors.h b/demos/device/device_os_none/tusb_descriptors.h deleted file mode 100644 index 957661534..000000000 --- a/demos/device/device_os_none/tusb_descriptors.h +++ /dev/null @@ -1,193 +0,0 @@ -/**************************************************************************/ -/*! - @file tusb_descriptors.h - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2013, hathach (tinyusb.org) - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This file is part of the tinyusb stack. -*/ -/**************************************************************************/ - -#ifndef _TUSB_DESCRIPTORS_H_ -#define _TUSB_DESCRIPTORS_H_ - -#include "tusb.h" - -//--------------------------------------------------------------------+ -// Descriptors Value (calculated by enabled Classes) -//--------------------------------------------------------------------+ -#define CFG_VENDORID 0x1FC9 // NXP -//#define CFG_PRODUCTID 0x4567 // use auto product id to prevent conflict with pc's driver - -// each combination of interfaces need to have a unique productid, as windows will bind & remember device driver after the first plug. -#ifndef CFG_PRODUCTID // Auto ProductID layout's Bitmap: (MSB) MassStorage | Generic | Mouse | Key | CDC (LSB) - #define PRODUCTID_BITMAP(interface, n) ( (TUSB_CFG_DEVICE_##interface) << (n) ) - #define CFG_PRODUCTID (0x4000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \ - PRODUCTID_BITMAP(HID_MOUSE, 2) | PRODUCTID_BITMAP(HID_GENERIC, 3) | \ - PRODUCTID_BITMAP(MSC, 4) ) ) -#endif - - -#define INTERFACE_NUM_CDC 0 -#define INTERFACE_NUM_HID_KEYBOARD (INTERFACE_NUM_CDC + 2*TUSB_CFG_DEVICE_CDC ) -#define INTERFACE_NUM_HID_MOUSE (INTERFACE_NUM_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_KEYBOARD ) -#define INTERFACE_NUM_HID_GENERIC (INTERFACE_NUM_HID_MOUSE + TUSB_CFG_DEVICE_HID_MOUSE ) -#define INTERFACE_NUM_MSC (INTERFACE_NUM_HID_GENERIC + TUSB_CFG_DEVICE_HID_GENERIC ) - -#define TOTAL_INTEFACES (2*TUSB_CFG_DEVICE_CDC + TUSB_CFG_DEVICE_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_MOUSE + \ - TUSB_CFG_DEVICE_HID_GENERIC + TUSB_CFG_DEVICE_MSC) - -// Interface Assosication Descriptor is required when enable CDC -#define IAD_DESC_REQUIRED ( TUSB_CFG_DEVICE_CDC ) - -//--------------------------------------------------------------------+ -// Endpoints Address & Max Packet Size -//--------------------------------------------------------------------+ -#define EDPT_IN(x) (0x80 | (x)) -#define EDPT_OUT(x) (x) - -#if TUSB_CFG_MCU == MCU_LPC175X_6X -//------------- These MCUs's endpoint number has a fixed type -------------// -//------------- CDC -------------// -#define CDC_EDPT_NOTIFICATION_ADDR EDPT_IN (1) -#define CDC_EDPT_NOTIFICATION_PACKETSIZE 64 - -#define CDC_EDPT_DATA_OUT_ADDR EDPT_OUT(2) -#define CDC_EDPT_DATA_IN_ADDR EDPT_IN (2) -#define CDC_EDPT_DATA_PACKETSIZE 64 - -//------------- HID Keyboard -------------// -#define HID_KEYBOARD_EDPT_ADDR EDPT_IN (4) -#define HID_KEYBOARD_EDPT_PACKETSIZE 8 - -//------------- HID Mouse -------------// -#define HID_MOUSE_EDPT_ADDR EDPT_IN (7) -#define HID_MOUSE_EDPT_PACKETSIZE 8 - -//------------- HID Generic -------------// - -//------------- Mass Storage -------------// -#define MSC_EDPT_OUT_ADDR EDPT_OUT(5) -#define MSC_EDPT_IN_ADDR EDPT_IN (5) -#define MSC_EDPT_PACKETSIZE (TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512) - - -#else - -//------------- CDC -------------// -#define CDC_EDPT_NOTIFICATION_ADDR EDPT_IN (INTERFACE_NUM_CDC+1) -#define CDC_EDPT_NOTIFICATION_PACKETSIZE 64 - -#define CDC_EDPT_DATA_OUT_ADDR EDPT_OUT(INTERFACE_NUM_CDC+2) -#define CDC_EDPT_DATA_IN_ADDR EDPT_IN (INTERFACE_NUM_CDC+2) -#define CDC_EDPT_DATA_PACKETSIZE 64 - -//------------- HID Keyboard -------------// -#define HID_KEYBOARD_EDPT_ADDR EDPT_IN (INTERFACE_NUM_HID_KEYBOARD+1) -#define HID_KEYBOARD_EDPT_PACKETSIZE 8 - -//------------- HID Mouse -------------// -#define HID_MOUSE_EDPT_ADDR EDPT_IN (INTERFACE_NUM_HID_MOUSE+1) -#define HID_MOUSE_EDPT_PACKETSIZE 8 - -//------------- HID Generic -------------// - -//------------- Mass Storage -------------// -#define MSC_EDPT_OUT_ADDR EDPT_OUT(INTERFACE_NUM_MSC+1) -#define MSC_EDPT_IN_ADDR EDPT_IN (INTERFACE_NUM_MSC+1) -#define MSC_EDPT_PACKETSIZE (TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512) - -#endif - -//--------------------------------------------------------------------+ -// CONFIGURATION DESCRIPTOR -//--------------------------------------------------------------------+ -typedef ATTR_PACKED_STRUCT(struct) -{ - tusb_descriptor_configuration_t configuration; - - //------------- CDC -------------// -#if TUSB_CFG_DEVICE_CDC - #if IAD_DESC_REQUIRED - tusb_descriptor_interface_association_t cdc_iad; - #endif - - //CDC Control Interface - tusb_descriptor_interface_t cdc_comm_interface; - cdc_desc_func_header_t cdc_header; - cdc_desc_func_abstract_control_management_t cdc_acm; - cdc_desc_func_union_t cdc_union; - tusb_descriptor_endpoint_t cdc_endpoint_notification; - - //CDC Data Interface - tusb_descriptor_interface_t cdc_data_interface; - tusb_descriptor_endpoint_t cdc_endpoint_out; - tusb_descriptor_endpoint_t cdc_endpoint_in; -#endif - - //------------- HID Keyboard -------------// -#if TUSB_CFG_DEVICE_HID_KEYBOARD - tusb_descriptor_interface_t keyboard_interface; - tusb_hid_descriptor_hid_t keyboard_hid; - tusb_descriptor_endpoint_t keyboard_endpoint; -#endif - -//------------- HID Mouse -------------// -#if TUSB_CFG_DEVICE_HID_MOUSE - tusb_descriptor_interface_t mouse_interface; - tusb_hid_descriptor_hid_t mouse_hid; - tusb_descriptor_endpoint_t mouse_endpoint; -#endif - -//------------- Mass Storage -------------// -#if TUSB_CFG_DEVICE_MSC - tusb_descriptor_interface_t msc_interface; - tusb_descriptor_endpoint_t msc_endpoint_in; - tusb_descriptor_endpoint_t msc_endpoint_out; -#endif - -} app_descriptor_configuration_t; - -//--------------------------------------------------------------------+ -// STRINGS DESCRIPTOR -//--------------------------------------------------------------------+ -tusb_descriptor_string_t * const desc_str_table[TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT]; - -//--------------------------------------------------------------------+ -// Export descriptors -//--------------------------------------------------------------------+ -extern tusb_descriptor_device_t app_tusb_desc_device; -extern app_descriptor_configuration_t app_tusb_desc_configuration; - -extern uint8_t app_tusb_keyboard_desc_report[]; -extern uint8_t app_tusb_mouse_desc_report[]; - -#endif diff --git a/demos/device/src/cdcd_app.c b/demos/device/src/cdcd_app.c new file mode 100644 index 000000000..44e06ddf4 --- /dev/null +++ b/demos/device/src/cdcd_app.c @@ -0,0 +1,151 @@ +/**************************************************************************/ +/*! + @file cdcd_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 "cdcd_app.h" + +#if TUSB_CFG_DEVICE_CDC + +#include "common/fifo.h" // TODO refractor + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +enum { + CDCD_APP_BUFFER_SIZE = 64 +}; + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ +OSAL_TASK_DEF(cdcd_serial_app_task, 128, CDCD_SERIAL_APP_TASK_PRIO); +OSAL_SEM_DEF(cdcd_semaphore); + +static osal_semaphore_handle_t sem_hdl; + +ATTR_USB_MIN_ALIGNMENT static uint8_t serial_rx_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM; +ATTR_USB_MIN_ALIGNMENT static uint8_t serial_tx_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM; + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +FIFO_DEF(fifo_serial, CDCD_APP_BUFFER_SIZE, uint8_t, true); + +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ +void cdcd_serial_app_init(void) +{ + sem_hdl = osal_semaphore_create( OSAL_SEM_REF(cdcd_semaphore) ); + ASSERT_PTR( sem_hdl, VOID_RETURN); + + ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(cdcd_serial_app_task) ), VOID_RETURN); +} + +void tusbd_cdc_mounted_cb(uint8_t coreid) +{ + osal_semaphore_reset(sem_hdl); + + tusbd_cdc_receive(coreid, serial_rx_buffer, CDCD_APP_BUFFER_SIZE, true); +} + +void tusbd_cdc_xfer_cb(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes) +{ + switch ( pipe_id ) + { + case CDC_PIPE_DATA_OUT: + switch(event) + { + case TUSB_EVENT_XFER_COMPLETE: + for(uint8_t i=0; i +#include +#include + +#include "boards/board.h" +#include "tusb.h" + +#include "mscd_app.h" +#include "keyboardd_app.h" +#include "moused_app.h" +#include "cdcd_app.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para); +OSAL_TASK_DEF(led_blinking_task, 128, LED_BLINKING_APP_TASK_PRIO); + +void print_greeting(void); + +#if TUSB_CFG_OS == TUSB_OS_NONE +// like a real RTOS, this function is a main loop invoking each task in application and never return +void os_none_start_scheduler(void) +{ + while (1) + { + tusb_task_runner(); + led_blinking_task(NULL); + + keyboardd_app_task(NULL); + moused_app_task(NULL); + cdcd_serial_app_task(NULL); + } +} +#endif + +int main(void) +{ + board_init(); + print_greeting(); + + tusb_init(); + + //------------- application task init -------------// + (void) osal_task_create( OSAL_TASK_REF(led_blinking_task) ); + + msc_dev_app_init(); + keyboardd_app_init(); + moused_app_init(); + cdcd_serial_app_init(); + + //------------- start OS scheduler (never return) -------------// +#if TUSB_CFG_OS == TUSB_OS_FREERTOS + vTaskStartScheduler(); +#elif TUSB_CFG_OS == TUSB_OS_NONE + os_none_start_scheduler(); +#elif TUSB_CFG_OS == TUSB_OS_CMSIS_RTX + while(1) + { + osDelay(osWaitForever); // CMSIS RTX osKernelStart already started, main() is a task + } +#else + #error need to start RTOS schduler +#endif + + while(1) { } // should not reach here + + return 0; +} + +//--------------------------------------------------------------------+ +// BLINKING TASK +//--------------------------------------------------------------------+ +static uint32_t led_blink_interval_ms = 1000; // default is 1 seconda +void led_blinking_set_interval(uint32_t ms) +{ + led_blink_interval_ms = ms; +} + +OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para) +{ + OSAL_TASK_LOOP_BEGIN + + static uint32_t led_on_mask = 0; + + osal_task_delay(led_blink_interval_ms); + + board_leds(led_on_mask, 1 - led_on_mask); + led_on_mask = 1 - led_on_mask; // toggle + + OSAL_TASK_LOOP_END +} + +//--------------------------------------------------------------------+ +// HELPER FUNCTION +//--------------------------------------------------------------------+ +void print_greeting(void) +{ + printf("\n\ +--------------------------------------------------------------------\n\ +- Device Demo (a tinyusb example)\n\ +- if you find any bugs or get any questions, feel free to file an\n\ +- issue at https://github.com/hathach/tinyusb\n\ +--------------------------------------------------------------------\n\n" + ); + + puts("This demo supports the following classes"); + if (TUSB_CFG_DEVICE_HID_MOUSE ) puts(" - HID Mouse"); + if (TUSB_CFG_DEVICE_HID_KEYBOARD ) puts(" - HID Keyboard"); + if (TUSB_CFG_DEVICE_MSC ) puts(" - Mass Storage"); + if (TUSB_CFG_DEVICE_CDC ) puts(" - Communication Device Class"); +} diff --git a/demos/device/src/moused_app.c b/demos/device/src/moused_app.c new file mode 100644 index 000000000..dd6600131 --- /dev/null +++ b/demos/device/src/moused_app.c @@ -0,0 +1,124 @@ +/**************************************************************************/ +/*! + @file moused_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 "moused_app.h" + +#if TUSB_CFG_DEVICE_HID_MOUSE +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +OSAL_TASK_DEF(moused_app_task, 128, MOUSED_APP_TASK_PRIO); + +ATTR_USB_MIN_ALIGNMENT hid_mouse_report_t mouse_report TUSB_CFG_ATTR_USBRAM; + +static uint8_t moused_report_count; // number of reports sent each mounted + +//--------------------------------------------------------------------+ +// tinyusb Callbacks +//--------------------------------------------------------------------+ +void tusbd_hid_mouse_mounted_cb(uint8_t coreid) +{ + moused_report_count = 0; +} + +void tusbd_hid_mouse_unmounted_cb(uint8_t coreid) +{ + +} + +void tusbd_hid_mouse_cb(uint8_t coreid, tusb_event_t event, uint32_t xferred_bytes) +{ + switch(event) + { + case TUSB_EVENT_XFER_COMPLETE: + case TUSB_EVENT_XFER_ERROR: + case TUSB_EVENT_XFER_STALLED: + default: break; + } +} + +uint16_t tusbd_hid_mouse_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report, uint16_t requested_length) +{ + if ( report_type != HID_REQUEST_REPORT_INPUT ) return 0; // not support other report type for this mouse demo + + (*pp_report) = &mouse_report; + return requested_length; +} + +void tusbd_hid_mouse_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t report_data[], uint16_t length) +{ + // mouse demo does not support set report --> return 0 will result in rejecting (STALL) this request + return 0; +} +//--------------------------------------------------------------------+ +// APPLICATION CODE +//--------------------------------------------------------------------+ +void moused_app_init(void) +{ + ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(moused_app_task) ), VOID_RETURN); +} + +OSAL_TASK_FUNCTION( moused_app_task ) (void* p_task_para) +{ + OSAL_TASK_LOOP_BEGIN + + // only send 5 reports + if (tusbd_is_configured(0) && (moused_report_count++ < 5) ) + { + if ( !tusbd_hid_mouse_is_busy(0) ) + { + mouse_report.x = mouse_report.y = 20; + tusbd_hid_mouse_send(0, &mouse_report ); + } + } + + osal_task_delay(1000); + + OSAL_TASK_LOOP_END +} + +#endif + diff --git a/demos/device/src/moused_app.h b/demos/device/src/moused_app.h new file mode 100644 index 000000000..2b49d4373 --- /dev/null +++ b/demos/device/src/moused_app.h @@ -0,0 +1,74 @@ +/**************************************************************************/ +/*! + @file moused_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_MOUSED_APP_H_ +#define _TUSB_MOUSED_APP_H_ + +#include "boards/board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_DEVICE_HID_MOUSE + +void moused_app_init(void); +OSAL_TASK_FUNCTION( moused_app_task ) (void* p_task_para); + +#else + +#define moused_app_init() +#define moused_app_task(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MOUSED_APP_H_ */ + +/** @} */ diff --git a/demos/device/src/mscd_app.c b/demos/device/src/mscd_app.c new file mode 100644 index 000000000..755153458 --- /dev/null +++ b/demos/device/src/mscd_app.c @@ -0,0 +1,164 @@ +/**************************************************************************/ +/*! + @file mscd_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 "mscd_app.h" + +#if TUSB_CFG_DEVICE_MSC +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ +ATTR_USB_MIN_ALIGNMENT +static scsi_inquiry_data_t mscd_inquiry_data TUSB_CFG_ATTR_USBRAM = +{ + .is_removable = 1, + .version = 2, + .response_data_format = 2, + .vendor_id = "tinyusb", + .product_id = "MSC Example", + .product_revision = "0.01" +}; + +ATTR_USB_MIN_ALIGNMENT +static scsi_read_capacity10_data_t mscd_read_capacity10_data TUSB_CFG_ATTR_USBRAM = +{ + .last_lba = __n2be(DISK_BLOCK_NUM-1), // read capacity + .block_size = __n2be(DISK_BLOCK_SIZE) +}; + +ATTR_USB_MIN_ALIGNMENT +scsi_sense_fixed_data_t mscd_sense_data TUSB_CFG_ATTR_USBRAM = +{ + .response_code = 0x70, + .sense_key = 0, // no errors + .additional_sense_len = sizeof(scsi_sense_fixed_data_t) - 8 +}; + +ATTR_USB_MIN_ALIGNMENT +static scsi_read_format_capacity_data_t mscd_format_capacity_data TUSB_CFG_ATTR_USBRAM = +{ + .list_length = 8, + .block_num = __n2be(DISK_BLOCK_NUM), // write capacity + .descriptor_type = 2, // TODO formatted media, refractor to const + .block_size_u16 = __n2be_16(DISK_BLOCK_SIZE) +}; + +ATTR_USB_MIN_ALIGNMENT +static scsi_mode_parameters_t msc_dev_mode_para TUSB_CFG_ATTR_USBRAM = +{ + .mode_data_length = 3, + .medium_type = 0, + .device_specific_para = 0, + .block_descriptor_length = 0 +}; + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// tinyusb callback (ISR context) +//--------------------------------------------------------------------+ +msc_csw_status_t tusbd_msc_scsi_received_isr (uint8_t coreid, uint8_t lun, uint8_t scsi_cmd[16], void ** pp_buffer, uint16_t* p_length) +{ + // read10 & write10 has their own callback and MUST not be handled here + switch (scsi_cmd[0]) + { + case SCSI_CMD_INQUIRY: + (*pp_buffer) = &mscd_inquiry_data; + (*p_length) = sizeof(scsi_inquiry_data_t); + break; + + case SCSI_CMD_READ_CAPACITY_10: + (*pp_buffer) = &mscd_read_capacity10_data; + (*p_length) = sizeof(scsi_read_capacity10_data_t); + break; + + case SCSI_CMD_REQUEST_SENSE: + (*pp_buffer) = &mscd_sense_data; + (*p_length) = sizeof(scsi_sense_fixed_data_t); + break; + + case SCSI_CMD_READ_FORMAT_CAPACITY: + (*pp_buffer) = &mscd_format_capacity_data; + (*p_length) = sizeof(scsi_read_format_capacity_data_t); + break; + + case SCSI_CMD_MODE_SENSE_6: + (*pp_buffer) = &msc_dev_mode_para; + (*p_length) = sizeof(msc_dev_mode_para); + break; + + case SCSI_CMD_TEST_UNIT_READY: + (*pp_buffer) = NULL; + (*p_length) = 0; + break; + + case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: + (*pp_buffer) = NULL; + (*p_length) = 0; + break; + + default: return MSC_CSW_STATUS_FAILED; + } + + //------------- clear sense data if it is not request sense command -------------// + if ( SCSI_CMD_REQUEST_SENSE != scsi_cmd[0] ) + { + mscd_sense_data.sense_key = SCSI_SENSEKEY_NONE; + mscd_sense_data.additional_sense_code = 0; + mscd_sense_data.additional_sense_qualifier = 0; + } + + return MSC_CSW_STATUS_PASSED; +} + +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ + +void msc_dev_app_init (void) +{ + +} + + +#endif diff --git a/demos/device/src/mscd_app.h b/demos/device/src/mscd_app.h new file mode 100644 index 000000000..f9f1d20bc --- /dev/null +++ b/demos/device/src/mscd_app.h @@ -0,0 +1,93 @@ +/**************************************************************************/ +/*! + @file mscd_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_MSCD_APP_H_ +#define _TUSB_MSCD_APP_H_ + +#include "boards/board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_DEVICE_MSC + +enum +{ + DISK_BLOCK_NUM = 16, // 8KB is the smallest size that windows allow to mount + DISK_BLOCK_SIZE = 512 +}; + +#define README_CONTENTS \ +"This is tinyusb's MassStorage Class demo.\r\n\r\n\ +If you find any bugs or get any questions, feel free to file an\r\n\ +issue at github.com/hathach/tinyusb" + +#if TUSB_CFG_MCU==MCU_LPC11UXX || TUSB_CFG_MCU==MCU_LPC13UXX + #define MSCD_APP_ROMDISK +#else // defaults is ram disk + #define MSCD_APP_RAMDISK +#endif + +void msc_dev_app_init(void); +OSAL_TASK_FUNCTION( msc_dev_app_task ) (void* p_task_para); + +extern scsi_sense_fixed_data_t mscd_sense_data; + +#else + +#define msc_dev_app_init() +#define msc_dev_app_task(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MSCD_APP_H_ */ + +/** @} */ diff --git a/demos/device/src/mscd_app_ramdisk.c b/demos/device/src/mscd_app_ramdisk.c new file mode 100644 index 000000000..e78ac4030 --- /dev/null +++ b/demos/device/src/mscd_app_ramdisk.c @@ -0,0 +1,236 @@ +/**************************************************************************/ +/*! + @file mscd_app_ramdisk.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 "mscd_app.h" + +#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_RAMDISK) + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +ATTR_USB_MIN_ALIGNMENT +uint8_t mscd_app_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] TUSB_CFG_ATTR_USBRAM = +{ + //------------- Boot Sector -------------// + // byte_per_sector = DISK_BLOCK_SIZE; fat12_sector_num_16 = DISK_BLOCK_NUM; + // sector_per_cluster = 1; reserved_sectors = 1; + // fat_num = 1; fat12_root_entry_num = 16; + // sector_per_fat = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0; + // drive_number = 0x80; media_type = 0xf8; extended_boot_signature = 0x29; + // filesystem_type = "FAT12 "; volume_serial_number = 0x1234; volume_label = "tinyusb msc"; + [0] = + { + 0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00, + 0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 0x74, 0x69, 0x6E, 0x79, 0x75, + 0x73, 0x62, 0x20, 0x6D, 0x73, 0x63, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00, + [510] = 0x55, [511] = 0xAA // FAT magic code + }, + + //------------- FAT12 Table -------------// + [1] = + { + 0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file + }, + + //------------- Root Directory -------------// + [2] = + { + // first entry is volume label + 0x54, 0x49, 0x4E, 0x59, 0x55, 0x53, 0x42, 0x20, 0x4D, 0x53, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // second entry is readme file + 'R' , 'E' , 'A' , 'D' , 'M' , 'E' , ' ' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D, + 0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00, + sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's filesize (4 Bytes) + }, + + //------------- Readme Content -------------// + [3] = README_CONTENTS +}; + +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ +uint16_t tusbd_msc_read10_cb (uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + (*pp_buffer) = mscd_app_ramdisk[lba]; + + return min16_of(block_count, DISK_BLOCK_NUM); +} +uint16_t tusbd_msc_write10_cb(uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + (*pp_buffer) = mscd_app_ramdisk[lba]; + + return min16_of(block_count, DISK_BLOCK_NUM); +} + +//--------------------------------------------------------------------+ +// HELPER +//--------------------------------------------------------------------+ + +#if 0 // no need to use fat12 helper +typedef ATTR_PACKED_STRUCT(struct) { + //------------- common -------------// + uint8_t jump_code[3] ; ///< Assembly instruction to jump to boot code. + uint8_t oem_name[8] ; ///< OEM Name in ASCII. + uint16_t byte_per_sector ; ///< Bytes per sector. Allowed values include 512, 1024, 2048, and 4096. + uint8_t sector_per_cluster ; ///< Sectors per cluster (data unit). Allowed values are powers of 2, but the cluster size must be 32KB or smaller. + uint16_t reserved_sectors ; ///< Size in sectors of the reserved area. + uint8_t fat_num ; ///< Number of FATs. Typically two for redundancy, but according to Microsoft it can be one for some small storage devices. + uint16_t fat12_root_entry_num ; ///< Maximum number of files in the root directory for FAT12 and FAT16. This is 0 for FAT32 and typically 512 for FAT16. + uint16_t fat12_sector_num_16 ; ///< 16-bit number of sectors in file system. If the number of sectors is larger than can be represented in this 2-byte value, a 4-byte value exists later in the data structure and this should be 0. + uint8_t media_type ; ///< 0xf8 should be used for fixed disks and 0xf0 for removable. + uint16_t sector_per_fat ; ///< 16-bit size in sectors of each FAT for FAT12 and FAT16. For FAT32, this field is 0. + uint16_t sector_per_track ; ///< Sectors per track of storage device. + uint16_t head_num ; ///< Number of heads in storage device. + uint32_t hidden_sectors ; ///< Number of sectors before the start of partition. + uint32_t sector_num_32 ; ///< 32-bit value of number of sectors in file system. Either this value or the 16-bit value above must be 0. + + //------------- FAT32 -------------// + uint8_t drive_number ; ///< Physical drive number (0x00 for (first) removable media, 0x80 for (first) fixed disk + uint8_t reserved ; + uint8_t extended_boot_signature ; ///< should be 0x29 + uint32_t volume_serial_number ; ///< Volume serial number, which some versions of Windows will calculate based on the creation date and time. + uint8_t volume_label[11] ; + uint8_t filesystem_type[8] ; ///< File system type label in ASCII, padded with blank (0x20). Standard values include "FAT," "FAT12," and "FAT16," but nothing is required. + uint8_t reserved2[448] ; + uint16_t fat_signature ; ///< Signature value (0xAA55). +}fat12_boot_sector_t; + +STATIC_ASSERT(sizeof(fat12_boot_sector_t) == 512, "size is not correct"); + +typedef ATTR_PACKED_STRUCT(struct) { + uint8_t name[11]; + + ATTR_PACKED_STRUCT(struct){ + uint8_t readonly : 1; + uint8_t hidden : 1; + uint8_t system : 1; + uint8_t volume_label : 1; + uint8_t directory : 1; + uint8_t archive : 1; + } attr; // Long File Name = 0x0f + + uint8_t reserved; + uint8_t created_time_tenths_of_seconds; + uint16_t created_time; + uint16_t created_date; + uint16_t accessed_date; + uint16_t cluster_high; + uint16_t written_time; + uint16_t written_date; + uint16_t cluster_low; + uint32_t file_size; +}fat_directory_t; + +STATIC_ASSERT(sizeof(fat_directory_t) == 32, "size is not correct"); + +void fat12_fs_init(uint8_t mscd_app_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE]) +{ + uint8_t const readme_contents[] = +"This is tinyusb's MassStorage Class demo.\r\n\r\n\ +If you find any bugs or get any questions, feel free to file an\r\n\ +issue at https://github.com/hathach/tinyusb"; + + //------------- Boot Sector -------------// + fat12_boot_sector_t* p_boot_fat = (fat12_boot_sector_t* ) mscd_app_ramdisk[0]; + memclr_(p_boot_fat, sizeof(fat12_boot_sector_t)); + + memcpy(p_boot_fat->jump_code, "\xEB\x3C\x90", 3); + memcpy(p_boot_fat->oem_name, "MSDOS5.0", 8); + p_boot_fat->byte_per_sector = DISK_BLOCK_SIZE; + p_boot_fat->sector_per_cluster = 1; + p_boot_fat->reserved_sectors = 1; + p_boot_fat->fat_num = 1; + p_boot_fat->fat12_root_entry_num = 16; + p_boot_fat->fat12_sector_num_16 = DISK_BLOCK_NUM; + p_boot_fat->media_type = 0xf8; // fixed disk + p_boot_fat->sector_per_fat = 1; + p_boot_fat->sector_per_track = 1; + p_boot_fat->head_num = 1; + p_boot_fat->hidden_sectors = 0; + + p_boot_fat->drive_number = 0x80; + p_boot_fat->extended_boot_signature = 0x29; + p_boot_fat->volume_serial_number = 0x1234; + memcpy(p_boot_fat->volume_label , "tinyusb msc", 11); + memcpy(p_boot_fat->filesystem_type, "FAT12 ", 8); + p_boot_fat->fat_signature = 0xAA55; + + //------------- FAT12 Table (first 2 entries are F8FF, third entry is cluster end of readme file-------------// + memcpy(mscd_app_ramdisk[1], "\xF8\xFF\xFF\xFF\x0F", 5); + + //------------- Root Directory -------------// + fat_directory_t* p_entry = (fat_directory_t*) mscd_app_ramdisk[2]; + + // first entry is volume label + (*p_entry) = (fat_directory_t) + { + .name = "TINYUSB MSC", + .attr.volume_label = 1, + }; + + p_entry += 1; // advance to second entry, second entry is readme file + (*p_entry) = (fat_directory_t) + { + .name = "README TXT", + + .created_time = 0x6D52, + .written_time = 0x6D52, + + .created_date = 0x4365, + .accessed_date = 0x4365, + .written_date = 0x4365, + + .cluster_high = 0, + .cluster_low = 2, + .file_size = sizeof(readme_contents)-1 // exculde NULL + }; // first entry is volume label + + //------------- Readme Content -------------// + memcpy(mscd_app_ramdisk[3], readme_contents, sizeof(readme_contents)-1); + +} +#endif + +#endif diff --git a/demos/device/src/mscd_app_romdisk.c b/demos/device/src/mscd_app_romdisk.c new file mode 100644 index 000000000..751800f02 --- /dev/null +++ b/demos/device/src/mscd_app_romdisk.c @@ -0,0 +1,119 @@ +/**************************************************************************/ +/*! + @file mscd_app_romdisk.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 "mscd_app.h" + +#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_ROMDISK) + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +const uint8_t mscd_app_rommdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = +{ + //------------- Boot Sector -------------// + // byte_per_sector = DISK_BLOCK_SIZE; fat12_sector_num_16 = DISK_BLOCK_NUM; + // sector_per_cluster = 1; reserved_sectors = 1; + // fat_num = 1; fat12_root_entry_num = 16; + // sector_per_fat = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0; + // drive_number = 0x80; media_type = 0xf8; extended_boot_signature = 0x29; + // filesystem_type = "FAT12 "; volume_serial_number = 0x1234; volume_label = "tinyusb msc"; + [0] = + { + 0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00, + 0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 0x74, 0x69, 0x6E, 0x79, 0x75, + 0x73, 0x62, 0x20, 0x6D, 0x73, 0x63, 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00, + [510] = 0x55, [511] = 0xAA // FAT magic code + }, + + //------------- FAT12 Table -------------// + [1] = + { + 0xF8, 0xFF, 0xFF, 0xFF, 0x0F // first 2 entries must be F8FF, third entry is cluster end of readme file + }, + + //------------- Root Directory -------------// + [2] = + { + // first entry is volume label + 0x54, 0x49, 0x4E, 0x59, 0x55, 0x53, 0x42, 0x20, 0x4D, 0x53, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // second entry is readme file + 0x52, 0x45, 0x41, 0x44, 0x4D, 0x45, 0x20, 0x20, 0x54, 0x58, 0x54, 0x20, 0x00, 0xC6, 0x52, 0x6D, + 0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00, + sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's filesize + }, + + //------------- Readme Content -------------// + [3] = README_CONTENTS +}; + +ATTR_USB_MIN_ALIGNMENT +static uint8_t sector_buffer[DISK_BLOCK_SIZE] TUSB_CFG_ATTR_USBRAM; + +//--------------------------------------------------------------------+ +// IMPLEMENTATION +//--------------------------------------------------------------------+ +uint16_t tusbd_msc_read10_cb (uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + memcpy(sector_buffer, mscd_app_rommdisk[lba], DISK_BLOCK_SIZE); + (*pp_buffer) = sector_buffer; + + return 1; +} + +// Stall write10 as this is readonly disk +uint16_t tusbd_msc_write10_cb(uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + (*pp_buffer) = NULL; + + mscd_sense_data.sense_key = SCSI_SENSEKEY_DATA_PROTECT; // let host know that this is read-only disk + + return 0; +} + +#endif + diff --git a/demos/device/src/tusb_config.h b/demos/device/src/tusb_config.h new file mode 100644 index 000000000..527103091 --- /dev/null +++ b/demos/device/src/tusb_config.h @@ -0,0 +1,140 @@ +/**************************************************************************/ +/*! + @file tusb_config.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +/** \ingroup TBD + * \defgroup TBD + * \brief TBD + * + * @{ + */ + +#ifndef _TUSB_TUSB_CONFIG_H_ +#define _TUSB_TUSB_CONFIG_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +//--------------------------------------------------------------------+ +// CONTROLLER CONFIGURATION +//--------------------------------------------------------------------+ +//#define TUSB_CFG_MCU will be passed from IDE for easy board/mcu switching + +#define TUSB_CFG_CONTROLLER_0_MODE (TUSB_MODE_DEVICE) +#define TUSB_CFG_CONTROLLER_1_MODE (TUSB_MODE_NONE) // TODO not yet tested + +//--------------------------------------------------------------------+ +// HOST CONFIGURATION +//--------------------------------------------------------------------+ +#define TUSB_CFG_HOST_DEVICE_MAX 1 +#define TUSB_CFG_CONFIGURATION_MAX 1 + +//------------- USBD -------------// +#define TUSB_CFG_HOST_ENUM_BUFFER_SIZE 256 + +//------------- CLASS -------------// +#define TUSB_CFG_HOST_HUB 0 +#define TUSB_CFG_HOST_HID_KEYBOARD 0 +#define TUSB_CFG_HOST_HID_MOUSE 0 +#define TUSB_CFG_HOST_HID_GENERIC 0 +#define TUSB_CFG_HOST_MSC 0 +#define TUSB_CFG_HOST_CDC 0 +#define TUSB_CFG_HOST_CDC_RNDIS 0 + +//--------------------------------------------------------------------+ +// DEVICE CONFIGURATION +//--------------------------------------------------------------------+ +#define TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE 64 // TODO refractor remove +#define TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT 4 + +#define TUSB_CFG_DEVICE_FULLSPEED 1 // TODO refractor, remove + +//------------- CLASS -------------// +#define TUSB_CFG_DEVICE_HID_KEYBOARD 0 +#define TUSB_CFG_DEVICE_HID_MOUSE 0 +#define TUSB_CFG_DEVICE_HID_GENERIC 0 +#define TUSB_CFG_DEVICE_MSC 1 +#define TUSB_CFG_DEVICE_CDC 1 + + + +//--------------------------------------------------------------------+ +// COMMON CONFIGURATION +//--------------------------------------------------------------------+ +#define TUSB_CFG_DEBUG 3 + +//#define TUSB_CFG_OS TUSB_OS_NONE // defined using eclipse build +//#define TUSB_CFG_OS_TASK_PRIO + +#define TUSB_CFG_OS_TICKS_PER_SECOND 1000 + +#ifdef __CODE_RED // make use of code red's support for ram region macros + #if (TUSB_CFG_MCU == MCU_LPC11UXX) || (TUSB_CFG_MCU == MCU_LPC13UXX) + #define TUSB_RAM_SECTION ".data.$RAM2" + #elif (TUSB_CFG_MCU == MCU_LPC43XX) + #define TUSB_RAM_SECTION ".data.$RAM3" + #elif (TUSB_CFG_MCU == MCU_LPC175X_6X) + #define TUSB_RAM_SECTION ".data.$RAM2" + #else + #error Please define USB RAM section + #endif + + #define TUSB_CFG_ATTR_USBRAM __attribute__ ((section(TUSB_RAM_SECTION))) + +#elif defined __CC_ARM // Compiled with Keil armcc + + #define TUSB_CFG_ATTR_USBRAM + +#elif __ICCARM__ // compiled with IAR + + #define TUSB_CFG_ATTR_USBRAM @ ".ahb_sram1" + +#else + + #error compiler not specified + +#endif + + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_TUSB_CONFIG_H_ */ + +/** @} */ diff --git a/demos/device/src/tusb_descriptors.c b/demos/device/src/tusb_descriptors.c new file mode 100644 index 000000000..51088f324 --- /dev/null +++ b/demos/device/src/tusb_descriptors.c @@ -0,0 +1,438 @@ +/**************************************************************************/ +/*! + @file tusb_descriptors.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 "tusb_descriptors.h" + +#if TUSB_CFG_DEVICE_HID_KEYBOARD +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +uint8_t app_tusb_keyboard_desc_report[] = { + HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), + HID_USAGE ( HID_USAGE_DESKTOP_KEYBOARD ), + HID_COLLECTION ( HID_COLLECTION_APPLICATION ), + HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD ), + HID_USAGE_MIN ( 224 ), + HID_USAGE_MAX ( 231 ), + HID_LOGICAL_MIN ( 0 ), + HID_LOGICAL_MAX ( 1 ), + + HID_REPORT_SIZE ( 1 ), + HID_REPORT_COUNT ( 8 ), /* 8 bits */ + HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* maskable modifier key */ + + HID_REPORT_SIZE ( 8 ), + HID_REPORT_COUNT ( 1 ), + HID_INPUT ( HID_CONSTANT ), /* reserved */ + + HID_USAGE_PAGE ( HID_USAGE_PAGE_LED ), + HID_USAGE_MIN ( 1 ), + HID_USAGE_MAX ( 5 ), + HID_REPORT_COUNT ( 5 ), + HID_REPORT_SIZE ( 1 ), + HID_OUTPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), /* 5-bit Led report */ + + HID_REPORT_SIZE ( 3 ), /* led padding */ + HID_REPORT_COUNT ( 1 ), + HID_OUTPUT ( HID_CONSTANT ), + + HID_USAGE_PAGE (HID_USAGE_PAGE_KEYBOARD), + HID_USAGE_MIN ( 0 ), + HID_USAGE_MAX ( 101 ), + HID_LOGICAL_MIN ( 0 ), + HID_LOGICAL_MAX ( 101 ), + + HID_REPORT_SIZE ( 8 ), + HID_REPORT_COUNT ( 6 ), + HID_INPUT ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ), /* keycodes array 6 items */ + HID_COLLECTION_END +}; +#endif + +#if TUSB_CFG_DEVICE_HID_MOUSE +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +uint8_t app_tusb_mouse_desc_report[] = { + HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), + HID_USAGE ( HID_USAGE_DESKTOP_MOUSE ), + HID_COLLECTION ( HID_COLLECTION_APPLICATION ), + HID_USAGE (HID_USAGE_DESKTOP_POINTER), + + HID_COLLECTION ( HID_COLLECTION_PHYSICAL ), + HID_USAGE_PAGE ( HID_USAGE_PAGE_BUTTON ), + HID_USAGE_MIN ( 1 ), + HID_USAGE_MAX ( 3 ), + HID_LOGICAL_MIN ( 0 ), + HID_LOGICAL_MAX ( 1 ), + + HID_REPORT_SIZE ( 1 ), + HID_REPORT_COUNT ( 3 ), /* Left, Right and Middle mouse*/ + HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), + + HID_REPORT_SIZE ( 5 ), + HID_REPORT_COUNT ( 1 ), + HID_INPUT ( HID_CONSTANT ), /* 5 bit padding followed 3 bit buttons */ + + HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ), + HID_USAGE ( HID_USAGE_DESKTOP_X ), + HID_USAGE ( HID_USAGE_DESKTOP_Y ), + HID_LOGICAL_MIN ( 0x81 ), /* -127 */ + HID_LOGICAL_MAX ( 0x7f ), /* 127 */ + + HID_REPORT_SIZE ( 8 ), + HID_REPORT_COUNT ( 2 ), /* X, Y position */ + HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */ + + HID_USAGE ( HID_USAGE_DESKTOP_WHEEL ), /* mouse scroll */ + HID_LOGICAL_MIN ( 0x81 ), /* -127 */ + HID_LOGICAL_MAX ( 0x7f ), /* 127 */ + HID_REPORT_COUNT( 1 ), + HID_REPORT_SIZE ( 8 ), /* 8-bit value */ + HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */ + + HID_COLLECTION_END, + + HID_COLLECTION_END +}; +#endif + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +tusb_descriptor_device_t app_tusb_desc_device = +{ + .bLength = sizeof(tusb_descriptor_device_t), + .bDescriptorType = TUSB_DESC_TYPE_DEVICE, + .bcdUSB = 0x0200, + #if IAD_DESC_REQUIRED + // Multiple Interfaces Using Interface Association Descriptor (IAD) + // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1) + .bDeviceClass = TUSB_CLASS_MISC, + .bDeviceSubClass = MISC_SUBCLASS_COMMON, + .bDeviceProtocol = MISC_PROTOCOL_IAD, + #else + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + #endif + + .bMaxPacketSize0 = TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE, + + .idVendor = CFG_VENDORID, + .idProduct = CFG_PRODUCTID, + .bcdDevice = 0x0100, + + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + + .bNumConfigurations = 0x01 // TODO multiple configurations +}; + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +app_descriptor_configuration_t app_tusb_desc_configuration = +{ + .configuration = + { + .bLength = sizeof(tusb_descriptor_configuration_t), + .bDescriptorType = TUSB_DESC_TYPE_CONFIGURATION, + + .wTotalLength = sizeof(app_descriptor_configuration_t), + .bNumInterfaces = TOTAL_INTEFACES, + + .bConfigurationValue = 1, + .iConfiguration = 0x00, + .bmAttributes = TUSB_DESC_CONFIG_ATT_BUS_POWER, + .bMaxPower = TUSB_DESC_CONFIG_POWER_MA(100) + }, + + #if IAD_DESC_REQUIRED + // IAD points to CDC Interfaces + .cdc_iad = + { + .bLength = sizeof(tusb_descriptor_interface_association_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_ASSOCIATION, + + .bFirstInterface = INTERFACE_NUM_CDC, + .bInterfaceCount = 2, + + .bFunctionClass = TUSB_CLASS_CDC, + .bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, + .bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND, + .iFunction = 0 + }, + #endif + + #if TUSB_CFG_DEVICE_CDC + //------------- CDC Communication Interface -------------// + .cdc_comm_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NUM_CDC, + .bAlternateSetting = 0, + .bNumEndpoints = 1, + .bInterfaceClass = TUSB_CLASS_CDC, + .bInterfaceSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, + .bInterfaceProtocol = CDC_COMM_PROTOCOL_ATCOMMAND, + .iInterface = 0x00 + }, + + .cdc_header = + { + .bLength = sizeof(cdc_desc_func_header_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, + .bDescriptorSubType = CDC_FUNC_DESC_HEADER, + .bcdCDC = 0x0120 + }, + + .cdc_acm = + { + .bLength = sizeof(cdc_desc_func_abstract_control_management_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, + .bDescriptorSubType = CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, + .bmCapabilities = { // 0x06 + .support_line_request = 1, + .support_send_break = 1 + } + }, + + .cdc_union = + { + .bLength = sizeof(cdc_desc_func_union_t), // plus number of + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC, + .bDescriptorSubType = CDC_FUNC_DESC_UNION, + .bControlInterface = 0, + .bSubordinateInterface = 1, + }, + + .cdc_endpoint_notification = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = CDC_EDPT_NOTIFICATION_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, + .wMaxPacketSize = { .size = 0x08 }, + .bInterval = 0x0a + }, + + //------------- CDC Data Interface -------------// + .cdc_data_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NUM_CDC+1, + .bAlternateSetting = 0x00, + .bNumEndpoints = 2, + .bInterfaceClass = TUSB_CLASS_CDC_DATA, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = 0x00 + }, + + .cdc_endpoint_out = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = CDC_EDPT_DATA_OUT_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_BULK }, + .wMaxPacketSize = { .size = CDC_EDPT_DATA_PACKETSIZE }, + .bInterval = 0 + }, + + .cdc_endpoint_in = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = CDC_EDPT_DATA_IN_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_BULK }, + .wMaxPacketSize = { .size = CDC_EDPT_DATA_PACKETSIZE }, + .bInterval = 0 + }, + #endif + + //------------- HID Keyboard -------------// + #if TUSB_CFG_DEVICE_HID_KEYBOARD + .keyboard_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NUM_HID_KEYBOARD, + .bAlternateSetting = 0x00, + .bNumEndpoints = 1, + .bInterfaceClass = TUSB_CLASS_HID, + .bInterfaceSubClass = HID_SUBCLASS_BOOT, + .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, + .iInterface = 0x00 + }, + + .keyboard_hid = + { + .bLength = sizeof(tusb_hid_descriptor_hid_t), + .bDescriptorType = HID_DESC_TYPE_HID, + .bcdHID = 0x0111, + .bCountryCode = HID_Local_NotSupported, + .bNumDescriptors = 1, + .bReportType = HID_DESC_TYPE_REPORT, + .wReportLength = sizeof(app_tusb_keyboard_desc_report) + }, + + .keyboard_endpoint = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = HID_KEYBOARD_EDPT_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, + .wMaxPacketSize = { .size = HID_KEYBOARD_EDPT_PACKETSIZE }, + .bInterval = 0x0A + }, + #endif + + //------------- HID Mouse -------------// + #if TUSB_CFG_DEVICE_HID_MOUSE + .mouse_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NUM_HID_MOUSE, + .bAlternateSetting = 0x00, + .bNumEndpoints = 1, + .bInterfaceClass = TUSB_CLASS_HID, + .bInterfaceSubClass = HID_SUBCLASS_BOOT, + .bInterfaceProtocol = HID_PROTOCOL_MOUSE, + .iInterface = 0x00 + }, + + .mouse_hid = + { + .bLength = sizeof(tusb_hid_descriptor_hid_t), + .bDescriptorType = HID_DESC_TYPE_HID, + .bcdHID = 0x0111, + .bCountryCode = HID_Local_NotSupported, + .bNumDescriptors = 1, + .bReportType = HID_DESC_TYPE_REPORT, + .wReportLength = sizeof(app_tusb_mouse_desc_report) + }, + + .mouse_endpoint = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = HID_MOUSE_EDPT_ADDR, // TODO + .bmAttributes = { .xfer = TUSB_XFER_INTERRUPT }, + .wMaxPacketSize = { .size = HID_MOUSE_EDPT_PACKETSIZE }, + .bInterval = 0x0A + }, + #endif + + //------------- Mass Storage -------------// + #if TUSB_CFG_DEVICE_MSC + .msc_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NUM_MSC, + .bAlternateSetting = 0x00, + .bNumEndpoints = 2, + .bInterfaceClass = TUSB_CLASS_MSC, + .bInterfaceSubClass = MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = MSC_PROTOCOL_BOT, + .iInterface = 0x00 + }, + + .msc_endpoint_in = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = MSC_EDPT_IN_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_BULK }, + .wMaxPacketSize = { .size = MSC_EDPT_PACKETSIZE }, + .bInterval = 1 + }, + + .msc_endpoint_out = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = MSC_EDPT_OUT_ADDR, + .bmAttributes = { .xfer = TUSB_XFER_BULK }, + .wMaxPacketSize = { .size = MSC_EDPT_PACKETSIZE }, + .bInterval = 1 + }, + #endif +}; + +//--------------------------------------------------------------------+ +// STRING DESCRIPTORS +//--------------------------------------------------------------------+ +#define STRING_LEN_UNICODE(n) (2 + (2*(n))) // also includes 2 byte header + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +tusb_descriptor_string_t desc_str_language = +{ + .bLength = STRING_LEN_UNICODE(1), + .bDescriptorType = TUSB_DESC_TYPE_STRING, + .unicode_string = { 0x0409 } +}; + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +tusb_descriptor_string_t desc_str_manufacturer = +{ + .bLength = STRING_LEN_UNICODE(11), + .bDescriptorType = TUSB_DESC_TYPE_STRING, + .unicode_string = { 't', 'i', 'n', 'y', 'u', 's', 'b', '.', 'o', 'r', 'g' } // len = 11 +}; + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +tusb_descriptor_string_t desc_str_product = +{ + .bLength = STRING_LEN_UNICODE(14), + .bDescriptorType = TUSB_DESC_TYPE_STRING, + .unicode_string = { 't', 'i', 'n', 'y', 'u', 's', 'b', ' ', 'D', 'e', 'v', 'i', 'c', 'e' } // len = 14 +}; + +ATTR_USB_MIN_ALIGNMENT TUSB_CFG_ATTR_USBRAM +tusb_descriptor_string_t desc_str_serial = +{ + .bLength = STRING_LEN_UNICODE(4), + .bDescriptorType = TUSB_DESC_TYPE_STRING, + .unicode_string = { '1', '2', '3', '4' } // len = 4 +}; + +tusb_descriptor_string_t * const desc_str_table [TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT] = +{ + &desc_str_language, + &desc_str_manufacturer, + &desc_str_product, + &desc_str_serial +}; diff --git a/demos/device/src/tusb_descriptors.h b/demos/device/src/tusb_descriptors.h new file mode 100644 index 000000000..957661534 --- /dev/null +++ b/demos/device/src/tusb_descriptors.h @@ -0,0 +1,193 @@ +/**************************************************************************/ +/*! + @file tusb_descriptors.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#ifndef _TUSB_DESCRIPTORS_H_ +#define _TUSB_DESCRIPTORS_H_ + +#include "tusb.h" + +//--------------------------------------------------------------------+ +// Descriptors Value (calculated by enabled Classes) +//--------------------------------------------------------------------+ +#define CFG_VENDORID 0x1FC9 // NXP +//#define CFG_PRODUCTID 0x4567 // use auto product id to prevent conflict with pc's driver + +// each combination of interfaces need to have a unique productid, as windows will bind & remember device driver after the first plug. +#ifndef CFG_PRODUCTID // Auto ProductID layout's Bitmap: (MSB) MassStorage | Generic | Mouse | Key | CDC (LSB) + #define PRODUCTID_BITMAP(interface, n) ( (TUSB_CFG_DEVICE_##interface) << (n) ) + #define CFG_PRODUCTID (0x4000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \ + PRODUCTID_BITMAP(HID_MOUSE, 2) | PRODUCTID_BITMAP(HID_GENERIC, 3) | \ + PRODUCTID_BITMAP(MSC, 4) ) ) +#endif + + +#define INTERFACE_NUM_CDC 0 +#define INTERFACE_NUM_HID_KEYBOARD (INTERFACE_NUM_CDC + 2*TUSB_CFG_DEVICE_CDC ) +#define INTERFACE_NUM_HID_MOUSE (INTERFACE_NUM_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_KEYBOARD ) +#define INTERFACE_NUM_HID_GENERIC (INTERFACE_NUM_HID_MOUSE + TUSB_CFG_DEVICE_HID_MOUSE ) +#define INTERFACE_NUM_MSC (INTERFACE_NUM_HID_GENERIC + TUSB_CFG_DEVICE_HID_GENERIC ) + +#define TOTAL_INTEFACES (2*TUSB_CFG_DEVICE_CDC + TUSB_CFG_DEVICE_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_MOUSE + \ + TUSB_CFG_DEVICE_HID_GENERIC + TUSB_CFG_DEVICE_MSC) + +// Interface Assosication Descriptor is required when enable CDC +#define IAD_DESC_REQUIRED ( TUSB_CFG_DEVICE_CDC ) + +//--------------------------------------------------------------------+ +// Endpoints Address & Max Packet Size +//--------------------------------------------------------------------+ +#define EDPT_IN(x) (0x80 | (x)) +#define EDPT_OUT(x) (x) + +#if TUSB_CFG_MCU == MCU_LPC175X_6X +//------------- These MCUs's endpoint number has a fixed type -------------// +//------------- CDC -------------// +#define CDC_EDPT_NOTIFICATION_ADDR EDPT_IN (1) +#define CDC_EDPT_NOTIFICATION_PACKETSIZE 64 + +#define CDC_EDPT_DATA_OUT_ADDR EDPT_OUT(2) +#define CDC_EDPT_DATA_IN_ADDR EDPT_IN (2) +#define CDC_EDPT_DATA_PACKETSIZE 64 + +//------------- HID Keyboard -------------// +#define HID_KEYBOARD_EDPT_ADDR EDPT_IN (4) +#define HID_KEYBOARD_EDPT_PACKETSIZE 8 + +//------------- HID Mouse -------------// +#define HID_MOUSE_EDPT_ADDR EDPT_IN (7) +#define HID_MOUSE_EDPT_PACKETSIZE 8 + +//------------- HID Generic -------------// + +//------------- Mass Storage -------------// +#define MSC_EDPT_OUT_ADDR EDPT_OUT(5) +#define MSC_EDPT_IN_ADDR EDPT_IN (5) +#define MSC_EDPT_PACKETSIZE (TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512) + + +#else + +//------------- CDC -------------// +#define CDC_EDPT_NOTIFICATION_ADDR EDPT_IN (INTERFACE_NUM_CDC+1) +#define CDC_EDPT_NOTIFICATION_PACKETSIZE 64 + +#define CDC_EDPT_DATA_OUT_ADDR EDPT_OUT(INTERFACE_NUM_CDC+2) +#define CDC_EDPT_DATA_IN_ADDR EDPT_IN (INTERFACE_NUM_CDC+2) +#define CDC_EDPT_DATA_PACKETSIZE 64 + +//------------- HID Keyboard -------------// +#define HID_KEYBOARD_EDPT_ADDR EDPT_IN (INTERFACE_NUM_HID_KEYBOARD+1) +#define HID_KEYBOARD_EDPT_PACKETSIZE 8 + +//------------- HID Mouse -------------// +#define HID_MOUSE_EDPT_ADDR EDPT_IN (INTERFACE_NUM_HID_MOUSE+1) +#define HID_MOUSE_EDPT_PACKETSIZE 8 + +//------------- HID Generic -------------// + +//------------- Mass Storage -------------// +#define MSC_EDPT_OUT_ADDR EDPT_OUT(INTERFACE_NUM_MSC+1) +#define MSC_EDPT_IN_ADDR EDPT_IN (INTERFACE_NUM_MSC+1) +#define MSC_EDPT_PACKETSIZE (TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512) + +#endif + +//--------------------------------------------------------------------+ +// CONFIGURATION DESCRIPTOR +//--------------------------------------------------------------------+ +typedef ATTR_PACKED_STRUCT(struct) +{ + tusb_descriptor_configuration_t configuration; + + //------------- CDC -------------// +#if TUSB_CFG_DEVICE_CDC + #if IAD_DESC_REQUIRED + tusb_descriptor_interface_association_t cdc_iad; + #endif + + //CDC Control Interface + tusb_descriptor_interface_t cdc_comm_interface; + cdc_desc_func_header_t cdc_header; + cdc_desc_func_abstract_control_management_t cdc_acm; + cdc_desc_func_union_t cdc_union; + tusb_descriptor_endpoint_t cdc_endpoint_notification; + + //CDC Data Interface + tusb_descriptor_interface_t cdc_data_interface; + tusb_descriptor_endpoint_t cdc_endpoint_out; + tusb_descriptor_endpoint_t cdc_endpoint_in; +#endif + + //------------- HID Keyboard -------------// +#if TUSB_CFG_DEVICE_HID_KEYBOARD + tusb_descriptor_interface_t keyboard_interface; + tusb_hid_descriptor_hid_t keyboard_hid; + tusb_descriptor_endpoint_t keyboard_endpoint; +#endif + +//------------- HID Mouse -------------// +#if TUSB_CFG_DEVICE_HID_MOUSE + tusb_descriptor_interface_t mouse_interface; + tusb_hid_descriptor_hid_t mouse_hid; + tusb_descriptor_endpoint_t mouse_endpoint; +#endif + +//------------- Mass Storage -------------// +#if TUSB_CFG_DEVICE_MSC + tusb_descriptor_interface_t msc_interface; + tusb_descriptor_endpoint_t msc_endpoint_in; + tusb_descriptor_endpoint_t msc_endpoint_out; +#endif + +} app_descriptor_configuration_t; + +//--------------------------------------------------------------------+ +// STRINGS DESCRIPTOR +//--------------------------------------------------------------------+ +tusb_descriptor_string_t * const desc_str_table[TUSB_CFG_DEVICE_STRING_DESCRIPTOR_COUNT]; + +//--------------------------------------------------------------------+ +// Export descriptors +//--------------------------------------------------------------------+ +extern tusb_descriptor_device_t app_tusb_desc_device; +extern app_descriptor_configuration_t app_tusb_desc_configuration; + +extern uint8_t app_tusb_keyboard_desc_report[]; +extern uint8_t app_tusb_mouse_desc_report[]; + +#endif -- cgit v1.3.1