| /* |
| $License: |
| Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. |
| $ |
| */ |
| /******************************************************************************* |
| * |
| * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ |
| * |
| *******************************************************************************/ |
| |
| /** |
| * @defgroup MLOS |
| * @brief OS Interface. |
| * |
| * @{ |
| * @file mlos.c |
| * @brief OS Interface. |
| **/ |
| |
| /* ------------- */ |
| /* - Includes. - */ |
| /* ------------- */ |
| |
| #include <sys/time.h> |
| #include <unistd.h> |
| #include <pthread.h> |
| #include <stdlib.h> |
| |
| #include "stdint_invensense.h" |
| |
| #include "mlos.h" |
| #include <errno.h> |
| |
| |
| /* -------------- */ |
| /* - Functions. - */ |
| /* -------------- */ |
| |
| /** |
| * @brief Allocate space |
| * @param numBytes number of bytes |
| * @return pointer to allocated space |
| **/ |
| void *inv_malloc(unsigned int numBytes) |
| { |
| // Allocate space. |
| void *allocPtr = malloc(numBytes); |
| return allocPtr; |
| } |
| |
| |
| /** |
| * @brief Free allocated space |
| * @param ptr pointer to space to deallocate |
| * @return error code. |
| **/ |
| inv_error_t inv_free(void *ptr) |
| { |
| // Deallocate space. |
| free(ptr); |
| |
| return INV_SUCCESS; |
| } |
| |
| |
| /** |
| * @brief Mutex create function |
| * @param mutex pointer to mutex handle |
| * @return error code. |
| */ |
| inv_error_t inv_create_mutex(HANDLE *mutex) |
| { |
| int res; |
| pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t)); |
| if(pm == NULL) |
| return INV_ERROR; |
| |
| res = pthread_mutex_init(pm, NULL); |
| if(res == -1) { |
| free(pm); |
| return INV_ERROR_OS_CREATE_FAILED; |
| } |
| |
| *mutex = (HANDLE)pm; |
| |
| return INV_SUCCESS; |
| } |
| |
| |
| /** |
| * @brief Mutex lock function |
| * @param mutex Mutex handle |
| * @return error code. |
| */ |
| inv_error_t inv_lock_mutex(HANDLE mutex) |
| { |
| int res; |
| pthread_mutex_t *pm = (pthread_mutex_t*)mutex; |
| |
| res = pthread_mutex_lock(pm); |
| if(res == -1) |
| return INV_ERROR_OS_LOCK_FAILED; |
| |
| return INV_SUCCESS; |
| } |
| |
| |
| /** |
| * @brief Mutex unlock function |
| * @param mutex mutex handle |
| * @return error code. |
| **/ |
| inv_error_t inv_unlock_mutex(HANDLE mutex) |
| { |
| int res; |
| pthread_mutex_t *pm = (pthread_mutex_t*)mutex; |
| |
| res = pthread_mutex_unlock(pm); |
| if(res == -1) |
| return INV_ERROR_OS_LOCK_FAILED; |
| |
| return INV_SUCCESS; |
| } |
| |
| |
| /** |
| * @brief open file |
| * @param filename name of the file to open. |
| * @return error code. |
| */ |
| FILE *inv_fopen(char *filename) |
| { |
| FILE *fp = fopen(filename,"r"); |
| return fp; |
| } |
| |
| |
| /** |
| * @brief close the file. |
| * @param fp handle to file to close. |
| * @return error code. |
| */ |
| void inv_fclose(FILE *fp) |
| { |
| fclose(fp); |
| } |
| |
| /** |
| * @brief Close Handle |
| * @param handle handle to the resource. |
| * @return Zero if success, an error code otherwise. |
| */ |
| inv_error_t inv_destroy_mutex(HANDLE handle) |
| { |
| int error; |
| pthread_mutex_t *pm = (pthread_mutex_t*)handle; |
| error = pthread_mutex_destroy(pm); |
| if (error) { |
| return errno; |
| } |
| free((void*) handle); |
| |
| return INV_SUCCESS;} |
| |
| |
| /** |
| * @brief Sleep function. |
| */ |
| void inv_sleep(int mSecs) |
| { |
| usleep(mSecs*1000); |
| } |
| |
| |
| /** |
| * @brief get system's internal tick count. |
| * Used for time reference. |
| * @return current tick count. |
| */ |
| unsigned long inv_get_tick_count() |
| { |
| struct timeval tv; |
| |
| if (gettimeofday(&tv, NULL) !=0) |
| return 0; |
| |
| return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL); |
| } |
| |
| /**********************/ |
| /** @} */ /* defgroup */ |
| /**********************/ |
| |