1/*
2 $License:
3    Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
4 $
5 */
6
7/*******************************************************************************
8 *
9 * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $
10 *
11 ******************************************************************************/
12
13/**
14 *  @defgroup MLOS
15 *  @brief OS Interface.
16 *
17 *  @{
18 *      @file mlos.c
19 *      @brief OS Interface.
20 */
21
22/* ------------- */
23/* - Includes. - */
24/* ------------- */
25
26#include <sys/time.h>
27#include <unistd.h>
28#include <pthread.h>
29#include <stdlib.h>
30#include <errno.h>
31
32#include "stdint_invensense.h"
33#include "mlos.h"
34
35
36/* -------------- */
37/* - Functions. - */
38/* -------------- */
39
40/**
41 *  @brief  Allocate space
42 *  @param  num_bytes  number of bytes
43 *  @return pointer to allocated space
44 */
45void *inv_malloc(unsigned int num_bytes)
46{
47    // Allocate space.
48    void *alloc_ptr = malloc(num_bytes);
49    return alloc_ptr;
50}
51
52
53/**
54 *  @brief  Free allocated space
55 *  @param  ptr pointer to space to deallocate
56 *  @return error code.
57 */
58inv_error_t inv_free(void *ptr)
59{
60    if (ptr)
61        free(ptr);
62    return INV_SUCCESS;
63}
64
65
66/**
67 *  @brief  Mutex create function
68 *  @param  mutex   pointer to mutex handle
69 *  @return error code.
70 */
71inv_error_t inv_create_mutex(HANDLE *mutex)
72{
73    int res;
74    pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t));
75    if(pm == NULL)
76        return INV_ERROR;
77
78    res = pthread_mutex_init(pm, NULL);
79    if(res == -1) {
80        free(pm);
81        return INV_ERROR_OS_CREATE_FAILED;
82    }
83
84    *mutex = (HANDLE)pm;
85
86    return INV_SUCCESS;
87}
88
89
90/**
91 *  @brief  Mutex lock function
92 *  @param  mutex   Mutex handle
93 *  @return error code.
94 */
95inv_error_t inv_lock_mutex(HANDLE mutex)
96{
97    int res;
98    pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
99
100    res = pthread_mutex_lock(pm);
101    if(res == -1)
102        return INV_ERROR_OS_LOCK_FAILED;
103
104    return INV_SUCCESS;
105}
106
107
108/**
109 *  @brief  Mutex unlock function
110 *  @param  mutex   mutex handle
111 *  @return error code.
112 */
113inv_error_t inv_unlock_mutex(HANDLE mutex)
114{
115    int res;
116    pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
117
118    res = pthread_mutex_unlock(pm);
119    if(res == -1)
120        return INV_ERROR_OS_LOCK_FAILED;
121
122    return INV_SUCCESS;
123}
124
125
126/**
127 *  @brief  open file
128 *  @param  filename    name of the file to open.
129 *  @return error code.
130 */
131FILE *inv_fopen(char *filename)
132{
133    FILE *fp = fopen(filename, "r");
134    return fp;
135}
136
137
138/**
139 *  @brief  close the file.
140 *  @param  fp  handle to file to close.
141 *  @return error code.
142 */
143void inv_fclose(FILE *fp)
144{
145    fclose(fp);
146}
147
148/**
149 *  @brief  Close Handle
150 *  @param  handle  handle to the resource.
151 *  @return Zero if success, an error code otherwise.
152 */
153inv_error_t inv_destroy_mutex(HANDLE handle)
154{
155    int error;
156    pthread_mutex_t *pm = (pthread_mutex_t *)handle;
157    error = pthread_mutex_destroy(pm);
158    if (error)
159        return errno;
160    free((void*) handle);
161
162    return INV_SUCCESS;}
163
164
165/**
166 *  @brief  Sleep function.
167 */
168void inv_sleep(int m_secs)
169{
170    usleep(m_secs * 1000);
171}
172
173
174/**
175 *  @brief  get system's internal tick count.
176 *          Used for time reference.
177 *  @return current tick count.
178 */
179unsigned long inv_get_tick_count()
180{
181    struct timeval tv;
182
183    if (gettimeofday(&tv, NULL) != 0)
184        return 0;
185
186    return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL);
187}
188
189/** @} */
190
191