diff options
Diffstat (limited to 'examples/device/src')
| -rw-r--r-- | examples/device/src/WinCDCdriver.inf | 106 | ||||
| -rw-r--r-- | examples/device/src/app_os_prio.h | 71 | ||||
| -rw-r--r-- | examples/device/src/cdc_device_app.c | 166 | ||||
| -rw-r--r-- | examples/device/src/cdc_device_app.h | 80 | ||||
| -rw-r--r-- | examples/device/src/keyboard_device_app.c | 151 | ||||
| -rw-r--r-- | examples/device/src/keyboard_device_app.h | 79 | ||||
| -rw-r--r-- | examples/device/src/main.c | 149 | ||||
| -rw-r--r-- | examples/device/src/mouse_device_app.c | 158 | ||||
| -rw-r--r-- | examples/device/src/mouse_device_app.h | 78 | ||||
| -rw-r--r-- | examples/device/src/msc_device_app.c | 174 | ||||
| -rw-r--r-- | examples/device/src/msc_device_app.h | 95 | ||||
| -rw-r--r-- | examples/device/src/msc_device_ramdisk.c | 236 | ||||
| -rw-r--r-- | examples/device/src/msc_device_romdisk.c | 119 | ||||
| -rw-r--r-- | examples/device/src/tusb_config.h | 119 | ||||
| -rw-r--r-- | examples/device/src/tusb_descriptors.c | 467 | ||||
| -rw-r--r-- | examples/device/src/tusb_descriptors.h | 177 |
16 files changed, 2425 insertions, 0 deletions
diff --git a/examples/device/src/WinCDCdriver.inf b/examples/device/src/WinCDCdriver.inf new file mode 100644 index 000000000..b2ef6ba90 --- /dev/null +++ b/examples/device/src/WinCDCdriver.inf @@ -0,0 +1,106 @@ +;************************************************************ +; Windows USB CDC ACM Setup File +; Copyright (c) 2000 Microsoft Corporation + + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%MFGNAME% +LayoutFile=layout.inf +CatalogFile=%MFGFILENAME%.cat +DriverVer=11/15/2007,5.1.2600.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTamd64 + +[DestinationDirs] +DefaultDestDir=12 + + +;------------------------------------------------------------------------------ +; Windows 2000/XP/Vista-32bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.nt] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.nt +AddReg=DriverInstall.nt.AddReg + +[DriverCopyFiles.nt] +usbser.sys,,,0x20 + +[DriverInstall.nt.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.nt.Services] +AddService=usbser, 0x00000002, DriverService.nt + +[DriverService.nt] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + +;------------------------------------------------------------------------------ +; Vista-64bit Sections +;------------------------------------------------------------------------------ + +[DriverInstall.NTamd64] +include=mdmcpq.inf +CopyFiles=DriverCopyFiles.NTamd64 +AddReg=DriverInstall.NTamd64.AddReg + +[DriverCopyFiles.NTamd64] +%DRIVERFILENAME%.sys,,,0x20 + +[DriverInstall.NTamd64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,%DRIVERFILENAME%.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NTamd64.Services] +AddService=usbser, 0x00000002, DriverService.NTamd64 + +[DriverService.NTamd64] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\%DRIVERFILENAME%.sys + + +;------------------------------------------------------------------------------ +; Vendor and Product ID Definitions +;------------------------------------------------------------------------------ +; When developing your USB device, the VID and PID used in the PC side +; application program and the firmware on the microcontroller must match. +; Modify the below line to use your VID and PID. Use the format as shown below. +; Note: One INF file can be used for multiple devices with different VID and PIDs. +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. +;------------------------------------------------------------------------------ +[SourceDisksFiles] +[SourceDisksNames] +[DeviceList] +%DESCRIPTION%=DriverInstall, USB\VID_CAFE&PID_4001&MI_00, USB\VID_CAFE&PID_4003&MI_00, USB\VID_CAFE&PID_4005&MI_00, USB\VID_CAFE&PID_4007&MI_00, USB\VID_CAFE&PID_4009&MI_00, USB\VID_CAFE&PID_400b&MI_00, USB\VID_CAFE&PID_400d&MI_00, USB\VID_CAFE&PID_400f&MI_00, USB\VID_CAFE&PID_4011&MI_00, USB\VID_CAFE&PID_4013&MI_00, USB\VID_CAFE&PID_4015&MI_00, USB\VID_CAFE&PID_4017&MI_00, USB\VID_CAFE&PID_4019&MI_00, USB\VID_CAFE&PID_401b&MI_00, USB\VID_CAFE&PID_401d&MI_00, USB\VID_CAFE&PID_401f&MI_00, USB\VID_CAFE&PID_4021&MI_00, USB\VID_CAFE&PID_4023&MI_00, USB\VID_CAFE&PID_4025&MI_00, USB\VID_CAFE&PID_4027&MI_00, USB\VID_CAFE&PID_4029&MI_00, USB\VID_CAFE&PID_402b&MI_00, USB\VID_CAFE&PID_402d&MI_00, USB\VID_CAFE&PID_402f&MI_00, USB\VID_CAFE&PID_4031&MI_00, USB\VID_CAFE&PID_4033&MI_00, USB\VID_CAFE&PID_4035&MI_00, USB\VID_CAFE&PID_4037&MI_00, USB\VID_CAFE&PID_4039&MI_00, USB\VID_CAFE&PID_403b&MI_00, USB\VID_CAFE&PID_403d&MI_00, USB\VID_CAFE&PID_403f&MI_00 + + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_CAFE&PID_4001&MI_00, USB\VID_CAFE&PID_4003&MI_00, USB\VID_CAFE&PID_4005&MI_00, USB\VID_CAFE&PID_4007&MI_00, USB\VID_CAFE&PID_4009&MI_00, USB\VID_CAFE&PID_400b&MI_00, USB\VID_CAFE&PID_400d&MI_00, USB\VID_CAFE&PID_400f&MI_00, USB\VID_CAFE&PID_4011&MI_00, USB\VID_CAFE&PID_4013&MI_00, USB\VID_CAFE&PID_4015&MI_00, USB\VID_CAFE&PID_4017&MI_00, USB\VID_CAFE&PID_4019&MI_00, USB\VID_CAFE&PID_401b&MI_00, USB\VID_CAFE&PID_401d&MI_00, USB\VID_CAFE&PID_401f&MI_00, USB\VID_CAFE&PID_4021&MI_00, USB\VID_CAFE&PID_4023&MI_00, USB\VID_CAFE&PID_4025&MI_00, USB\VID_CAFE&PID_4027&MI_00, USB\VID_CAFE&PID_4029&MI_00, USB\VID_CAFE&PID_402b&MI_00, USB\VID_CAFE&PID_402d&MI_00, USB\VID_CAFE&PID_402f&MI_00, USB\VID_CAFE&PID_4031&MI_00, USB\VID_CAFE&PID_4033&MI_00, USB\VID_CAFE&PID_4035&MI_00, USB\VID_CAFE&PID_4037&MI_00, USB\VID_CAFE&PID_4039&MI_00, USB\VID_CAFE&PID_403b&MI_00, USB\VID_CAFE&PID_403d&MI_00, USB\VID_CAFE&PID_403f&MI_00 + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ +;Modify these strings to customize your device +;------------------------------------------------------------------------------ +[Strings] +MFGFILENAME="CDC_vista" +DRIVERFILENAME ="usbser" +MFGNAME="tinyusb.org" +INSTDISK="tinyusb CDC driver" +DESCRIPTION="tinyusb Serial Port" +SERVICE="USB RS-232 Emulation Driver"
\ No newline at end of file diff --git a/examples/device/src/app_os_prio.h b/examples/device/src/app_os_prio.h new file mode 100644 index 000000000..5d932a41e --- /dev/null +++ b/examples/device/src/app_os_prio.h @@ -0,0 +1,71 @@ +/**************************************************************************/ +/*! + @file app_os_prio.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#ifndef _TUSB_APP_OS_PRIO_H_ +#define _TUSB_APP_OS_PRIO_H_ + + +#ifdef __cplusplus + extern "C" { +#endif + +#include "tusb.h" + +#if TUSB_CFG_OS == TUSB_OS_NONE + #define LOWER_PRIO(x) 0 // does not matter +#elif TUSB_CFG_OS == TUSB_OS_FREERTOS + #define LOWER_PRIO(x) ((x)-1) // freeRTOS lower number --> lower priority +#else + #error Priority is not configured for this RTOS +#endif + +enum { + STANDARD_APP_TASK_PRIO = LOWER_PRIO(TUSB_CFG_OS_TASK_PRIO), // Application Task is lower than usb system task + LED_BLINKING_APP_TASK_PRIO = LOWER_PRIO(STANDARD_APP_TASK_PRIO), // Blinking task is lower than normal task + + KEYBOARD_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO, + MOUSE_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO, + CDC_SERIAL_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO, + MSC_APP_TASK_PRIO = STANDARD_APP_TASK_PRIO +}; + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_APP_OS_PRIO_H_ */ diff --git a/examples/device/src/cdc_device_app.c b/examples/device/src/cdc_device_app.c new file mode 100644 index 000000000..cbc4f4ffe --- /dev/null +++ b/examples/device/src/cdc_device_app.c @@ -0,0 +1,166 @@ +/**************************************************************************/ +/*! + @file cdc_device_app.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#include "cdc_device_app.h" + +#if TUSB_CFG_DEVICE_CDC + +#include "common/fifo.h" // TODO refractor +#include "app_os_prio.h" + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +enum { SERIAL_BUFFER_SIZE = 64 }; + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ +static osal_semaphore_t sem_hdl; + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +TUSB_CFG_ATTR_USBRAM static uint8_t serial_rx_buffer[SERIAL_BUFFER_SIZE]; +TUSB_CFG_ATTR_USBRAM static uint8_t serial_tx_buffer[SERIAL_BUFFER_SIZE]; + +FIFO_DEF(fifo_serial, SERIAL_BUFFER_SIZE, uint8_t, true); + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +void cdc_serial_app_mount(uint8_t coreid) +{ + osal_semaphore_reset(sem_hdl); + + tud_cdc_receive(coreid, serial_rx_buffer, SERIAL_BUFFER_SIZE, true); +} + +void cdc_serial_app_umount(uint8_t coreid) +{ + +} + +void tud_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<xferred_bytes; i++) + { + fifo_write(&fifo_serial, serial_rx_buffer+i); + } + osal_semaphore_post(sem_hdl); // notify main task + break; + + case TUSB_EVENT_XFER_ERROR: + tud_cdc_receive(0, serial_rx_buffer, SERIAL_BUFFER_SIZE, true); // ignore, queue transfer again + break; + + case TUSB_EVENT_XFER_STALLED: + default : + break; + } + break; + + case CDC_PIPE_DATA_IN: + case CDC_PIPE_NOTIFICATION: + default: + break; + } +} + +//--------------------------------------------------------------------+ +// APPLICATION CODE +//--------------------------------------------------------------------+ +void cdc_serial_app_init(void) +{ + sem_hdl = osal_semaphore_create(1, 0); + VERIFY(sem_hdl, ); + + osal_task_create(cdc_serial_app_task, "cdc", 128, NULL, CDC_SERIAL_APP_TASK_PRIO); +} + +tusb_error_t cdc_serial_subtask(void); + +void cdc_serial_app_task(void* param) +{ + (void) param; + + OSAL_TASK_BEGIN + cdc_serial_subtask(); + OSAL_TASK_END +} + +tusb_error_t cdc_serial_subtask(void) +{ + OSAL_SUBTASK_BEGIN + + tusb_error_t error; + + osal_semaphore_wait(sem_hdl, OSAL_TIMEOUT_WAIT_FOREVER, &error); + (void) error; // suppress compiler's warnings + + if ( tud_mounted(0) ) + { + // echo back data in the fifo + if ( !tud_cdc_busy(0, CDC_PIPE_DATA_IN) ) + { + uint16_t count=0; + while( fifo_read(&fifo_serial, &serial_tx_buffer[count]) ) + { + count++; + } + + if (count) + { + tud_cdc_send(0, serial_tx_buffer, count, false); + } + } + + // getting more data from host + tud_cdc_receive(0, serial_rx_buffer, SERIAL_BUFFER_SIZE, true); + } + + OSAL_SUBTASK_END +} + +#endif diff --git a/examples/device/src/cdc_device_app.h b/examples/device/src/cdc_device_app.h new file mode 100644 index 000000000..5433da207 --- /dev/null +++ b/examples/device/src/cdc_device_app.h @@ -0,0 +1,80 @@ +/**************************************************************************/ +/*! + @file cdc_device_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_CDCD_DEVICE_APP_H_ +#define _TUSB_CDCD_DEVICE_APP_H_ + +#include "bsp/board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_DEVICE_CDC + +void cdc_serial_app_init(void); +void cdc_serial_app_task(void* param); + +void cdc_serial_app_mount(uint8_t coreid); +void cdc_serial_app_umount(uint8_t coreid); + +#else + +#define cdc_serial_app_init() +#define cdc_serial_app_task(x) +#define cdc_serial_app_mount(x) +#define cdc_serial_app_umount(x) + +#endif + + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_CDCD_DEVICE_APP_H_ */ + +/** @} */ diff --git a/examples/device/src/keyboard_device_app.c b/examples/device/src/keyboard_device_app.c new file mode 100644 index 000000000..b4a9cb69a --- /dev/null +++ b/examples/device/src/keyboard_device_app.c @@ -0,0 +1,151 @@ +/**************************************************************************/ +/*! + @file keyboard_device_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 "keyboard_device_app.h" + +#if TUSB_CFG_DEVICE_HID_KEYBOARD +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +#include "app_os_prio.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +TUSB_CFG_ATTR_USBRAM hid_keyboard_report_t keyboard_report; + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +void keyboard_app_mount(uint8_t coreid) +{ + +} + +void keyboard_app_umount(uint8_t coreid) +{ + +} + +void tud_hid_keyboard_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 tud_hid_keyboard_get_report_cb(uint8_t coreid, hid_request_report_type_t report_type, void** pp_report, uint16_t requested_length) +{ + // get other than input report is not supported by this keyboard demo + if ( report_type != HID_REQUEST_REPORT_INPUT ) return 0; + + (*pp_report) = &keyboard_report; + return requested_length; +} + +void tud_hid_keyboard_set_report_cb(uint8_t coreid, hid_request_report_type_t report_type, uint8_t p_report_data[], uint16_t length) +{ + // set other than output report is not supported by this keyboard demo + if ( report_type != HID_REQUEST_REPORT_OUTPUT ) return; + + uint8_t kbd_led = p_report_data[0]; + uint32_t interval_divider = 1; // each LED will reduce blinking interval by a half + + if (kbd_led & KEYBOARD_LED_NUMLOCK ) interval_divider *= 2; + if (kbd_led & KEYBOARD_LED_CAPSLOCK ) interval_divider *= 2; + if (kbd_led & KEYBOARD_LED_SCROLLLOCK) interval_divider *= 2; + + led_blinking_set_interval( 1000 / interval_divider); +} + +//--------------------------------------------------------------------+ +// APPLICATION CODE +//--------------------------------------------------------------------+ +void keyboard_app_init(void) +{ + osal_task_create(keyboard_app_task, "kbd", 128, NULL, KEYBOARD_APP_TASK_PRIO); +} + +tusb_error_t keyboard_device_subtask(void); + +void keyboard_app_task(void* param) +{ + (void) param; + + OSAL_TASK_BEGIN + keyboard_device_subtask(); + OSAL_TASK_END +} + +tusb_error_t keyboard_device_subtask(void) +{ + OSAL_SUBTASK_BEGIN + + osal_task_delay(50); + + if ( tud_mounted(0) && !tud_hid_keyboard_busy(0) ) + { + static uint32_t button_mask = 0; + uint32_t new_button_mask = board_buttons(); + + //------------- button pressed -------------// + if (button_mask != new_button_mask) + { + button_mask = new_button_mask; + + for (uint8_t i=0; i<6; i++) + { // demo support up to 6 buttons, button0 = 'a', button1 = 'b', etc ... + keyboard_report.keycode[i] = BIT_TEST_(button_mask, i) ? (0x04+i) : 0; + } + + tud_hid_keyboard_send(0, &keyboard_report ); + } + } + + OSAL_SUBTASK_END +} + +#endif diff --git a/examples/device/src/keyboard_device_app.h b/examples/device/src/keyboard_device_app.h new file mode 100644 index 000000000..2c0817280 --- /dev/null +++ b/examples/device/src/keyboard_device_app.h @@ -0,0 +1,79 @@ +/**************************************************************************/ +/*! + @file keyboard_device_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_KEYBOARDD_DEVICE_APP_H_ +#define _TUSB_KEYBOARDD_DEVICE_APP_H_ + +#include "bsp/board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_DEVICE_HID_KEYBOARD + +void keyboard_app_init(void); +void keyboard_app_task(void* param); + +void keyboard_app_mount(uint8_t coreid); +void keyboard_app_umount(uint8_t coreid); + +#else + +#define keyboard_app_init() +#define keyboard_app_task(x) +#define keyboard_app_mount(x) +#define keyboard_app_umount(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_KEYBOARDD_DEVICE_APP_H_ */ + +/** @} */ diff --git a/examples/device/src/main.c b/examples/device/src/main.c new file mode 100644 index 000000000..1e96077f3 --- /dev/null +++ b/examples/device/src/main.c @@ -0,0 +1,149 @@ +/**************************************************************************/ +/*! + @file main.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "bsp/board.h" +#include "tusb.h" + +#include "msc_device_app.h" +#include "keyboard_device_app.h" +#include "mouse_device_app.h" +#include "cdc_device_app.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +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); + + msc_app_task(NULL); + keyboard_app_task(NULL); + mouse_app_task(NULL); + cdc_serial_app_task(NULL); + } +} +#endif + +int main(void) +{ + board_init(); + print_greeting(); + + tusb_init(); + + //------------- application task init -------------// + led_blinking_init(); + + msc_app_init(); + keyboard_app_init(); + mouse_app_init(); + cdc_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(); +#else + #error need to start RTOS schduler +#endif + + return 0; +} + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +void tud_mount_cb(uint8_t coreid) +{ + cdc_serial_app_mount(coreid); + keyboard_app_mount(coreid); + msc_app_mount(coreid); +} + +void tud_umount_cb(uint8_t coreid) +{ + cdc_serial_app_umount(coreid); + keyboard_app_umount(coreid); + msc_app_umount(coreid); +} + +//--------------------------------------------------------------------+ +// HELPER FUNCTION +//--------------------------------------------------------------------+ +void print_greeting(void) +{ + char const * const rtos_name[] = + { + [TUSB_OS_NONE] = "None", + [TUSB_OS_FREERTOS] = "FreeRTOS", + }; + + 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 DEVICE demo is configured to support:"); + printf(" - RTOS = %s\n", rtos_name[TUSB_CFG_OS]); + 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/examples/device/src/mouse_device_app.c b/examples/device/src/mouse_device_app.c new file mode 100644 index 000000000..055a7b699 --- /dev/null +++ b/examples/device/src/mouse_device_app.c @@ -0,0 +1,158 @@ + /**************************************************************************/ +/*! + @file mouse_device_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 "mouse_device_app.h" + +#if TUSB_CFG_DEVICE_HID_MOUSE +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +#include "app_os_prio.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +TUSB_CFG_ATTR_USBRAM hid_mouse_report_t mouse_report; + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +void mouse_app_mount(uint8_t coreid) +{ + +} + +void mouse_app_umount(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 --> do nothing +} + +//--------------------------------------------------------------------+ +// APPLICATION CODE +//--------------------------------------------------------------------+ +void mouse_app_init(void) +{ + osal_task_create(mouse_app_task, "mouse", 128, NULL, MOUSE_APP_TASK_PRIO); +} + +void mouse_app_subtask(void); + +void mouse_app_task(void * param) +{ + (void) para; + OSAL_TASK_BEGIN + mouse_app_subtask(); + OSAL_TASK_END +} + +void mouse_app_subtask(void) +{ + OSAL_SUBTASK_BEGIN + + osal_task_delay(20); + + if ( tusbd_is_configured(0) && !tusbd_hid_mouse_is_busy(0) ) + { + static uint8_t prev_mouse_buttons = 0; + + enum { + BUTTON_UP = 0, // map to button mask + BUTTON_DOWN = 1, + BUTTON_LEFT = 2, + BUTTON_RIGHT = 3, + BUTTON_CLICK_LEFT = 4, + BUTTON_CLICK_RIGHT = 5, + BUTTON_CLICK_MIDDLE = 6 + }; + + enum { MOUSE_RESOLUTION = 5 }; + + uint32_t button_mask = board_buttons(); + memclr_(&mouse_report, sizeof(hid_mouse_report_t)); + + if ( BIT_TEST_(button_mask, BUTTON_UP ) ) mouse_report.y = -MOUSE_RESOLUTION; + if ( BIT_TEST_(button_mask, BUTTON_DOWN ) ) mouse_report.y = MOUSE_RESOLUTION; + + if ( BIT_TEST_(button_mask, BUTTON_LEFT ) ) mouse_report.x = -MOUSE_RESOLUTION; + if ( BIT_TEST_(button_mask, BUTTON_RIGHT ) ) mouse_report.x = MOUSE_RESOLUTION; + + if ( BIT_TEST_(button_mask, BUTTON_CLICK_LEFT ) ) mouse_report.buttons |= MOUSE_BUTTON_LEFT; + if ( BIT_TEST_(button_mask, BUTTON_CLICK_RIGHT ) ) mouse_report.buttons |= MOUSE_BUTTON_RIGHT; + if ( BIT_TEST_(button_mask, BUTTON_CLICK_MIDDLE ) ) mouse_report.buttons |= MOUSE_BUTTON_MIDDLE; + + if ( ! (prev_mouse_buttons == mouse_report.buttons && mouse_report.y == 0 && mouse_report.x == 0 && mouse_report.wheel == 0) ) + { // send report if clicked buttons are changed or there is any movement x, y, wheel + prev_mouse_buttons = mouse_report.buttons; + + tusbd_hid_mouse_send(0, &mouse_report); + } + } + + OSAL_SUBTASK_END +} + +#endif + diff --git a/examples/device/src/mouse_device_app.h b/examples/device/src/mouse_device_app.h new file mode 100644 index 000000000..027f3afe2 --- /dev/null +++ b/examples/device/src/mouse_device_app.h @@ -0,0 +1,78 @@ +/**************************************************************************/ +/*! + @file mouse_device_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_DEVICE_APP_H_ +#define _TUSB_MOUSED_DEVICE_APP_H_ + +#include "bsp/board.h" +#include "tusb.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#if TUSB_CFG_DEVICE_HID_MOUSE + +void mouse_app_init(void); +void mouse_app_task(void * param); +void mouse_app_mount(uint8_t coreid); +void mouse_app_umount(uint8_t coreid); + +#else + +#define mouse_app_init() +#define mouse_app_task(x) +#define mouse_app_mount(x) +#define mouse_app_umount(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MOUSED_DEVICE_APP_H_ */ + +/** @} */ diff --git a/examples/device/src/msc_device_app.c b/examples/device/src/msc_device_app.c new file mode 100644 index 000000000..240f8f4dc --- /dev/null +++ b/examples/device/src/msc_device_app.c @@ -0,0 +1,174 @@ +/**************************************************************************/ +/*! + @file msc_device_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 "msc_device_app.h" + +#if TUSB_CFG_DEVICE_MSC +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ +#include "app_os_prio.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ +static scsi_inquiry_data_t const mscd_inquiry_data = +{ + .is_removable = 1, + .version = 2, + .response_data_format = 2, + .vendor_id = "tinyusb", + .product_id = "MSC Example", + .product_revision = "0.01" +}; + +static scsi_read_capacity10_data_t const mscd_read_capacity10_data = +{ + .last_lba = ENDIAN_BE(DISK_BLOCK_NUM-1), // read capacity + .block_size = ENDIAN_BE(DISK_BLOCK_SIZE) +}; + +scsi_sense_fixed_data_t mscd_sense_data = +{ + .response_code = 0x70, + .sense_key = 0, // no errors + .additional_sense_len = sizeof(scsi_sense_fixed_data_t) - 8 +}; + +static scsi_read_format_capacity_data_t const mscd_format_capacity_data = +{ + .list_length = 8, + .block_num = ENDIAN_BE(DISK_BLOCK_NUM), // write capacity + .descriptor_type = 2, // TODO formatted media, refractor to const + .block_size_u16 = ENDIAN_BE16(DISK_BLOCK_SIZE) +}; + +static scsi_mode_parameters_t const msc_dev_mode_para = +{ + .mode_data_length = 3, + .medium_type = 0, + .device_specific_para = 0, + .block_descriptor_length = 0 +}; + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +void msc_app_mount(uint8_t coreid) +{ + +} + +void msc_app_umount(uint8_t coreid) +{ + +} + +msc_csw_status_t tud_msc_scsi_cb (uint8_t coreid, uint8_t lun, uint8_t scsi_cmd[16], void const ** 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; +} + +//--------------------------------------------------------------------+ +// APPLICATION CODE +//--------------------------------------------------------------------+ +void msc_app_task(void* param) +{ // no need to implement the task yet + (void) param; + + OSAL_TASK_BEGIN + + OSAL_TASK_END +} + +void msc_app_init (void) +{ + +} + + +#endif diff --git a/examples/device/src/msc_device_app.h b/examples/device/src/msc_device_app.h new file mode 100644 index 000000000..47803b7d4 --- /dev/null +++ b/examples/device/src/msc_device_app.h @@ -0,0 +1,95 @@ +/**************************************************************************/ +/*! + @file msc_device_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 group_demo + * \defgroup Mass Storage Device App + * @{ */ + +#ifndef _TUSB_MSCD_DEVICE_APP_H_ +#define _TUSB_MSCD_DEVICE_APP_H_ + +#include "bsp/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_app_init(void); +void msc_app_task(void* param); + +void msc_app_mount(uint8_t coreid); +void msc_app_umount(uint8_t coreid); + +extern scsi_sense_fixed_data_t mscd_sense_data; + +#else + +#define msc_app_init() +#define msc_app_task(x) +#define msc_app_mount(x) +#define msc_app_umount(x) + +#endif + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_MSCD_DEVICE_APP_H_ */ + +/** @} */ diff --git a/examples/device/src/msc_device_ramdisk.c b/examples/device/src/msc_device_ramdisk.c new file mode 100644 index 000000000..37ea923b3 --- /dev/null +++ b/examples/device/src/msc_device_ramdisk.c @@ -0,0 +1,236 @@ +/**************************************************************************/ +/*! + @file msc_device_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 "msc_device_app.h" + +#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_RAMDISK) + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +TUSB_CFG_ATTR_USBRAM +uint8_t msc_device_ramdisk[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 + '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 tud_msc_read10_cb (uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + (*pp_buffer) = msc_device_ramdisk[lba]; + + return min16_of(block_count, DISK_BLOCK_NUM); +} +uint16_t tud_msc_write10_cb(uint8_t coreid, uint8_t lun, void** pp_buffer, uint32_t lba, uint16_t block_count) +{ + (*pp_buffer) = msc_device_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 msc_device_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* ) msc_device_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(msc_device_ramdisk[1], "\xF8\xFF\xFF\xFF\x0F", 5); + + //------------- Root Directory -------------// + fat_directory_t* p_entry = (fat_directory_t*) msc_device_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(msc_device_ramdisk[3], readme_contents, sizeof(readme_contents)-1); + +} +#endif + +#endif diff --git a/examples/device/src/msc_device_romdisk.c b/examples/device/src/msc_device_romdisk.c new file mode 100644 index 000000000..536d22dc7 --- /dev/null +++ b/examples/device/src/msc_device_romdisk.c @@ -0,0 +1,119 @@ +/**************************************************************************/ +/*! + @file msc_device_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 "msc_device_app.h" + +#if TUSB_CFG_DEVICE_MSC && defined (MSCD_APP_ROMDISK) + +//--------------------------------------------------------------------+ +// INCLUDE +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// INTERNAL OBJECT & FUNCTION DECLARATION +//--------------------------------------------------------------------+ +const uint8_t msc_device_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 +}; + +TUSB_CFG_ATTR_USBRAM +static uint8_t sector_buffer[DISK_BLOCK_SIZE]; + +//--------------------------------------------------------------------+ +// 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, msc_device_app_rommdisk[lba], DISK_BLOCK_SIZE); + (*pp_buffer) = sector_buffer; + + return 1; +} + +// Stall write10 by return 0, 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/examples/device/src/tusb_config.h b/examples/device/src/tusb_config.h new file mode 100644 index 000000000..70ed713db --- /dev/null +++ b/examples/device/src/tusb_config.h @@ -0,0 +1,119 @@ +/**************************************************************************/ +/*! + @file tusb_config.h + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2013, hathach (tinyusb.org) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This file is part of the tinyusb stack. +*/ +/**************************************************************************/ + +#ifndef _TUSB_TUSB_CONFIG_H_ +#define _TUSB_TUSB_CONFIG_H_ + +#ifdef __cplusplus + extern "C" { +#endif + +//--------------------------------------------------------------------+ +// CONTROLLER CONFIGURATION +//--------------------------------------------------------------------+ +//#define TUSB_CFG_MCU will be passed from IDE/command line for easy board/mcu switching + +#define TUSB_CFG_CONTROLLER_0_MODE (TUSB_MODE_DEVICE) +//#define TUSB_CFG_CONTROLLER_1_MODE (TUSB_MODE_DEVICE) + +//--------------------------------------------------------------------+ +// DEVICE CONFIGURATION +//--------------------------------------------------------------------+ +#define TUSB_CFG_DEVICE_CONTROL_ENDOINT_SIZE 64 + +//------------- CLASS -------------// +#define TUSB_CFG_DEVICE_HID_KEYBOARD 1 +#define TUSB_CFG_DEVICE_HID_MOUSE 0 +#define TUSB_CFG_DEVICE_HID_GENERIC 0 // not supported yet +#define TUSB_CFG_DEVICE_MSC 1 +#define TUSB_CFG_DEVICE_CDC 1 + +//--------------------------------------------------------------------+ +// COMMON CONFIGURATION +//--------------------------------------------------------------------+ +#define TUSB_CFG_DEBUG 2 + +//#define TUSB_CFG_OS TUSB_OS_NONE // be passed from IDE/command line for easy project switching +//#define TUSB_CFG_OS_TASK_PRIO 0 // be passed from IDE/command line for easy project switching +#define TUSB_CFG_TICKS_HZ 1000 + +//--------------------------------------------------------------------+ +// USB RAM PLACEMENT +//--------------------------------------------------------------------+ +#ifdef __CODE_RED // compiled with lpcxpresso + + #if (TUSB_CFG_MCU == MCU_LPC11UXX) || (TUSB_CFG_MCU == MCU_LPC13UXX) + #define TUSB_CFG_ATTR_USBRAM ATTR_SECTION(.data.$RAM2) ATTR_ALIGNED(64) // lp11u & lp13u requires data to be 64 byte aligned + #elif TUSB_CFG_MCU == MCU_LPC175X_6X + #define TUSB_CFG_ATTR_USBRAM // LPC17xx USB DMA can access all + #elif (TUSB_CFG_MCU == MCU_LPC43XX) + #define TUSB_CFG_ATTR_USBRAM ATTR_SECTION(.data.$RAM3) + #endif + +#elif defined __CC_ARM // Compiled with Keil armcc, USBRAM_SECTION is defined in scatter files + + #if (TUSB_CFG_MCU == MCU_LPC11UXX) || (TUSB_CFG_MCU == MCU_LPC13UXX) + #define TUSB_CFG_ATTR_USBRAM ATTR_SECTION(USBRAM_SECTION) ATTR_ALIGNED(64) // lp11u & lp13u requires data to be 64 byte aligned + #elif (TUSB_CFG_MCU == MCU_LPC175X_6X) + #define TUSB_CFG_ATTR_USBRAM // LPC17xx USB DMA can access all address + #elif (TUSB_CFG_MCU == MCU_LPC43XX) + #define TUSB_CFG_ATTR_USBRAM // Use keil tool configure to have AHB SRAM as default memory + #endif + +#elif defined __ICCARM__ // compiled with IAR + + #if (TUSB_CFG_MCU == MCU_LPC11UXX) || (TUSB_CFG_MCU == MCU_LPC13UXX) + #define TUSB_CFG_ATTR_USBRAM _Pragma("location=\"USB_PACKET_MEMORY\"") ATTR_ALIGNED(64) + #elif (TUSB_CFG_MCU == MCU_LPC175X_6X) + #define TUSB_CFG_ATTR_USBRAM + #elif (TUSB_CFG_MCU == MCU_LPC43XX) + #define TUSB_CFG_ATTR_USBRAM _Pragma("location=\".ahb_sram1\"") + #endif + +#else + + #error compiler not specified + +#endif + + +#ifdef __cplusplus + } +#endif + +#endif /* _TUSB_TUSB_CONFIG_H_ */ diff --git a/examples/device/src/tusb_descriptors.c b/examples/device/src/tusb_descriptors.c new file mode 100644 index 000000000..4a58161f1 --- /dev/null +++ b/examples/device/src/tusb_descriptors.c @@ -0,0 +1,467 @@ +/**************************************************************************/ +/*! + @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" + +//--------------------------------------------------------------------+ +// Keyboard Report Descriptor +//--------------------------------------------------------------------+ +#if TUSB_CFG_DEVICE_HID_KEYBOARD +uint8_t const desc_keyboard_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 + +//--------------------------------------------------------------------+ +// Mouse Report Descriptor +//--------------------------------------------------------------------+ +#if TUSB_CFG_DEVICE_HID_MOUSE +uint8_t const desc_mouse_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 + +//--------------------------------------------------------------------+ +// USB DEVICE DESCRIPTOR +//--------------------------------------------------------------------+ +tusb_descriptor_device_t const desc_device = +{ + .bLength = sizeof(tusb_descriptor_device_t), + .bDescriptorType = TUSB_DESC_TYPE_DEVICE, + .bcdUSB = 0x0200, + #if TUSB_CFG_DEVICE_CDC + // Use Interface Association Descriptor (IAD) for CDC + // 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 +}; + +//--------------------------------------------------------------------+ +// USB COFNIGURATION DESCRIPTOR +//--------------------------------------------------------------------+ +app_descriptor_configuration_t const 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 TUSB_CFG_DEVICE_CDC + // IAD points to CDC Interfaces + .cdc_iad = + { + .bLength = sizeof(tusb_descriptor_interface_association_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE_ASSOCIATION, + + .bFirstInterface = INTERFACE_NO_CDC, + .bInterfaceCount = 2, + + .bFunctionClass = TUSB_CLASS_CDC, + .bFunctionSubClass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, + .bFunctionProtocol = CDC_COMM_PROTOCOL_ATCOMMAND, + .iFunction = 0 + }, + + //------------- CDC Communication Interface -------------// + .cdc_comm_interface = + { + .bLength = sizeof(tusb_descriptor_interface_t), + .bDescriptorType = TUSB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = INTERFACE_NO_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_NO_CDC+1, + .bAlternateSetting = 0x00, + .bNumEndpoints = 2, + .bInterfaceClass = TUSB_CLASS_CDC_DATA, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = 0x04 + }, + + .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_NO_HID_KEYBOARD, + .bAlternateSetting = 0x00, + .bNumEndpoints = 1, + .bInterfaceClass = TUSB_CLASS_HID, + .bInterfaceSubClass = HID_SUBCLASS_BOOT, + .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, + .iInterface = 0x05 + }, + + .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(desc_keyboard_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_NO_HID_MOUSE, + .bAlternateSetting = 0x00, + .bNumEndpoints = 1, + .bInterfaceClass = TUSB_CLASS_HID, + .bInterfaceSubClass = HID_SUBCLASS_BOOT, + .bInterfaceProtocol = HID_PROTOCOL_MOUSE, + .iInterface = 0x06 + }, + + .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(desc_mouse_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_NO_MSC, + .bAlternateSetting = 0x00, + .bNumEndpoints = 2, + .bInterfaceClass = TUSB_CLASS_MSC, + .bInterfaceSubClass = MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = MSC_PROTOCOL_BOT, + .iInterface = 0x07 + }, + + .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 +#define ENDIAN_BE16_FROM( high, low) ENDIAN_BE16(high << 8 | low) + +// array of pointer to string descriptors +uint16_t const * const string_descriptor_arr [] = +{ + [0] = (uint16_t []) { // supported language + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(1), TUSB_DESC_TYPE_STRING ), + 0x0409 // English + }, + + [1] = (uint16_t []) { // manufacturer + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(11), TUSB_DESC_TYPE_STRING), + 't', 'i', 'n', 'y', 'u', 's', 'b', '.', 'o', 'r', 'g' // len = 11 + }, + + [2] = (uint16_t []) { // product + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(14), TUSB_DESC_TYPE_STRING), + 't', 'i', 'n', 'y', 'u', 's', 'b', ' ', 'd', 'e', 'v', 'i', 'c', 'e' // len = 14 + }, + + [3] = (uint16_t []) { // serials + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(4), TUSB_DESC_TYPE_STRING), + '1', '2', '3', '4' // len = 4 + }, + + [4] = (uint16_t []) { // CDC Interface + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(3), TUSB_DESC_TYPE_STRING), + 'c', 'd', 'c' // len = 3 + }, + + [5] = (uint16_t []) { // Keyboard Interface + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(5), TUSB_DESC_TYPE_STRING), + 'm', 'o', 'u', 's', 'e' // len = 5 + }, + + [6] = (uint16_t []) { // Keyboard Interface + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(8), TUSB_DESC_TYPE_STRING), + 'k', 'e', 'y', 'b', 'o', 'a', 'r', 'd' // len = 8 + }, + + [7] = (uint16_t []) { // MSC Interface + ENDIAN_BE16_FROM( STRING_LEN_UNICODE(3), TUSB_DESC_TYPE_STRING), + 'm', 's', 'c' // len = 3 + } +}; + +//--------------------------------------------------------------------+ +// TINYUSB Descriptors Pointer (this variable is required by the stack) +//--------------------------------------------------------------------+ +tusbd_descriptor_pointer_t tusbd_descriptor_pointers = +{ + .p_device = (uint8_t const * ) &desc_device, + .p_configuration = (uint8_t const * ) &desc_configuration, + .p_string_arr = (uint8_t const **) string_descriptor_arr, + + #if TUSB_CFG_DEVICE_HID_KEYBOARD + .p_hid_keyboard_report = (uint8_t const *) desc_keyboard_report, + #endif + + #if TUSB_CFG_DEVICE_HID_MOUSE + .p_hid_mouse_report = (uint8_t const *) desc_mouse_report, + #endif +}; diff --git a/examples/device/src/tusb_descriptors.h b/examples/device/src/tusb_descriptors.h new file mode 100644 index 000000000..e6a9c01a2 --- /dev/null +++ b/examples/device/src/tusb_descriptors.h @@ -0,0 +1,177 @@ +/**************************************************************************/ +/*! + @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 0xCAFE +//#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. +// Auto ProductID layout's Bitmap: (MSB) MassStorage | Generic | Mouse | Key | CDC (LSB) +#ifndef CFG_PRODUCTID + #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_NO_CDC 0 +#define INTERFACE_NO_HID_KEYBOARD (INTERFACE_NO_CDC + 2*(TUSB_CFG_DEVICE_CDC ? 1 : 0) ) +#define INTERFACE_NO_HID_MOUSE (INTERFACE_NO_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_KEYBOARD ) +#define INTERFACE_NO_HID_GENERIC (INTERFACE_NO_HID_MOUSE + TUSB_CFG_DEVICE_HID_MOUSE ) +#define INTERFACE_NO_MSC (INTERFACE_NO_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) + +#if (TUSB_CFG_MCU == MCU_LPC11UXX || TUSB_CFG_MCU == MCU_LPC13UXX) && (TOTAL_INTEFACES > 4) + #error These MCUs do not have enough number of endpoints for the current configuration +#endif + +//--------------------------------------------------------------------+ +// Endpoints Address & Max Packet Size +//--------------------------------------------------------------------+ +#define EDPT_IN(x) (0x80 | (x)) +#define EDPT_OUT(x) (x) + +#if TUSB_CFG_MCU == MCU_LPC175X_6X // 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) + +#else + + //------------- CDC -------------// + #define CDC_EDPT_NOTIFICATION_ADDR EDPT_IN (INTERFACE_NO_CDC+1) + #define CDC_EDPT_NOTIFICATION_PACKETSIZE 64 + + #define CDC_EDPT_DATA_OUT_ADDR EDPT_OUT(INTERFACE_NO_CDC+2) + #define CDC_EDPT_DATA_IN_ADDR EDPT_IN (INTERFACE_NO_CDC+2) + #define CDC_EDPT_DATA_PACKETSIZE 64 + + //------------- HID Keyboard -------------// + #define HID_KEYBOARD_EDPT_ADDR EDPT_IN (INTERFACE_NO_HID_KEYBOARD+1) + #define HID_KEYBOARD_EDPT_PACKETSIZE 8 + + //------------- HID Mouse -------------// + #define HID_MOUSE_EDPT_ADDR EDPT_IN (INTERFACE_NO_HID_MOUSE+1) + #define HID_MOUSE_EDPT_PACKETSIZE 8 + + //------------- HID Generic -------------// + + //------------- Mass Storage -------------// + #define MSC_EDPT_OUT_ADDR EDPT_OUT(INTERFACE_NO_MSC+1) + #define MSC_EDPT_IN_ADDR EDPT_IN (INTERFACE_NO_MSC+1) + +#endif + +#define MSC_EDPT_PACKETSIZE (TUSB_CFG_MCU == MCU_LPC43XX ? 512 : 64) + +//--------------------------------------------------------------------+ +// CONFIGURATION DESCRIPTOR +//--------------------------------------------------------------------+ +typedef ATTR_PACKED_STRUCT(struct) +{ + tusb_descriptor_configuration_t configuration; + + //------------- CDC -------------// +#if TUSB_CFG_DEVICE_CDC + tusb_descriptor_interface_association_t cdc_iad; + + //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; + +#endif |
