17494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* 27494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $License: 38504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall Copyright (C) 2012 InvenSense Corporation, All Rights Reserved. 47494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $ 57494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 68504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall 77494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/******************************************************************************* 87494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * 97494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * 118504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall ******************************************************************************/ 127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @defgroup MLOS 157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief OS Interface. 167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * 177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @{ 187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @file mlos.c 197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief OS Interface. 208504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall */ 217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* ------------- */ 237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* - Includes. - */ 247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* ------------- */ 257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <sys/time.h> 277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <unistd.h> 287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <pthread.h> 297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <stdlib.h> 308504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#include <errno.h> 317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "stdint_invensense.h" 337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "mlos.h" 347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* -------------- */ 377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* - Functions. - */ 387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* -------------- */ 397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Allocate space 428504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall * @param num_bytes number of bytes 437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return pointer to allocated space 448504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall */ 458504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrallvoid *inv_malloc(unsigned int num_bytes) 467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall // Allocate space. 488504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall void *alloc_ptr = malloc(num_bytes); 498504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall return alloc_ptr; 507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Free allocated space 557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param ptr pointer to space to deallocate 567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 578504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall */ 587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_free(void *ptr) 597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 608504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall if (ptr) 618504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall free(ptr); 627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_SUCCESS; 637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Mutex create function 687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param mutex pointer to mutex handle 697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_create_mutex(HANDLE *mutex) 727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall int res; 747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t)); 757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall if(pm == NULL) 767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_ERROR; 777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall res = pthread_mutex_init(pm, NULL); 797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall if(res == -1) { 807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall free(pm); 817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_ERROR_OS_CREATE_FAILED; 827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall } 837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *mutex = (HANDLE)pm; 857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_SUCCESS; 877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Mutex lock function 927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param mutex Mutex handle 937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_lock_mutex(HANDLE mutex) 967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall int res; 988504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall res = pthread_mutex_lock(pm); 1018504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall if(res == -1) 1027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_ERROR_OS_LOCK_FAILED; 1037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_SUCCESS; 1057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Mutex unlock function 1107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param mutex mutex handle 1117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 1128504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall */ 1137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_unlock_mutex(HANDLE mutex) 1147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall int res; 1168504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall pthread_mutex_t *pm = (pthread_mutex_t *)mutex; 1177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall res = pthread_mutex_unlock(pm); 1197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall if(res == -1) 1207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_ERROR_OS_LOCK_FAILED; 1217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_SUCCESS; 1237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief open file 1287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param filename name of the file to open. 1297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 1307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 1317494581689b0fc1d8addd016b1c92d74d01f5ad4JP AbgrallFILE *inv_fopen(char *filename) 1327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1338504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall FILE *fp = fopen(filename, "r"); 1347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return fp; 1357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief close the file. 1407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param fp handle to file to close. 1417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return error code. 1427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 1437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallvoid inv_fclose(FILE *fp) 1447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall fclose(fp); 1467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Close Handle 1507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param handle handle to the resource. 1517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return Zero if success, an error code otherwise. 1527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 1537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_destroy_mutex(HANDLE handle) 1547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall int error; 1568504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall pthread_mutex_t *pm = (pthread_mutex_t *)handle; 1577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall error = pthread_mutex_destroy(pm); 1588504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall if (error) 1597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return errno; 1607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall free((void*) handle); 1618504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall 1627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return INV_SUCCESS;} 1637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief Sleep function. 1677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 1688504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrallvoid inv_sleep(int m_secs) 1697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1708504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall usleep(m_secs * 1000); 1717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/** 1757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief get system's internal tick count. 1767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Used for time reference. 1777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return current tick count. 1787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */ 1797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallunsigned long inv_get_tick_count() 1807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{ 1817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall struct timeval tv; 1827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1838504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall if (gettimeofday(&tv, NULL) != 0) 1847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return 0; 1857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL); 1877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall} 1887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 1898504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall/** @} */ 1907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall 191