149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $License: 349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow Copyright (C) 2012 InvenSense Corporation, All Rights Reserved. 449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $ 549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/******************************************************************************* 849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ******************************************************************************/ 1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @defgroup MLOS 1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief OS Interface. 1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @{ 1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @file mlos.c 1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief OS Interface. 2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* ------------- */ 2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* - Includes. - */ 2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* ------------- */ 2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <sys/time.h> 2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <unistd.h> 2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <pthread.h> 2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdlib.h> 3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <errno.h> 3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "stdint_invensense.h" 3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "mlos.h" 3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* -------------- */ 3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* - Functions. - */ 3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* -------------- */ 3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Allocate space 4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param num_bytes number of bytes 4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return pointer to allocated space 4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowvoid *inv_malloc(unsigned int num_bytes) 4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow // Allocate space. 4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow void *alloc_ptr = malloc(num_bytes); 4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return alloc_ptr; 5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Free allocated space 5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param ptr pointer to space to deallocate 5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_free(void *ptr) 5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (ptr) 6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow free(ptr); 6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_SUCCESS; 6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Mutex create function 6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param mutex pointer to mutex handle 6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_create_mutex(HANDLE *mutex) 7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int res; 7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t)); 7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if(pm == NULL) 7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_ERROR; 7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow res = pthread_mutex_init(pm, NULL); 7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if(res == -1) { 8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow free(pm); 8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_ERROR_OS_CREATE_FAILED; 8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *mutex = (HANDLE)pm; 8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_SUCCESS; 8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Mutex lock function 9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param mutex Mutex handle 9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_lock_mutex(HANDLE mutex) 9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int res; 9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow res = pthread_mutex_lock(pm); 10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if(res == -1) 10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_ERROR_OS_LOCK_FAILED; 10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_SUCCESS; 10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Mutex unlock function 11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param mutex mutex handle 11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_unlock_mutex(HANDLE mutex) 11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int res; 11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow res = pthread_mutex_unlock(pm); 11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if(res == -1) 12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_ERROR_OS_LOCK_FAILED; 12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_SUCCESS; 12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief open file 12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param filename name of the file to open. 12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 13149ea3e26ca3c6a779e527a0322e49a663333350aRosa ChowFILE *inv_fopen(char *filename) 13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow FILE *fp = fopen(filename, "r"); 13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return fp; 13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief close the file. 14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param fp handle to file to close. 14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return error code. 14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowvoid inv_fclose(FILE *fp) 14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fclose(fp); 14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Close Handle 15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param handle handle to the resource. 15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return Zero if success, an error code otherwise. 15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_destroy_mutex(HANDLE handle) 15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow int error; 15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow pthread_mutex_t *pm = (pthread_mutex_t *)handle; 15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow error = pthread_mutex_destroy(pm); 15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (error) 15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return errno; 16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow free((void*) handle); 16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return INV_SUCCESS;} 16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief Sleep function. 16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowvoid inv_sleep(int m_secs) 16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow usleep(m_secs * 1000); 17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** 17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief get system's internal tick count. 17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Used for time reference. 17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return current tick count. 17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowunsigned long inv_get_tick_count() 18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow struct timeval tv; 18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (gettimeofday(&tv, NULL) != 0) 18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return 0; 18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL); 18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/** @} */ 19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 191