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