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