/*******************************************************************************
* @file  rsi_os.h
* @brief 
*******************************************************************************
* # License
* <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
*******************************************************************************
*
* The licensor of this software is Silicon Laboratories Inc. Your use of this
* software is governed by the terms of Silicon Labs Master Software License
* Agreement (MSLA) available at
* www.silabs.com/about-us/legal/master-software-license-agreement. This
* software is distributed to you in Source Code format and is governed by the
* sections of the MSLA applicable to Source Code.
*
******************************************************************************/

#ifndef RSI_OS_H
#define RSI_OS_H
#include "rsi_error.h"
#include "rsi_data_types.h"
/******************************************************
 * *                      Macros
 * ******************************************************/
// Macro to increment a value
#define RSI_ATOMIC_INCREMENT(value) \
  {                                 \
    (value)++;                      \
  }

// Macro to decrement a value
#define RSI_ATOMIC_DECREMENT(value) \
  {                                 \
    (value)--;                      \
  }
// Error none (success)
#define RSI_ERR_NONE (0)

// Error returned when invalid arguments are given
#define RSI_ERR_INVALID_ARGS (1)

// Error returned when timeout error occurs
#define RSI_ERR_TIMEOUT (3)

// Mutex unlock value
#define RSI_NO_OS_MUTEX_UNLOCKED (0)

// Mutex lock value
#define RSI_NO_OS_MUTEX_LOCKED (1)

// Macro to set the mutex lock
#define RSI_NO_OS_ATOMIC_MUTEX_SET(mutex, value) (mutex) = value

// Macro for checking whether mutex is locked or not
#define RSI_NO_OS_ATOMIC_MUTEX_CHECK(mutex, value) (((mutex) == value) ? 1 : 0)
/******************************************************
 * *                    Constants
 * ******************************************************/
/******************************************************
 * *                   Enumerations
 * ******************************************************/
/******************************************************
 * *                 Type Definitions
 * ******************************************************/
typedef uint32_t rsi_reg_flags_t;
// Handle to manage Semaphores.
typedef uint32_t rsi_semaphore_handle_t;
// Handle to manage Mutex.
typedef uint32_t rsi_mutex_handle_t;

// Task handler
typedef void *rsi_task_handle_t;

typedef long rsi_base_type_t;
// Task function
typedef void (*rsi_task_function_t)(void *function);
/******************************************************
 * *                    Structures
 * ******************************************************/
/******************************************************
 * *                 Global Variables
 * ******************************************************/
/******************************************************
 * *               Function Declarations
 * ******************************************************/
/* --------- CRITICAL SECTION FUNCTIONS --------- */
rsi_reg_flags_t rsi_critical_section_entry(void);
void rsi_critical_section_exit(rsi_reg_flags_t flags);
/* --------------  MUTEX FUNCTIONS -------------- */
rsi_error_t rsi_mutex_create(rsi_mutex_handle_t *p_mutex);
rsi_error_t rsi_mutex_lock(volatile rsi_mutex_handle_t *p_mutex);
void rsi_mutex_lock_from_isr(volatile rsi_mutex_handle_t *mutex);
rsi_error_t rsi_mutex_unlock(volatile rsi_mutex_handle_t *p_mutex);
void rsi_mutex_unlock_from_isr(volatile rsi_mutex_handle_t *mutex);
rsi_error_t rsi_mutex_destroy(rsi_mutex_handle_t *p_mutex);

/*  ------------- SEMAPHORE FUNCTIONS ----------- */
rsi_error_t rsi_semaphore_create(rsi_semaphore_handle_t *p_sem, uint32_t cnt);
rsi_error_t rsi_semaphore_destroy(rsi_semaphore_handle_t *p_sem);
rsi_error_t rsi_semaphore_check_and_destroy(rsi_semaphore_handle_t *p_sem);
rsi_error_t rsi_semaphore_wait(rsi_semaphore_handle_t *p_sem, uint32_t timeout);
rsi_error_t rsi_semaphore_post(rsi_semaphore_handle_t *p_sem);
rsi_error_t rsi_semaphore_post_from_isr(rsi_semaphore_handle_t *semaphore);
rsi_error_t rsi_semaphore_reset(rsi_semaphore_handle_t *p_sem);

/*  ------------- TASK FUNCTIONS ----------- */
rsi_error_t rsi_task_create(rsi_task_function_t task_function,
                            uint8_t *task_name,
                            uint32_t stack_size,
                            void *parameters,
                            uint32_t task_priority,
                            rsi_task_handle_t *task_handle);

void rsi_task_destroy(rsi_task_handle_t *task_handle);
void rsi_task_delete(rsi_task_handle_t *task_handle);
void rsi_os_task_delay(uint32_t timeout_ms);
void rsi_task_suspend(rsi_task_handle_t *task_handle);
void rsi_start_os_scheduler(void);
void rsi_wireless_driver_task_create(void);
uint32_t rsi_ms_to_tick(uint32_t timeout_ms);
/*  ---------- OS MEMORY MAPPING FUNCTIONS -------- */
void *rsi_virtual_to_physical_address(void *x);
void *rsi_physical_to_virtual_address(void *x);
void *rsi_malloc(uint32_t size);
void rsi_free(void *p);
void rsi_vport_enter_critical(void);
void rsi_vport_exit_critical(void);
int32_t rsi_get_error(int32_t sockID);
void rsi_set_os_errno(int32_t error);
#endif

Typedefs#

typedef uint32_t
typedef uint32_t
typedef uint32_t
typedef void *
typedef long
typedef void(*
rsi_task_function_t)(void *function)

Functions#

rsi_reg_flags_t

Enter critical section.

void
rsi_critical_section_exit(rsi_reg_flags_t flags)

Exit critical section by restoring interrupts.

rsi_error_t
rsi_mutex_create(rsi_mutex_handle_t *p_mutex)

Create and initialize the mutex.

rsi_error_t
rsi_mutex_lock(volatile rsi_mutex_handle_t *p_mutex)

Lock the mutex.

void
rsi_mutex_lock_from_isr(volatile rsi_mutex_handle_t *mutex)

Lock the mutex from ISR context.

rsi_error_t
rsi_mutex_unlock(volatile rsi_mutex_handle_t *p_mutex)

Unlock the mutex.

void
rsi_mutex_unlock_from_isr(volatile rsi_mutex_handle_t *mutex)

Unlock the mutex from ISR context.

rsi_error_t
rsi_mutex_destroy(rsi_mutex_handle_t *p_mutex)

Destroy the mutex.

rsi_error_t
rsi_semaphore_create(rsi_semaphore_handle_t *p_sem, uint32_t cnt)

Create and initialize the semaphore instance.

rsi_error_t
rsi_semaphore_destroy(rsi_semaphore_handle_t *p_sem)

Destroy the semaphore instance.

rsi_error_t
rsi_semaphore_check_and_destroy(rsi_semaphore_handle_t *p_sem)

Checks whether the semaphore is created and destroys the semaphore instance, if its created.

rsi_error_t
rsi_semaphore_wait(rsi_semaphore_handle_t *p_sem, uint32_t timeout)

Wait for semaphore.

rsi_error_t
rsi_semaphore_post(rsi_semaphore_handle_t *p_sem)

Release semaphore, which is acquired.

rsi_error_t
rsi_semaphore_post_from_isr(rsi_semaphore_handle_t *semaphore)

Release semaphore, which is acquired from ISR context.

rsi_error_t
rsi_semaphore_reset(rsi_semaphore_handle_t *p_sem)
rsi_error_t
rsi_task_create(rsi_task_function_t task_function, uint8_t *task_name, uint32_t stack_size, void *parameters, uint32_t task_priority, rsi_task_handle_t *task_handle)

Create OS task/thread.

void
rsi_task_destroy(rsi_task_handle_t *task_handle)

Destroy the task created.

void
rsi_task_delete(rsi_task_handle_t *task_handle)
void
rsi_os_task_delay(uint32_t timeout_ms)

Induce required delay in milli seconds.

void
rsi_task_suspend(rsi_task_handle_t *task_handle)

Exit critical section.

void

Schedule the tasks created.

uint32_t
rsi_ms_to_tick(uint32_t timeout_ms)
void *

Map virtual address to physical address.

void *

Map physical address to virtual address.

void *
rsi_malloc(uint32_t size)

Allocate memory from the buffer which is maintained by freeRTOS.

void
rsi_free(void *p)

Free the memory pointed by 'ptr'.

void

Enter into critical section.

void

Enter exit section.

int32_t
rsi_get_error(int32_t sockID)

Get WLAN status.

void
rsi_set_os_errno(int32_t error)

Sets the OS error .

Typedef Documentation#

rsi_reg_flags_t#

typedef uint32_t rsi_reg_flags_t

rsi_semaphore_handle_t#

typedef uint32_t rsi_semaphore_handle_t

rsi_mutex_handle_t#

typedef uint32_t rsi_mutex_handle_t

rsi_task_handle_t#

typedef void* rsi_task_handle_t

rsi_base_type_t#

typedef long rsi_base_type_t

rsi_task_function_t#

typedef void(* rsi_task_function_t) (void *function) )(void *function)

Function Documentation#

rsi_critical_section_entry#

rsi_reg_flags_t rsi_critical_section_entry (void )

Enter critical section.

Parameters
TypeDirectionArgument NameDescription
void[in]

Returns

  • Interrupt status before entering critical section


rsi_critical_section_exit#

void rsi_critical_section_exit (rsi_reg_flags_t xflags)

Exit critical section by restoring interrupts.

Parameters
TypeDirectionArgument NameDescription
rsi_reg_flags_t[in]xflags

- Interrupt status to restore interrupt on exit from critical section

Returns

  • Void


rsi_mutex_create#

rsi_error_t rsi_mutex_create (rsi_mutex_handle_t * mutex)

Create and initialize the mutex.

Parameters
TypeDirectionArgument NameDescription
rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_mutex_lock#

rsi_error_t rsi_mutex_lock (volatile rsi_mutex_handle_t * mutex)

Lock the mutex.

Parameters
TypeDirectionArgument NameDescription
volatile rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_mutex_lock_from_isr#

void rsi_mutex_lock_from_isr (volatile rsi_mutex_handle_t * mutex)

Lock the mutex from ISR context.

Parameters
TypeDirectionArgument NameDescription
volatile rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_mutex_unlock#

rsi_error_t rsi_mutex_unlock (volatile rsi_mutex_handle_t * mutex)

Unlock the mutex.

Parameters
TypeDirectionArgument NameDescription
volatile rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_mutex_unlock_from_isr#

void rsi_mutex_unlock_from_isr (volatile rsi_mutex_handle_t * mutex)

Unlock the mutex from ISR context.

Parameters
TypeDirectionArgument NameDescription
volatile rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • None


rsi_mutex_destroy#

rsi_error_t rsi_mutex_destroy (rsi_mutex_handle_t * mutex)

Destroy the mutex.

Parameters
TypeDirectionArgument NameDescription
rsi_mutex_handle_t *[in]mutex

- Mutex handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_create#

rsi_error_t rsi_semaphore_create (rsi_semaphore_handle_t * semaphore, uint32_t count)

Create and initialize the semaphore instance.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

uint32_t[in]count

- Resource count

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_destroy#

rsi_error_t rsi_semaphore_destroy (rsi_semaphore_handle_t * semaphore)

Destroy the semaphore instance.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_check_and_destroy#

rsi_error_t rsi_semaphore_check_and_destroy (rsi_semaphore_handle_t * semaphore)

Checks whether the semaphore is created and destroys the semaphore instance, if its created.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

Check whether the semaphore is created and destroy, if created.

Returns

  • 0 - Success

  • Negative Value - Failure

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_wait#

rsi_error_t rsi_semaphore_wait (rsi_semaphore_handle_t * semaphore, uint32_t timeout_ms)

Wait for semaphore.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

uint32_t[in]timeout_ms

- Maximum time to wait to acquire semaphore. If timeout_ms is 0 then wait till semaphore is acquired.

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_post#

rsi_error_t rsi_semaphore_post (rsi_semaphore_handle_t * semaphore)

Release semaphore, which is acquired.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_post_from_isr#

rsi_error_t rsi_semaphore_post_from_isr (rsi_semaphore_handle_t * semaphore)

Release semaphore, which is acquired from ISR context.

Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *[in]semaphore

- Semaphore handle pointer

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_semaphore_reset#

rsi_error_t rsi_semaphore_reset (rsi_semaphore_handle_t * p_sem)
Parameters
TypeDirectionArgument NameDescription
rsi_semaphore_handle_t *N/Ap_sem

rsi_task_create#

rsi_error_t rsi_task_create (rsi_task_function_t task_function, uint8_t * task_name, uint32_t stack_size, void * parameters, uint32_t task_priority, rsi_task_handle_t * task_handle)

Create OS task/thread.

Parameters
TypeDirectionArgument NameDescription
rsi_task_function_t[in]task_function

- Pointer to function to be executed by created thread.

uint8_t *[in]task_name

- Name of the created task

uint32_t[in]stack_size

- Stack size given to the created task

void *[in]parameters

- Pointer to the parameters to be passed to task function

uint32_t[in]task_priority

- Task priority

rsi_task_handle_t *[in]task_handle

- Task handle/instance created

Returns

  • 0 - Success

  • Negative Value - Failure


rsi_task_destroy#

void rsi_task_destroy (rsi_task_handle_t * task_handle)

Destroy the task created.

Parameters
TypeDirectionArgument NameDescription
rsi_task_handle_t *[in]task_handle

- Task handle/instance to be deleted

Returns

  • Void


rsi_task_delete#

void rsi_task_delete (rsi_task_handle_t * task_handle)
Parameters
TypeDirectionArgument NameDescription
rsi_task_handle_t *N/Atask_handle

rsi_os_task_delay#

void rsi_os_task_delay (uint32_t timeout_ms)

Induce required delay in milli seconds.

Parameters
TypeDirectionArgument NameDescription
uint32_t[in]timeout_ms

- Expected delay in milli seconds

Returns

  • Void


rsi_task_suspend#

void rsi_task_suspend (rsi_task_handle_t * task_handle)

Exit critical section.

Parameters
TypeDirectionArgument NameDescription
rsi_task_handle_t *[in]task_handle

- Task handle to be suspended

Returns

  • Void


rsi_start_os_scheduler#

void rsi_start_os_scheduler (void )

Schedule the tasks created.

Parameters
TypeDirectionArgument NameDescription
void[in]

Returns

  • Void


rsi_wireless_driver_task_create#

void rsi_wireless_driver_task_create (void )
Parameters
TypeDirectionArgument NameDescription
voidN/A

rsi_ms_to_tick#

uint32_t rsi_ms_to_tick (uint32_t timeout_ms)
Parameters
TypeDirectionArgument NameDescription
uint32_tN/Atimeout_ms

rsi_virtual_to_physical_address#

void * rsi_virtual_to_physical_address (void * virtual_address)

Map virtual address to physical address.

Parameters
TypeDirectionArgument NameDescription
void *[in]virtual_address

- pointer to virtual address

Returns

  • void


rsi_physical_to_virtual_address#

void * rsi_physical_to_virtual_address (void * physical_address)

Map physical address to virtual address.

Parameters
TypeDirectionArgument NameDescription
void *[in]physical_address

- pointer to physical_address

Returns

  • void


rsi_malloc#

void * rsi_malloc (uint32_t size)

Allocate memory from the buffer which is maintained by freeRTOS.

Parameters
TypeDirectionArgument NameDescription
uint32_t[in]size

- Required bytes in size

Returns

  • Void


rsi_free#

void rsi_free (void * ptr)

Free the memory pointed by 'ptr'.

Parameters
TypeDirectionArgument NameDescription
void *[in]ptr

- starting address of the memory to be freed

Returns

  • Void


rsi_vport_enter_critical#

void rsi_vport_enter_critical (void )

Enter into critical section.

Parameters
TypeDirectionArgument NameDescription
void[in]

Returns

  • Void


rsi_vport_exit_critical#

void rsi_vport_exit_critical (void )

Enter exit section.

Parameters
TypeDirectionArgument NameDescription
void[in]

Returns

  • Void


rsi_get_error#

int32_t rsi_get_error (int32_t sockID)

Get WLAN status.

Parameters
TypeDirectionArgument NameDescription
int32_t[in]sockID

- Socket ID

Returns

  • WLAN status