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