142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* 242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru $License: 3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Copyright 2011 InvenSense, Inc. 4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall 5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License"); 6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License. 7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at 8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall 9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0 10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall 11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software 12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS, 13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and 15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License. 16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $ 1742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 1842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/******************************************************************************* 1942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * 2042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 2142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * 2242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru *******************************************************************************/ 2342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 2442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 2542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @defgroup MLOS 2642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief OS Interface. 2742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * 2842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @{ 2942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @file mlos.c 3042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief OS Interface. 3142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru**/ 3242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 3342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* ------------- */ 3442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* - Includes. - */ 3542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* ------------- */ 3642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 3742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include <sys/time.h> 3842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include <unistd.h> 3942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include <pthread.h> 4042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include <stdlib.h> 4142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 4242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include "stdint_invensense.h" 4342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 4442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include "mlos.h" 4542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru#include <errno.h> 4642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 4742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 4842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* -------------- */ 4942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* - Functions. - */ 5042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/* -------------- */ 5142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 5242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 5342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Allocate space 5442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param numBytes number of bytes 5542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return pointer to allocated space 5642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru**/ 5742331858975144405f95243be8427084ee7d478dJean-Baptiste Queruvoid *inv_malloc(unsigned int numBytes) 5842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 5942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru // Allocate space. 6042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru void *allocPtr = malloc(numBytes); 6142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return allocPtr; 6242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 6342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 6442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 6542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 6642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Free allocated space 6742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param ptr pointer to space to deallocate 6842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 6942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru**/ 7042331858975144405f95243be8427084ee7d478dJean-Baptiste Queruinv_error_t inv_free(void *ptr) 7142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 7242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru // Deallocate space. 7342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru free(ptr); 7442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 7542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_SUCCESS; 7642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 7742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 7842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 7942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 8042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Mutex create function 8142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param mutex pointer to mutex handle 8242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 8342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 8442331858975144405f95243be8427084ee7d478dJean-Baptiste Queruinv_error_t inv_create_mutex(HANDLE *mutex) 8542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 8642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru int res; 8742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t)); 8842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if(pm == NULL) 8942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_ERROR; 9042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 9142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru res = pthread_mutex_init(pm, NULL); 9242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if(res == -1) { 9342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru free(pm); 9442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_ERROR_OS_CREATE_FAILED; 9542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru } 9642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 9742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru *mutex = (HANDLE)pm; 9842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 9942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_SUCCESS; 10042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 10142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 10242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 10342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 10442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Mutex lock function 10542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param mutex Mutex handle 10642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 10742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 10842331858975144405f95243be8427084ee7d478dJean-Baptiste Queruinv_error_t inv_lock_mutex(HANDLE mutex) 10942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 11042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru int res; 11142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru pthread_mutex_t *pm = (pthread_mutex_t*)mutex; 11242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 11342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru res = pthread_mutex_lock(pm); 11442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if(res == -1) 11542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_ERROR_OS_LOCK_FAILED; 11642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 11742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_SUCCESS; 11842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 11942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 12042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 12142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 12242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Mutex unlock function 12342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param mutex mutex handle 12442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 12542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru**/ 12642331858975144405f95243be8427084ee7d478dJean-Baptiste Queruinv_error_t inv_unlock_mutex(HANDLE mutex) 12742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 12842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru int res; 12942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru pthread_mutex_t *pm = (pthread_mutex_t*)mutex; 13042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 13142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru res = pthread_mutex_unlock(pm); 13242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if(res == -1) 13342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_ERROR_OS_LOCK_FAILED; 13442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 13542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_SUCCESS; 13642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 13742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 13842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 13942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 14042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief open file 14142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param filename name of the file to open. 14242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 14342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 14442331858975144405f95243be8427084ee7d478dJean-Baptiste QueruFILE *inv_fopen(char *filename) 14542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 14642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru FILE *fp = fopen(filename,"r"); 14742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return fp; 14842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 14942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 15042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 15142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 15242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief close the file. 15342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param fp handle to file to close. 15442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return error code. 15542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 15642331858975144405f95243be8427084ee7d478dJean-Baptiste Queruvoid inv_fclose(FILE *fp) 15742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 15842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru fclose(fp); 15942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 16042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 16142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 16242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Close Handle 16342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @param handle handle to the resource. 16442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return Zero if success, an error code otherwise. 16542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 16642331858975144405f95243be8427084ee7d478dJean-Baptiste Queruinv_error_t inv_destroy_mutex(HANDLE handle) 16742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 16842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru int error; 16942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru pthread_mutex_t *pm = (pthread_mutex_t*)handle; 17042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru error = pthread_mutex_destroy(pm); 17142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if (error) { 17242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return errno; 17342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru } 17442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru free((void*) handle); 17542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 17642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return INV_SUCCESS;} 17742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 17842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 17942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 18042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief Sleep function. 18142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 18242331858975144405f95243be8427084ee7d478dJean-Baptiste Queruvoid inv_sleep(int mSecs) 18342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 18442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru usleep(mSecs*1000); 18542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 18642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 18742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 18842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/** 18942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @brief get system's internal tick count. 19042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * Used for time reference. 19142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru * @return current tick count. 19242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru */ 19342331858975144405f95243be8427084ee7d478dJean-Baptiste Queruunsigned long inv_get_tick_count() 19442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru{ 19542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru struct timeval tv; 19642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 19742331858975144405f95243be8427084ee7d478dJean-Baptiste Queru if (gettimeofday(&tv, NULL) !=0) 19842331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return 0; 19942331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 20042331858975144405f95243be8427084ee7d478dJean-Baptiste Queru return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL); 20142331858975144405f95243be8427084ee7d478dJean-Baptiste Queru} 20242331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 20342331858975144405f95243be8427084ee7d478dJean-Baptiste Queru /**********************/ 20442331858975144405f95243be8427084ee7d478dJean-Baptiste Queru /** @} */ /* defgroup */ 20542331858975144405f95243be8427084ee7d478dJean-Baptiste Queru/**********************/ 20642331858975144405f95243be8427084ee7d478dJean-Baptiste Queru 207