| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     @file     osal_none.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. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-24 12:35:44 +07:00
										 |  |  | /** \ingroup group_osal
 | 
					
						
							| 
									
										
										
										
											2014-03-16 22:20:33 +07:00
										 |  |  |  * \defgroup Group_OSNone None OS | 
					
						
							|  |  |  |  *  @{ */ | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef _TUSB_OSAL_NONE_H_
 | 
					
						
							|  |  |  | #define _TUSB_OSAL_NONE_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-28 13:10:57 +07:00
										 |  |  | #include "common/tusb_fifo.h"
 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  |  extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // TASK API
 | 
					
						
							|  |  |  | // NOTES: Each blocking OSAL_NONE services such as semaphore wait,
 | 
					
						
							|  |  |  | // queue receive embedded return statement, therefore local variable
 | 
					
						
							|  |  |  | // retain value before/after such services needed to declare as static
 | 
					
						
							|  |  |  | // OSAL_TASK_LOOP
 | 
					
						
							|  |  |  | // {
 | 
					
						
							| 
									
										
										
										
											2018-03-01 12:14:44 +07:00
										 |  |  | //   OSAL_TASK_BEGIN
 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | //
 | 
					
						
							|  |  |  | //   task body statements
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //   OSAL_TASK_LOOP_ENG
 | 
					
						
							|  |  |  | // }
 | 
					
						
							| 
									
										
										
										
											2018-03-03 12:30:38 +07:00
										 |  |  | //
 | 
					
						
							|  |  |  | // NOTE: no switch statement is allowed in Task and subtask
 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:28:26 +07:00
										 |  |  | typedef void (*osal_func_t)(void *param); | 
					
						
							|  |  |  | typedef void* osal_task_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline osal_task_t osal_task_create(osal_func_t code, const char* name, uint32_t stack_size, void* param, uint32_t prio) | 
					
						
							| 
									
										
										
										
											2018-02-28 14:21:31 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:28:26 +07:00
										 |  |  |   (void) code; (void) name; (void) stack_size; (void) param; (void) prio; | 
					
						
							|  |  |  |   return (osal_task_t) 1; | 
					
						
							| 
									
										
										
										
											2018-02-28 14:21:31 +07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define TASK_RESTART                             \
 | 
					
						
							| 
									
										
										
										
											2018-03-21 20:42:23 +07:00
										 |  |  |   _state = 0 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define OSAL_TASK_BEGIN                          \
 | 
					
						
							|  |  |  |   static uint16_t _state = 0;                    \ | 
					
						
							|  |  |  |   ATTR_UNUSED static uint32_t _timeout = 0;      \ | 
					
						
							|  |  |  |   (void) _timeout;                               \ | 
					
						
							|  |  |  |   switch(_state) {                               \ | 
					
						
							| 
									
										
										
										
											2018-03-21 20:42:23 +07:00
										 |  |  |     case 0: { | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define OSAL_TASK_END                            \
 | 
					
						
							|  |  |  |   default:  TASK_RESTART; break;                 \ | 
					
						
							|  |  |  |   }}                                             \ | 
					
						
							| 
									
										
										
										
											2018-02-28 14:59:38 +07:00
										 |  |  |   return; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define osal_task_delay(msec)                    \
 | 
					
						
							|  |  |  |   do {                                           \ | 
					
						
							|  |  |  |     _timeout = tusb_hal_millis();                \ | 
					
						
							|  |  |  |     _state = __LINE__; case __LINE__:            \ | 
					
						
							| 
									
										
										
										
											2018-03-30 15:33:36 +07:00
										 |  |  |       if ( _timeout + msec > tusb_hal_millis() ) \ | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  |         return TUSB_ERROR_OSAL_WAITING;          \ | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  |   }while(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // SUBTASK (a sub function that uses OS blocking services & called by a task
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2018-03-03 12:30:38 +07:00
										 |  |  | #define OSAL_SUBTASK_BEGIN  OSAL_TASK_BEGIN
 | 
					
						
							| 
									
										
										
										
											2018-03-22 14:15:16 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define OSAL_SUBTASK_END                                                        \
 | 
					
						
							|  |  |  |   default: TASK_RESTART; break;                                                 \ | 
					
						
							|  |  |  |   }}                                                                            \ | 
					
						
							| 
									
										
										
										
											2018-03-03 12:30:38 +07:00
										 |  |  |   return TUSB_ERROR_NONE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-22 16:25:24 +07:00
										 |  |  | #define STASK_INVOKE(_subtask, _status)                                         \
 | 
					
						
							| 
									
										
										
										
											2018-03-22 14:15:16 +07:00
										 |  |  |   do {                                                                          \ | 
					
						
							|  |  |  |     _state = __LINE__; case __LINE__:                                           \ | 
					
						
							|  |  |  |     {                                                                           \ | 
					
						
							|  |  |  |       (_status) = _subtask; /* invoke sub task */                               \ | 
					
						
							|  |  |  |       if (TUSB_ERROR_OSAL_WAITING == (_status)) return TUSB_ERROR_OSAL_WAITING; \ | 
					
						
							|  |  |  |     }                                                                           \ | 
					
						
							| 
									
										
										
										
											2018-03-21 20:42:23 +07:00
										 |  |  |   }while(0) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | //------------- Sub Task Assert -------------//
 | 
					
						
							| 
									
										
										
										
											2018-03-22 16:25:24 +07:00
										 |  |  | #define STASK_RETURN(error)     do { TASK_RESTART; return error; } while(0)
 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 13:31:56 +07:00
										 |  |  | #define STASK_ASSERT_ERR(_err)                VERIFY_ERR_HDLR(_err, TASK_RESTART)
 | 
					
						
							|  |  |  | #define STASK_ASSERT_ERR_HDLR(_err, _func)    VERIFY_ERR_HDLR(_err, _func; TASK_RESTART )
 | 
					
						
							| 
									
										
										
										
											2018-03-05 13:31:17 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 13:11:36 +07:00
										 |  |  | #define STASK_ASSERT(_cond)                   VERIFY_HDLR(_cond, TASK_RESTART)
 | 
					
						
							|  |  |  | #define STASK_ASSERT_HDLR(_cond, _func)       VERIFY_HDLR(_cond, _func; TASK_RESTART)
 | 
					
						
							| 
									
										
										
										
											2018-03-03 12:30:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:42:13 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // QUEUE API
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | typedef fifo_t* osal_queue_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline osal_queue_t osal_queue_create(uint32_t depth, uint32_t item_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   fifo_t* ff   = (fifo_t* ) tu_malloc( sizeof(fifo_t) ); | 
					
						
							|  |  |  |   uint8_t* buf = (uint8_t*) tu_malloc( depth*item_size ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   VERIFY( ff && buf, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   *ff = (fifo_t) { | 
					
						
							|  |  |  |     .buffer = buf, .depth = depth, .item_size = item_size, | 
					
						
							|  |  |  |     .count = 0, .wr_idx =0, .rd_idx = 0, .overwritable = false | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return (osal_queue_t) ff; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline bool osal_queue_send(osal_queue_t const queue_hdl, void const * data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return fifo_write( (fifo_t*) queue_hdl, data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void osal_queue_flush(osal_queue_t const queue_hdl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   queue_hdl->count = queue_hdl->rd_idx = queue_hdl->wr_idx = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define osal_queue_receive(queue_hdl, p_data, msec, p_error)                                \
 | 
					
						
							|  |  |  |   do {                                                                                      \ | 
					
						
							|  |  |  |     _timeout = tusb_hal_millis();                                                           \ | 
					
						
							|  |  |  |     _state = __LINE__; case __LINE__:                                                       \ | 
					
						
							|  |  |  |     if( queue_hdl->count == 0 ) {                                                           \ | 
					
						
							|  |  |  |       if ( (msec != OSAL_TIMEOUT_WAIT_FOREVER) && ( _timeout + msec <= tusb_hal_millis()) ) \ | 
					
						
							|  |  |  |         *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;                                               \ | 
					
						
							|  |  |  |       else                                                                                  \ | 
					
						
							|  |  |  |         return TUSB_ERROR_OSAL_WAITING;                                                     \ | 
					
						
							|  |  |  |     } else{                                                                                 \ | 
					
						
							|  |  |  |       /*tusb_hal_int_disable_all();*/                                                       \ | 
					
						
							|  |  |  |       fifo_read(queue_hdl, p_data);                                                         \ | 
					
						
							|  |  |  |       /*tusb_hal_int_enable_all();*/                                                            \ | 
					
						
							|  |  |  |       *(p_error) = TUSB_ERROR_NONE;                                                         \ | 
					
						
							|  |  |  |     }                                                                                       \ | 
					
						
							| 
									
										
										
										
											2018-03-01 11:42:13 +07:00
										 |  |  |   }while(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // Semaphore API
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   volatile uint16_t count; | 
					
						
							|  |  |  |            uint16_t max_count; | 
					
						
							|  |  |  | }osal_semaphore_data_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef osal_semaphore_data_t* osal_semaphore_t; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  | static inline osal_semaphore_t osal_semaphore_create(uint32_t max_count, uint32_t init) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  |   osal_semaphore_data_t* sem_data = (osal_semaphore_data_t*) tu_malloc( sizeof(osal_semaphore_data_t)); | 
					
						
							|  |  |  |   VERIFY(sem_data, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sem_data->count     = init; | 
					
						
							|  |  |  |   sem_data->max_count = max_count; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return sem_data; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:42:13 +07:00
										 |  |  | static inline  bool osal_semaphore_post(osal_semaphore_t sem_hdl) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  |   if (sem_hdl->count < sem_hdl->max_count ) sem_hdl->count++; | 
					
						
							| 
									
										
										
										
											2018-03-01 11:42:13 +07:00
										 |  |  |   return true; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  | static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  |   sem_hdl->count = 0; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 15:03:56 +07:00
										 |  |  | #define osal_semaphore_wait(sem_hdl, msec, p_error)                                        \
 | 
					
						
							|  |  |  |   do {                                                                                     \ | 
					
						
							|  |  |  |     _timeout = tusb_hal_millis();                                                          \ | 
					
						
							|  |  |  |     _state = __LINE__; case __LINE__:                                                      \ | 
					
						
							|  |  |  |     if( sem_hdl->count == 0 ) {                                                            \ | 
					
						
							|  |  |  |       if ( (msec != OSAL_TIMEOUT_WAIT_FOREVER) && (_timeout + msec <= tusb_hal_millis()) ) \ | 
					
						
							|  |  |  |         *(p_error) = TUSB_ERROR_OSAL_TIMEOUT;                                              \ | 
					
						
							|  |  |  |       else                                                                                 \ | 
					
						
							|  |  |  |         return TUSB_ERROR_OSAL_WAITING;                                                    \ | 
					
						
							|  |  |  |     } else{                                                                                \ | 
					
						
							|  |  |  |       /*tusb_hal_int_disable_all();*/                                                          \ | 
					
						
							|  |  |  |       sem_hdl->count--;                                                                    \ | 
					
						
							|  |  |  |       /*tusb_hal_int_enable_all();*/                                                           \ | 
					
						
							|  |  |  |       *(p_error) = TUSB_ERROR_NONE;                                                        \ | 
					
						
							|  |  |  |     }                                                                                      \ | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  |   }while(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // MUTEX API (priority inheritance)
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  | typedef osal_semaphore_t osal_mutex_t; | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  | static inline osal_mutex_t osal_mutex_create(void) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  |   return osal_semaphore_create(1, 0); | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 11:42:13 +07:00
										 |  |  | static inline bool osal_mutex_release(osal_mutex_t mutex_hdl) | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-01 11:17:11 +07:00
										 |  |  |   return osal_semaphore_post(mutex_hdl); | 
					
						
							| 
									
										
										
										
											2014-03-12 14:01:38 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define osal_mutex_wait osal_semaphore_wait
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _TUSB_OSAL_NONE_H_ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @} */ |