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