1/* 2 $License: 3 Copyright (C) 2012 InvenSense Corporation, All Rights Reserved. 4 $ 5 */ 6 7/******************************************************************************* 8 * 9 * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 10 * 11 ******************************************************************************/ 12 13/** 14 * @defgroup MLOS 15 * @brief OS Interface. 16 * 17 * @{ 18 * @file mlos.c 19 * @brief OS Interface. 20 */ 21 22/* ------------- */ 23/* - Includes. - */ 24/* ------------- */ 25 26#include <sys/time.h> 27#include <unistd.h> 28#include <pthread.h> 29#include <stdlib.h> 30#include <errno.h> 31 32#include "stdint_invensense.h" 33#include "mlos.h" 34 35 36/* -------------- */ 37/* - Functions. - */ 38/* -------------- */ 39 40/** 41 * @brief Allocate space 42 * @param num_bytes number of bytes 43 * @return pointer to allocated space 44 */ 45void *inv_malloc(unsigned int num_bytes) 46{ 47 // Allocate space. 48 void *alloc_ptr = malloc(num_bytes); 49 return alloc_ptr; 50} 51 52 53/** 54 * @brief Free allocated space 55 * @param ptr pointer to space to deallocate 56 * @return error code. 57 */ 58inv_error_t inv_free(void *ptr) 59{ 60 if (ptr) 61 free(ptr); 62 return INV_SUCCESS; 63} 64 65 66/** 67 * @brief Mutex create function 68 * @param mutex pointer to mutex handle 69 * @return error code. 70 */ 71inv_error_t inv_create_mutex(HANDLE *mutex) 72{ 73 int res; 74 pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t)); 75 if(pm == NULL) 76 return INV_ERROR; 77 78 res = pthread_mutex_init(pm, NULL); 79 if(res == -1) { 80 free(pm); 81 return INV_ERROR_OS_CREATE_FAILED; 82 } 83 84 *mutex = (HANDLE)pm; 85 86 return INV_SUCCESS; 87} 88 89 90/** 91 * @brief Mutex lock function 92 * @param mutex Mutex handle 93 * @return error code. 94 */ 95inv_error_t inv_lock_mutex(HANDLE mutex) 96{ 97 int res; 98 pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 99 100 res = pthread_mutex_lock(pm); 101 if(res == -1) 102 return INV_ERROR_OS_LOCK_FAILED; 103 104 return INV_SUCCESS; 105} 106 107 108/** 109 * @brief Mutex unlock function 110 * @param mutex mutex handle 111 * @return error code. 112 */ 113inv_error_t inv_unlock_mutex(HANDLE mutex) 114{ 115 int res; 116 pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 117 118 res = pthread_mutex_unlock(pm); 119 if(res == -1) 120 return INV_ERROR_OS_LOCK_FAILED; 121 122 return INV_SUCCESS; 123} 124 125 126/** 127 * @brief open file 128 * @param filename name of the file to open. 129 * @return error code. 130 */ 131FILE *inv_fopen(char *filename) 132{ 133 FILE *fp = fopen(filename, "r"); 134 return fp; 135} 136 137 138/** 139 * @brief close the file. 140 * @param fp handle to file to close. 141 * @return error code. 142 */ 143void inv_fclose(FILE *fp) 144{ 145 fclose(fp); 146} 147 148/** 149 * @brief Close Handle 150 * @param handle handle to the resource. 151 * @return Zero if success, an error code otherwise. 152 */ 153inv_error_t inv_destroy_mutex(HANDLE handle) 154{ 155 int error; 156 pthread_mutex_t *pm = (pthread_mutex_t *)handle; 157 error = pthread_mutex_destroy(pm); 158 if (error) 159 return errno; 160 free((void*) handle); 161 162 return INV_SUCCESS;} 163 164 165/** 166 * @brief Sleep function. 167 */ 168void inv_sleep(int m_secs) 169{ 170 usleep(m_secs * 1000); 171} 172 173 174/** 175 * @brief get system's internal tick count. 176 * Used for time reference. 177 * @return current tick count. 178 */ 179unsigned long inv_get_tick_count() 180{ 181 struct timeval tv; 182 183 if (gettimeofday(&tv, NULL) != 0) 184 return 0; 185 186 return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL); 187} 188 189/** @} */ 190 191