| 
									
										
										
										
											2013-05-06 12:50:19 +07:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*!
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  |     @file     usbd.c | 
					
						
							| 
									
										
										
										
											2013-05-06 12:50:19 +07:00
										 |  |  |     @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 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  |     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
					
						
							|  |  |  |     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
					
						
							| 
									
										
										
										
											2013-05-06 12:50:19 +07:00
										 |  |  |     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  |     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
					
						
							| 
									
										
										
										
											2013-05-06 12:50:19 +07:00
										 |  |  |     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This file is part of the tinyusb stack. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2012-11-29 17:52:57 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | #include "tusb_option.h"
 | 
					
						
							| 
									
										
										
										
											2012-11-29 17:52:57 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | #if MODE_DEVICE_SUPPORTED
 | 
					
						
							| 
									
										
										
										
											2012-11-29 17:52:57 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | #define _TINY_USB_SOURCE_FILE_
 | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // INCLUDE
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | #include "tusb.h"
 | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  | #include "tusb_descriptors.h" // TODO callback include
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  | #include "usbd_dcd.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-04 18:18:29 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | // MACRO CONSTANT TYPEDEF
 | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  | usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER]; | 
					
						
							| 
									
										
										
										
											2013-05-28 15:24:27 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  | // TODO fix/compress number of class driver
 | 
					
						
							| 
									
										
										
										
											2013-06-16 14:41:48 +07:00
										 |  |  | static device_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAX_CONSEC_NUMBER] = | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  | { | 
					
						
							|  |  |  | #if DEVICE_CLASS_HID
 | 
					
						
							|  |  |  |     [TUSB_CLASS_HID] = { | 
					
						
							| 
									
										
										
										
											2013-06-16 14:41:48 +07:00
										 |  |  |         .init            = hidd_init, | 
					
						
							|  |  |  |         .control_request = hidd_control_request, | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |     }, | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2012-11-29 17:52:57 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | // INTERNAL OBJECT & FUNCTION DECLARATION
 | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  | static tusb_error_t usbd_string_descriptor_init(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // APPLICATION INTERFACE
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-06-14 19:06:33 +07:00
										 |  |  | bool tusbd_is_configured(uint8_t coreid) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return usbd_devices[coreid].state == TUSB_DEVICE_STATE_CONFIGURED; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  | void usbd_bus_reset(uint32_t coreid) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   memclr_(usbd_devices, sizeof(usbd_device_info_t)*CONTROLLER_DEVICE_NUMBER); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void std_get_descriptor(uint8_t coreid) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   tusb_std_descriptor_type_t const desc_type = usbd_devices[coreid].setup_packet.wValue >> 8; | 
					
						
							|  |  |  |   uint8_t const desc_index = u16_low_u8( usbd_devices[coreid].setup_packet.wValue ); | 
					
						
							|  |  |  |   switch ( desc_type ) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     case TUSB_DESC_TYPE_DEVICE: | 
					
						
							| 
									
										
										
										
											2013-06-11 16:01:30 +07:00
										 |  |  |       dcd_pipe_control_write(coreid, &app_tusb_desc_device, sizeof(tusb_descriptor_device_t)); | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-11 16:30:06 +07:00
										 |  |  |     case TUSB_DESC_TYPE_CONFIGURATION: | 
					
						
							| 
									
										
										
										
											2013-06-11 17:35:53 +07:00
										 |  |  |     { | 
					
						
							|  |  |  |       uint16_t const requested_length = min16_of(usbd_devices[coreid].setup_packet.wLength, sizeof(app_tusb_desc_configuration)-1); | 
					
						
							| 
									
										
										
										
											2013-06-12 14:06:41 +07:00
										 |  |  |       ASSERT(requested_length <= TUSB_CFG_DEVICE_CONTROL_PACKET_SIZE, (void)0 ); // multiple packets requires a task a-like
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-14 18:22:40 +07:00
										 |  |  |       dcd_pipe_control_write(coreid, &app_tusb_desc_configuration, | 
					
						
							| 
									
										
										
										
											2013-06-12 14:06:41 +07:00
										 |  |  |                              requested_length); | 
					
						
							| 
									
										
										
										
											2013-06-11 17:35:53 +07:00
										 |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case TUSB_DESC_TYPE_STRING: | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       uint8_t *p_string = (uint8_t*) &app_tusb_desc_strings; | 
					
						
							|  |  |  |       for(uint8_t index =0; index < desc_index; index++) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         p_string += (*p_string); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       dcd_pipe_control_write(coreid, p_string, *p_string); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-06-11 16:30:06 +07:00
										 |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  |     default: | 
					
						
							| 
									
										
										
										
											2013-06-11 17:53:33 +07:00
										 |  |  | //      ASSERT(false, (void) 0); // descriptors that is not supported yet
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void usbd_setup_received(uint8_t coreid) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   usbd_device_info_t *p_device = &usbd_devices[coreid]; | 
					
						
							| 
									
										
										
										
											2013-06-11 17:53:33 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-14 18:22:40 +07:00
										 |  |  |   // check device configured TODO
 | 
					
						
							|  |  |  |   if ( p_device->setup_packet.bmRequestType.recipient == TUSB_REQUEST_RECIPIENT_INTERFACE) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     // TODO detect which class
 | 
					
						
							| 
									
										
										
										
											2013-06-16 14:41:48 +07:00
										 |  |  | //    ASSERT( p_device->setup_packet.wIndex < USBD_MAX_INTERFACE, (void) 0);
 | 
					
						
							|  |  |  | //    tusb_std_class_code_t const class_code = usbd_devices[coreid].interface2class[ p_device->setup_packet.wIndex ];
 | 
					
						
							|  |  |  | //    if ( usbd_class_drivers[class_code].control_request != NULL )
 | 
					
						
							|  |  |  | //    {
 | 
					
						
							|  |  |  | //      usbd_class_drivers[class_code].control_request(coreid, &p_device->setup_packet);
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //    }
 | 
					
						
							| 
									
										
										
										
											2013-06-14 18:22:40 +07:00
										 |  |  |     hidd_control_request(coreid, &p_device->setup_packet); | 
					
						
							|  |  |  |   }else | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     switch ( p_device->setup_packet.bRequest ) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       case TUSB_REQUEST_GET_DESCRIPTOR: | 
					
						
							|  |  |  |         std_get_descriptor(coreid); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       case TUSB_REQUEST_SET_ADDRESS: | 
					
						
							|  |  |  |         p_device->address = (uint8_t) p_device->setup_packet.wValue; | 
					
						
							|  |  |  |         dcd_device_set_address(coreid, p_device->address); | 
					
						
							|  |  |  |         usbd_devices[coreid].state = TUSB_DEVICE_STATE_ADDRESSED; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       case TUSB_REQUEST_SET_CONFIGURATION: | 
					
						
							|  |  |  |         dcd_device_set_configuration(coreid, (uint8_t) p_device->setup_packet.wValue); | 
					
						
							|  |  |  |         usbd_devices[coreid].state = TUSB_DEVICE_STATE_CONFIGURED; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-14 18:22:40 +07:00
										 |  |  |   if (p_device->setup_packet.bmRequestType.direction == TUSB_DIR_HOST_TO_DEV) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     dcd_pipe_control_write_zero_length(coreid); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // IMPLEMENTATION
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | tusb_error_t usbd_init (void) | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  | { | 
					
						
							|  |  |  |   ASSERT_STATUS ( usbd_string_descriptor_init() ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ASSERT_STATUS ( dcd_init() ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |   uint16_t length = 0; | 
					
						
							| 
									
										
										
										
											2013-06-12 14:06:41 +07:00
										 |  |  |   #if TUSB_CFG_DEVICE_HID_KEYBOARD
 | 
					
						
							| 
									
										
										
										
											2013-06-16 14:41:48 +07:00
										 |  |  |   tusb_descriptor_interface_t const * p_interface = &app_tusb_desc_configuration.keyboard_interface; | 
					
						
							|  |  |  |   ASSERT_STATUS( hidd_init(0, p_interface, &length) ); | 
					
						
							|  |  |  |   usbd_devices[0].interface2class[p_interface->bInterfaceNumber] = p_interface->bInterfaceClass; | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  |   #if TUSB_CFG_DEVICE_HID_MOUSE && 0
 | 
					
						
							|  |  |  |   ASSERT_STATUS( hidd_init(0, &app_tusb_desc_configuration.mouse_interface, &length) ); | 
					
						
							| 
									
										
										
										
											2013-06-01 21:54:08 +07:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  |   usbd_bus_reset(0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:54:08 +07:00
										 |  |  |   #ifndef _TEST_
 | 
					
						
							|  |  |  |   hal_interrupt_enable(0); // TODO USB1
 | 
					
						
							|  |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   dcd_controller_connect(0);  // TODO USB1
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  |   return TUSB_ERROR_NONE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 02:50:10 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // callback from DCD ISR
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | void usbd_isr(uint8_t coreid, tusb_event_t event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   switch(event) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     case TUSB_EVENT_BUS_RESET: | 
					
						
							|  |  |  |       usbd_bus_reset(coreid); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case TUSB_EVENT_SETUP_RECEIVED: | 
					
						
							|  |  |  |       usbd_setup_received(coreid); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       ASSERT(false, (void) 0); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // HELPER
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | static tusb_error_t usbd_string_descriptor_init(void) | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |   ASSERT_INT( STRING_LEN_BYTE2UNICODE(sizeof(TUSB_CFG_DEVICE_STRING_MANUFACTURER)-1), | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |              app_tusb_desc_strings.manufacturer.bLength, TUSB_ERROR_USBD_DESCRIPTOR_STRING); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |   ASSERT_INT( STRING_LEN_BYTE2UNICODE(sizeof(TUSB_CFG_DEVICE_STRING_PRODUCT)-1)     , | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |              app_tusb_desc_strings.product.bLength     , TUSB_ERROR_USBD_DESCRIPTOR_STRING); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 14:31:17 +07:00
										 |  |  |   ASSERT_INT( STRING_LEN_BYTE2UNICODE(sizeof(TUSB_CFG_DEVICE_STRING_SERIAL)-1)      , | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |               app_tusb_desc_strings.serial.bLength      , TUSB_ERROR_USBD_DESCRIPTOR_STRING); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for(uint32_t i=0; i < sizeof(TUSB_CFG_DEVICE_STRING_MANUFACTURER)-1; i++) | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  |     app_tusb_desc_strings.manufacturer.unicode_string[i] = (uint16_t) TUSB_CFG_DEVICE_STRING_MANUFACTURER[i]; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for(uint32_t i=0; i < sizeof(TUSB_CFG_DEVICE_STRING_PRODUCT)-1; i++) | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  |     app_tusb_desc_strings.product.unicode_string[i] = (uint16_t) TUSB_CFG_DEVICE_STRING_PRODUCT[i]; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for(uint32_t i=0; i < sizeof(TUSB_CFG_DEVICE_STRING_SERIAL)-1; i++) | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2013-05-31 21:24:40 +07:00
										 |  |  |     app_tusb_desc_strings.serial.unicode_string[i] = (uint16_t) TUSB_CFG_DEVICE_STRING_SERIAL[i]; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:21:31 +07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 13:22:46 +07:00
										 |  |  |   return TUSB_ERROR_NONE; | 
					
						
							| 
									
										
										
										
											2013-01-16 12:43:17 +07:00
										 |  |  | } |