blob: b2a93a5dba1833c79dcf22ff2db108ddcce99367 [file] [log] [blame]
Wolfgang Denk4646d2a2006-05-30 15:56:48 +02001/**
2 * @file IxOsal.h
3 *
4 * @brief Top include file for OSAL
5 *
6 *
7 * @par
8 * IXP400 SW Release version 2.0
9 *
10 * -- Copyright Notice --
11 *
12 * @par
13 * Copyright 2001-2005, Intel Corporation.
14 * All rights reserved.
15 *
16 * @par
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
25 * 3. Neither the name of the Intel Corporation nor the names of its contributors
26 * may be used to endorse or promote products derived from this software
27 * without specific prior written permission.
28 *
29 * @par
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
31 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * SUCH DAMAGE.
41 *
42 * @par
43 * -- End of Copyright Notice --
44 */
45
46#ifndef IxOsal_H
47#define IxOsal_H
48
49/* Basic types */
50#include "IxOsalTypes.h"
51
52/* Include assert */
53#include "IxOsalAssert.h"
54
55/*
56 * Config header gives users option to choose IO MEM
57 * and buffer management modules
58 */
59
60#include "IxOsalConfig.h"
61
62/*
63 * Symbol file needed by some OS.
64 */
65#include "IxOsalUtilitySymbols.h"
66
67/* OS-specific header */
68#include "IxOsalOs.h"
69
70
71/**
72 * @defgroup IxOsal Operating System Abstraction Layer (IxOsal) API
73 *
74 * @brief This service provides a thin layer of OS dependency services.
75 *
76 * This file contains the API to the functions which are some what OS dependant and would
77 * require porting to a particular OS.
78 * A primary focus of the component development is to make them as OS independent as possible.
79 * All other components should abstract their OS dependency to this module.
80 * Services overview
81 * -# Data types, constants, defines
82 * -# Interrupts
83 * - bind interrupts to handlers
84 * - unbind interrupts from handlers
85 * - disables all interrupts
86 * - enables all interrupts
87 * - selectively disables interrupts
88 * - enables an interrupt level
89 * - disables an interrupt level
90 * -# Memory
91 * - allocates memory
92 * - frees memory
93 * - copies memory zones
94 * - fills a memory zone
95 * - allocates cache-safe memory
96 * - frees cache-safe memory
97 * - physical to virtual address translation
98 * - virtual to physical address translation
99 * - cache to memory flush
100 * - cache line invalidate
101 * -# Threads
102 * - creates a new thread
103 * - starts a newly created thread
104 * - kills an existing thread
105 * - exits a running thread
106 * - sets the priority of an existing thread
107 * - suspends thread execution
108 * - resumes thread execution
109 * -# IPC
110 * - creates a message queue
111 * - deletes a message queue
112 * - sends a message to a message queue
113 * - receives a message from a message queue
114 * -# Thread Synchronisation
115 * - initializes a mutex
116 * - locks a mutex
117 * - unlocks a mutex
118 * - non-blocking attempt to lock a mutex
119 * - destroys a mutex object
120 * - initializes a fast mutex
121 * - non-blocking attempt to lock a fast mutex
122 * - unlocks a fast mutex
123 * - destroys a fast mutex object
124 * - initializes a semaphore
125 * - posts to (increments) a semaphore
126 * - waits on (decrements) a semaphore
127 * - non-blocking wait on semaphore
128 * - gets semaphore value
129 * - destroys a semaphore object
130 * - yields execution of current thread
131 * -# Time functions
132 * - yielding sleep for a number of milliseconds
133 * - busy sleep for a number of microseconds
134 * - value of the timestamp counter
135 * - resolution of the timestamp counter
136 * - system clock rate, in ticks
137 * - current system time
138 * - converts ixOsalTimeVal into ticks
139 * - converts ticks into ixOsalTimeVal
140 * - converts ixOsalTimeVal to milliseconds
141 * - converts milliseconds to IxOsalTimeval
142 * - "equal" comparison for IxOsalTimeval
143 * - "less than" comparison for IxOsalTimeval
144 * - "greater than" comparison for IxOsalTimeval
145 * - "add" operator for IxOsalTimeval
146 * - "subtract" operator for IxOsalTimeval
147 * -# Logging
148 * - sets the current logging verbosity level
149 * - interrupt-safe logging function
150 * -# Timer services
151 * - schedules a repeating timer
152 * - schedules a single-shot timer
153 * - cancels a running timer
154 * - displays all the running timers
155 * -# Optional Modules
156 * - Buffer management module
157 * - I/O memory and endianess support module
158 *
159 * @{
160 */
161
162
163/*
164 * Prototypes
165 */
166
167/* ========================== Interrupts ================================
168 *
169 */
170
171/**
172 * @ingroup IxOsal
173 *
174 * @brief Binds an interrupt handler to an interrupt level
175 *
176 * @param irqLevel (in) - interrupt level
177 * @param irqHandler (in) - interrupt handler
178 * @param parameter (in) - custom parameter to be passed to the
179 * interrupt handler
180 *
181 * Binds an interrupt handler to an interrupt level. The operation will
182 * fail if the wrong level is selected, if the handler is NULL, or if the
183 * interrupt is already bound. This functions binds the specified C
184 * routine to an interrupt level. When called, the "parameter" value will
185 * be passed to the routine.
186 *
187 * Reentrant: no
188 * IRQ safe: no
189 *
190 * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
191 */
192PUBLIC IX_STATUS ixOsalIrqBind (UINT32 irqLevel,
193 IxOsalVoidFnVoidPtr irqHandler,
194 void *parameter);
195
196/**
197 * @ingroup IxOsal
198 *
199 * @brief Unbinds an interrupt handler from an interrupt level
200 *
201 * @param irqLevel (in) - interrupt level
202 *
203 * Unbinds the selected interrupt level from any previously registered
204 * handler
205 *
206 * @li Reentrant: no
207 * @li IRQ safe: no
208 *
209 * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
210 */
211PUBLIC IX_STATUS ixOsalIrqUnbind (UINT32 irqLevel);
212
213
214/**
215 * @ingroup IxOsal
216 *
217 * @brief Disables all interrupts
218 *
219 * @param - none
220 *
221 * Disables all the interrupts and prevents tasks scheduling
222 *
223 * @li Reentrant: no
224 * @li IRQ safe: yes
225 *
226 * @return interrupt enable status prior to locking
227 */
228PUBLIC UINT32 ixOsalIrqLock (void);
229
230/**
231 * @ingroup IxOsal
232 *
233 * @brief Enables all interrupts
234 *
235 * @param irqEnable (in) - interrupt enable status, prior to interrupt
236 * locking
237 *
238 * Enables the interrupts and task scheduling, cancelling the effect
239 * of ixOsalIrqLock()
240 *
241 * @li Reentrant: no
242 * @li IRQ safe: yes
243 *
244 * @return IX_SUCCESS if the operation succeeded or IX_FAIL otherwise
245 */
246PUBLIC void ixOsalIrqUnlock (UINT32 irqEnable);
247
248/**
249 * @ingroup IxOsal
250 *
251 * @brief Selectively disables interrupts
252 *
253 * @param irqLevel ­ new interrupt level
254 *
255 * Disables the interrupts below the specified interrupt level
256 *
257 * @li Reentrant: no
258 * @li IRQ safe: yes
259 *
260 * @note Depending on the implementation this function can disable all
261 * the interrupts
262 *
263 * @return previous interrupt level
264 */
265PUBLIC UINT32 ixOsalIrqLevelSet (UINT32 irqLevel);
266
267/**
268 * @ingroup IxOsal
269 *
270 * @brief Enables an interrupt level
271 *
272 * @param irqLevel ­ interrupt level to enable
273 *
274 * Enables the specified interrupt level
275 *
276 * @li Reentrant: no
277 * @li IRQ safe: yes
278 *
279 * @return - none
280 */
281PUBLIC void ixOsalIrqEnable (UINT32 irqLevel);
282
283/**
284 * @ingroup IxOsal
285 *
286 * @brief Disables an interrupt level
287 *
288 * @param irqLevel ­ interrupt level to disable
289 *
290 * Disables the specified interrupt level
291 *
292 * @li Reentrant: no
293 * @li IRQ safe: yes
294 *
295 * @return - none
296 */
297PUBLIC void ixOsalIrqDisable (UINT32 irqLevel);
298
299
300/* ============================= Memory =================================
301 *
302 */
303
304/**
305 * @ingroup IxOsal
306 *
307 * @brief Allocates memory
308 *
309 * @param size - memory size to allocate, in bytes
310 *
311 * Allocates a memory zone of a given size
312 *
313 * @li Reentrant: no
314 * @li IRQ safe: no
315 *
316 * @return Pointer to the allocated zone or NULL if the allocation failed
317 */
318PUBLIC void *ixOsalMemAlloc (UINT32 size);
319
320/**
321 * @ingroup IxOsal
322 *
323 * @brief Frees memory
324 *
325 * @param ptr - pointer to the memory zone
326 *
327 * Frees a previously allocated memory zone
328 *
329 * @li Reentrant: no
330 * @li IRQ safe: no
331 *
332 * @return - none
333 */
334PUBLIC void ixOsalMemFree (void *ptr);
335
336/**
337 * @ingroup IxOsal
338 *
339 * @brief Copies memory zones
340 *
341 * @param dest - destination memory zone
342 * @param src - source memory zone
343 * @param count - number of bytes to copy
344 *
345 * Copies count bytes from the source memory zone pointed by src into the
346 * memory zone pointed by dest.
347 *
348 * @li Reentrant: no
349 * @li IRQ safe: yes
350 *
351 * @return Pointer to the destination memory zone
352 */
353PUBLIC void *ixOsalMemCopy (void *dest, void *src, UINT32 count);
354
355/**
356 * @ingroup IxOsal
357 *
358 * @brief Fills a memory zone
359 *
360 * @param ptr - pointer to the memory zone
361 * @param filler - byte to fill the memory zone with
362 * @param count - number of bytes to fill
363 *
364 * Fills a memory zone with a given constant byte
365 *
366 * @li Reentrant: no
367 * @li IRQ safe: yes
368 *
369 * @return Pointer to the memory zone
370 */
371PUBLIC void *ixOsalMemSet (void *ptr, UINT8 filler, UINT32 count);
372
373/**
374 * @ingroup IxOsal
375 *
376 * @brief Allocates cache-safe memory
377 *
378 * @param size - size, in bytes, of the allocated zone
379 *
380 * Allocates a cache-safe memory zone of at least "size" bytes and returns
381 * the pointer to the memory zone. This memory zone, depending on the
382 * platform, is either uncached or aligned on a cache line boundary to make
383 * the CACHE_FLUSH and CACHE_INVALIDATE macros safe to use. The memory
384 * allocated with this function MUST be freed with ixOsalCacheDmaFree(),
385 * otherwise memory corruption can occur.
386 *
387 * @li Reentrant: no
388 * @li IRQ safe: no
389 *
390 * @return Pointer to the memory zone or NULL if allocation failed
391 *
392 * @note It is important to note that cache coherence is maintained in
393 * software by using the IX_OSAL_CACHE_FLUSH and IX_OSAL_CACHE_INVALIDATE
394 * macros to maintain consistency between cache and external memory.
395 */
396PUBLIC void *ixOsalCacheDmaMalloc (UINT32 size);
397
398/* Macros for ixOsalCacheDmaMalloc*/
399#define IX_OSAL_CACHE_DMA_MALLOC(size) ixOsalCacheDmaMalloc(size)
400
401/**
402 * @ingroup IxOsal
403 *
404 * @brief Frees cache-safe memory
405 *
406 * @param ptr - pointer to the memory zone
407 *
408 * Frees a memory zone previously allocated with ixOsalCacheDmaMalloc()
409 *
410 * @li Reentrant: no
411 * @li IRQ safe: no
412 *
413 * @return - none
414 */
415PUBLIC void ixOsalCacheDmaFree (void *ptr);
416
417#define IX_OSAL_CACHE_DMA_FREE(ptr) ixOsalCacheDmaFree(ptr)
418
419/**
420 * @ingroup IxOsal
421 *
422 * @brief physical to virtual address translation
423 *
424 * @param physAddr - physical address
425 *
426 * Converts a physical address into its equivalent MMU-mapped virtual address
427 *
428 * @li Reentrant: no
429 * @li IRQ safe: yes
430 *
431 * @return Corresponding virtual address, as UINT32
432 */
433#define IX_OSAL_MMU_PHYS_TO_VIRT(physAddr) \
434 IX_OSAL_OS_MMU_PHYS_TO_VIRT(physAddr)
435
436
437/**
438 * @ingroup IxOsal
439 *
440 * @brief virtual to physical address translation
441 *
442 * @param virtAddr - virtual address
443 *
444 * Converts a virtual address into its equivalent MMU-mapped physical address
445 *
446 * @li Reentrant: no
447 * @li IRQ safe: yes
448 *
449 * @return Corresponding physical address, as UINT32
450 */
451#define IX_OSAL_MMU_VIRT_TO_PHYS(virtAddr) \
452 IX_OSAL_OS_MMU_VIRT_TO_PHYS(virtAddr)
453
454
455
456/**
457 * @ingroup IxOsal
458 *
459 * @brief cache to memory flush
460 *
461 * @param addr - memory address to flush from cache
462 * @param size - number of bytes to flush (rounded up to a cache line)
463 *
464 * Flushes the cached value of the memory zone pointed by "addr" into memory,
465 * rounding up to a cache line. Use before the zone is to be read by a
466 * processing unit which is not cache coherent with the main CPU.
467 *
468 * @li Reentrant: no
469 * @li IRQ safe: yes
470 *
471 * @return - none
472 */
473#define IX_OSAL_CACHE_FLUSH(addr, size) IX_OSAL_OS_CACHE_FLUSH(addr, size)
474
475
476
477/**
478 * @ingroup IxOsal
479 *
480 * @brief cache line invalidate
481 *
482 * @param addr - memory address to invalidate in cache
483 * @param size - number of bytes to invalidate (rounded up to a cache line)
484 *
485 * Invalidates the cached value of the memory zone pointed by "addr",
486 * rounding up to a cache line. Use before reading the zone from the main
487 * CPU, if the zone has been updated by a processing unit which is not cache
488 * coherent with the main CPU.
489 *
490 * @li Reentrant: no
491 * @li IRQ safe: yes
492 *
493 * @return - none
494 */
495#define IX_OSAL_CACHE_INVALIDATE(addr, size) IX_OSAL_OS_CACHE_INVALIDATE(addr, size)
496
497
498/* ============================= Threads =================================
499 *
500 */
501
502/**
503 * @ingroup IxOsal
504 *
505 * @brief Creates a new thread
506 *
507 * @param thread - handle of the thread to be created
508 * @param threadAttr - pointer to a thread attribute object
509 * @param startRoutine - thread entry point
510 * @param arg - argument given to the thread
511 *
512 * Creates a thread given a thread handle and a thread attribute object. The
513 * same thread attribute object can be used to create separate threads. "NULL"
514 * can be specified as the attribute, in which case the default values will
515 * be used. The thread needs to be explicitly started using ixOsalThreadStart().
516 *
517 * @li Reentrant: no
518 * @li IRQ safe: no
519 *
520 * @return - IX_SUCCESS/IX_FAIL
521 */
522PUBLIC IX_STATUS ixOsalThreadCreate (IxOsalThread * thread,
523 IxOsalThreadAttr * threadAttr,
524 IxOsalVoidFnVoidPtr startRoutine,
525 void *arg);
526
527/**
528 * @ingroup IxOsal
529 *
530 * @brief Starts a newly created thread
531 *
532 * @param thread - handle of the thread to be started
533 *
534 * Starts a thread given its thread handle. This function is to be called
535 * only once, following the thread initialization.
536 *
537 * @li Reentrant: no
538 * @li IRQ safe: no
539 *
540 * @return - IX_SUCCESS/IX_FAIL
541 */
542PUBLIC IX_STATUS ixOsalThreadStart (IxOsalThread * thread);
543
544/**
545 * @ingroup IxOsal
546 *
547 * @brief Kills an existing thread
548 *
549 * @param thread - handle of the thread to be killed
550 *
551 * Kills a thread given its thread handle.
552 *
553 * @li Reentrant: no
554 * @li IRQ safe: no
555 *
556 * @note It is not possible to kill threads in Linux kernel mode. This
557 * function will only send a SIGTERM signal, and it is the responsibility
558 * of the thread to check for the presence of this signal with
559 * signal_pending().
560 *
561 * @return - IX_SUCCESS/IX_FAIL
562 */
563PUBLIC IX_STATUS ixOsalThreadKill (IxOsalThread * thread);
564
565/**
566 * @ingroup IxOsal
567 *
568 * @brief Exits a running thread
569 *
570 * Terminates the calling thread
571 *
572 * @li Reentrant: no
573 * @li IRQ safe: no
574 *
575 * @return - This function never returns
576 */
577PUBLIC void ixOsalThreadExit (void);
578
579/**
580 * @ingroup IxOsal
581 *
582 * @brief Sets the priority of an existing thread
583 *
584 * @param thread - handle of the thread
585 * @param priority - new priority, between 0 and 255 (0 being the highest)
586 *
587 * Sets the thread priority
588 *
589 * @li Reentrant: no
590 * @li IRQ safe: no
591 *
592 * @return - IX_SUCCESS/IX_FAIL
593 */
594PUBLIC IX_STATUS ixOsalThreadPrioritySet (IxOsalThread * thread,
595 UINT32 priority);
596
597/**
598 * @ingroup IxOsal
599 *
600 * @brief Suspends thread execution
601 *
602 * @param thread - handle of the thread
603 *
604 * Suspends the thread execution
605 *
606 * @li Reentrant: no
607 * @li IRQ safe: no
608 *
609 * @return - IX_SUCCESS/IX_FAIL
610 */
611PUBLIC IX_STATUS ixOsalThreadSuspend (IxOsalThread * thread);
612
613/**
614 * @ingroup IxOsal
615 *
616 * @brief Resumes thread execution
617 *
618 * @param thread - handle of the thread
619 *
620 * Resumes the thread execution
621 *
622 * @li Reentrant: no
623 * @li IRQ safe: no
624 *
625 * @return - IX_SUCCESS/IX_FAIL
626 */
627PUBLIC IX_STATUS ixOsalThreadResume (IxOsalThread * thread);
628
629
630/* ======================= Message Queues (IPC) ==========================
631 *
632 */
633
634/**
635 * @ingroup IxOsal
636 *
637 * @brief Creates a message queue
638 *
639 * @param queue - queue handle
640 * @param msgCount - maximum number of messages to hold in the queue
641 * @param msgLen - maximum length of each message, in bytes
642 *
643 * Creates a message queue of msgCount messages, each containing msgLen bytes
644 *
645 * @li Reentrant: no
646 * @li IRQ safe: no
647 *
648 * @return - IX_SUCCESS/IX_FAIL
649 */
650PUBLIC IX_STATUS ixOsalMessageQueueCreate (IxOsalMessageQueue * queue,
651 UINT32 msgCount, UINT32 msgLen);
652
653/**
654 * @ingroup IxOsal
655 *
656 * @brief Deletes a message queue
657 *
658 * @param queue - queue handle
659 *
660 * Deletes a message queue
661 *
662 * @li Reentrant: no
663 * @li IRQ safe: no
664 *
665 * @return - IX_SUCCESS/IX_FAIL
666 */
667PUBLIC IX_STATUS ixOsalMessageQueueDelete (IxOsalMessageQueue * queue);
668
669/**
670 * @ingroup IxOsal
671 *
672 * @brief Sends a message to a message queue
673 *
674 * @param queue - queue handle
675 * @param message - message to send
676 *
677 * Sends a message to the message queue. The message will be copied (at the
678 * configured size of the message) into the queue.
679 *
680 * @li Reentrant: yes
681 * @li IRQ safe: yes
682 *
683 * @return - IX_SUCCESS/IX_FAIL
684 */
685PUBLIC IX_STATUS ixOsalMessageQueueSend (IxOsalMessageQueue * queue,
686 UINT8 * message);
687
688/**
689 * @ingroup IxOsal
690 *
691 * @brief Receives a message from a message queue
692 *
693 * @param queue - queue handle
694 * @param message - pointer to where the message should be copied to
695 *
696 * Retrieves the first message from the message queue
697 *
698 * @li Reentrant: yes
699 * @li IRQ safe: yes
700 *
701 * @return - IX_SUCCESS/IX_FAIL
702 */
703PUBLIC IX_STATUS ixOsalMessageQueueReceive (IxOsalMessageQueue * queue,
704 UINT8 * message);
705
706
707/* ======================= Thread Synchronisation ========================
708 *
709 */
710
711/**
712 * @ingroup IxOsal
713 *
714 * @brief initializes a mutex
715 *
716 * @param mutex - mutex handle
717 *
718 * Initializes a mutex object
719 *
720 * @li Reentrant: no
721 * @li IRQ safe: no
722 *
723 * @return - IX_SUCCESS/IX_FAIL
724 */
725PUBLIC IX_STATUS ixOsalMutexInit (IxOsalMutex * mutex);
726
727/**
728 * @ingroup IxOsal
729 *
730 * @brief locks a mutex
731 *
732 * @param mutex - mutex handle
733 * @param timeout - timeout in ms; IX_OSAL_WAIT_FOREVER (-1) to wait forever
734 * or IX_OSAL_WAIT_NONE to return immediately
735 *
736 * Locks a mutex object
737 *
738 * @li Reentrant: yes
739 * @li IRQ safe: no
740 *
741 * @return - IX_SUCCESS/IX_FAIL
742 */
743PUBLIC IX_STATUS ixOsalMutexLock (IxOsalMutex * mutex, INT32 timeout);
744
745/**
746 * @ingroup IxOsal
747 *
748 * @brief Unlocks a mutex
749 *
750 * @param mutex - mutex handle
751 *
752 * Unlocks a mutex object
753 *
754 * @li Reentrant: yes
755 * @li IRQ safe: yes
756 *
757 * @return - IX_SUCCESS/IX_FAIL
758 */
759PUBLIC IX_STATUS ixOsalMutexUnlock (IxOsalMutex * mutex);
760
761/**
762 * @ingroup IxOsal
763 *
764 * @brief Non-blocking attempt to lock a mutex
765 *
766 * @param mutex - mutex handle
767 *
768 * Attempts to lock a mutex object, returning immediately with IX_SUCCESS if
769 * the lock was successful or IX_FAIL if the lock failed
770 *
771 * @li Reentrant: yes
772 * @li IRQ safe: no
773 *
774 * @return - IX_SUCCESS/IX_FAIL
775 */
776PUBLIC IX_STATUS ixOsalMutexTryLock (IxOsalMutex * mutex);
777
778/**
779 * @ingroup IxOsal
780 *
781 * @brief Destroys a mutex object
782 *
783 * @param mutex - mutex handle
784 * @param
785 *
786 * Destroys a mutex object; the caller should ensure that no thread is
787 * blocked on this mutex
788 *
789 * @li Reentrant: no
790 * @li IRQ safe: no
791 *
792 * @return - IX_SUCCESS/IX_FAIL
793 */
794PUBLIC IX_STATUS ixOsalMutexDestroy (IxOsalMutex * mutex);
795
796/**
797 * @ingroup IxOsal
798 *
799 * @brief Initializes a fast mutex
800 *
801 * @param mutex - fast mutex handle
802 *
803 * Initializes a fast mutex object
804 *
805 * @li Reentrant: yes
806 * @li IRQ safe: yes
807 *
808 * @return - IX_SUCCESS/IX_FAIL
809 */
810PUBLIC IX_STATUS ixOsalFastMutexInit (IxOsalFastMutex * mutex);
811
812/**
813 * @ingroup IxOsal
814 *
815 * @brief Non-blocking attempt to lock a fast mutex
816 *
817 * @param mutex - fast mutex handle
818 *
819 * Attempts to lock a fast mutex object, returning immediately with
820 * IX_SUCCESS if the lock was successful or IX_FAIL if the lock failed
821 *
822 * @li Reentrant: yes
823 * @li IRQ safe: yes
824 *
825 * @return - IX_SUCCESS/IX_FAIL
826 */
827PUBLIC IX_STATUS ixOsalFastMutexTryLock (IxOsalFastMutex * mutex);
828
829/**
830 * @ingroup IxOsal
831 *
832 * @brief Unlocks a fast mutex
833 *
834 * @param mutex - fast mutex handle
835 *
836 * Unlocks a fast mutex object
837 *
838 * @li Reentrant: yes
839 * @li IRQ safe: yes
840 *
841 * @return - IX_SUCCESS/IX_FAIL
842 */
843PUBLIC IX_STATUS ixOsalFastMutexUnlock (IxOsalFastMutex * mutex);
844
845/**
846 * @ingroup IxOsal
847 *
848 * @brief Destroys a fast mutex object
849 *
850 * @param mutex - fast mutex handle
851 *
852 * Destroys a fast mutex object
853 *
854 * @li Reentrant: yes
855 * @li IRQ safe: yes
856 *
857 * @return - IX_SUCCESS/IX_FAIL
858 */
859PUBLIC IX_STATUS ixOsalFastMutexDestroy (IxOsalFastMutex * mutex);
860
861/**
862 * @ingroup IxOsal
863 *
864 * @brief Initializes a semaphore
865 *
866 * @param semaphore - semaphore handle
867 * @param value - initial semaphore value
868 *
869 * Initializes a semaphore object
870 *
871 * @li Reentrant: no
872 * @li IRQ safe: no
873 *
874 * @return - IX_SUCCESS/IX_FAIL
875 */
876PUBLIC IX_STATUS ixOsalSemaphoreInit (IxOsalSemaphore * semaphore,
877 UINT32 value);
878
879/**
880 * @ingroup IxOsal
881 *
882 * @brief Posts to (increments) a semaphore
883 *
884 * @param semaphore - semaphore handle
885 *
886 * Increments a semaphore object
887 *
888 * @li Reentrant: no
889 * @li IRQ safe: yes
890 *
891 * @return - IX_SUCCESS/IX_FAIL
892 */
893PUBLIC IX_STATUS ixOsalSemaphorePost (IxOsalSemaphore * semaphore);
894
895/**
896 * @ingroup IxOsal
897 *
898 * @brief Waits on (decrements) a semaphore
899 *
900 * @param semaphore - semaphore handle
901 * @param timeout - timeout, in ms; IX_OSAL_WAIT_FOREVER (-1) if the thread
902 * is to block indefinitely or IX_OSAL_WAIT_NONE (0) if the thread is to
903 * return immediately even if the call fails
904 *
905 * Decrements a semaphore, blocking if the semaphore is
906 * unavailable (value is 0).
907 *
908 * @li Reentrant: no
909 * @li IRQ safe: no
910 *
911 * @return - IX_SUCCESS/IX_FAIL
912 */
913PUBLIC IX_STATUS ixOsalSemaphoreWait (IxOsalSemaphore * semaphore,
914 INT32 timeout);
915
916/**
917 * @ingroup IxOsal
918 *
919 * @brief Non-blocking wait on semaphore
920 *
921 * @param semaphore - semaphore handle
922 *
923 * Decrements a semaphore, not blocking the calling thread if the semaphore
924 * is unavailable
925 *
926 * @li Reentrant: no
927 * @li IRQ safe: no
928 *
929 * @return - IX_SUCCESS/IX_FAIL
930 */
931PUBLIC IX_STATUS ixOsalSemaphoreTryWait (IxOsalSemaphore * semaphore);
932
933/**
934 * @ingroup IxOsal
935 *
936 * @brief Gets semaphore value
937 *
938 * @param semaphore - semaphore handle
939 * @param value - location to store the semaphore value
940 *
941 * Retrieves the current value of a semaphore object
942 *
943 * @li Reentrant: no
944 * @li IRQ safe: no
945 *
946 * @return - IX_SUCCESS/IX_FAIL
947 */
948PUBLIC IX_STATUS ixOsalSemaphoreGetValue (IxOsalSemaphore * semaphore,
949 UINT32 * value);
950
951/**
952 * @ingroup IxOsal
953 *
954 * @brief Destroys a semaphore object
955 *
956 * @param semaphore - semaphore handle
957 *
958 * Destroys a semaphore object; the caller should ensure that no thread is
959 * blocked on this semaphore
960 *
961 * @li Reentrant: no
962 * @li IRQ safe: no
963 *
964 * @return - IX_SUCCESS/IX_FAIL
965 */
966PUBLIC IX_STATUS ixOsalSemaphoreDestroy (IxOsalSemaphore * semaphore);
967
968/**
969 * @ingroup IxOsal
970 *
971 * @brief Yields execution of current thread
972 *
973 * Yields the execution of the current thread
974 *
975 * @li Reentrant: no
976 * @li IRQ safe: no
977 *
978 * @return - none
979 */
980PUBLIC void ixOsalYield (void);
981
982
983/* ========================== Time functions ===========================
984 *
985 */
986
987/**
988 * @ingroup IxOsal
989 *
990 * @brief Yielding sleep for a number of milliseconds
991 *
992 * @param milliseconds - number of milliseconds to sleep
993 *
994 * The calling thread will sleep for the specified number of milliseconds.
995 * This sleep is yielding, hence other tasks will be scheduled by the
996 * operating system during the sleep period. Calling this function with an
997 * argument of 0 will place the thread at the end of the current scheduling
998 * loop.
999 *
1000 * @li Reentrant: no
1001 * @li IRQ safe: no
1002 *
1003 * @return - none
1004 */
1005PUBLIC void ixOsalSleep (UINT32 milliseconds);
1006
1007/**
1008 * @ingroup IxOsal
1009 *
1010 * @brief Busy sleep for a number of microseconds
1011 *
1012 * @param microseconds - number of microseconds to sleep
1013 *
1014 * Sleeps for the specified number of microseconds, without explicitly
1015 * yielding thread execution to the OS scheduler
1016 *
1017 * @li Reentrant: yes
1018 * @li IRQ safe: yes
1019 *
1020 * @return - none
1021 */
1022PUBLIC void ixOsalBusySleep (UINT32 microseconds);
1023
1024/**
1025 * @ingroup IxOsal
1026 *
1027 * @brief XXX
1028 *
1029 * Retrieves the current timestamp
1030 *
1031 * @li Reentrant: yes
1032 * @li IRQ safe: yes
1033 *
1034 * @return - The current timestamp
1035 *
1036 * @note The implementation of this function is platform-specific. Not
1037 * all the platforms provide a high-resolution timestamp counter.
1038 */
1039PUBLIC UINT32 ixOsalTimestampGet (void);
1040
1041/**
1042 * @ingroup IxOsal
1043 *
1044 * @brief Resolution of the timestamp counter
1045 *
1046 * Retrieves the resolution (frequency) of the timestamp counter.
1047 *
1048 * @li Reentrant: yes
1049 * @li IRQ safe: yes
1050 *
1051 * @return - The resolution of the timestamp counter
1052 *
1053 * @note The implementation of this function is platform-specific. Not all
1054 * the platforms provide a high-resolution timestamp counter.
1055 */
1056PUBLIC UINT32 ixOsalTimestampResolutionGet (void);
1057
1058/**
1059 * @ingroup IxOsal
1060 *
1061 * @brief System clock rate, in ticks
1062 *
1063 * Retrieves the resolution (number of ticks per second) of the system clock
1064 *
1065 * @li Reentrant: no
1066 * @li IRQ safe: no
1067 *
1068 * @return - The system clock rate
1069 *
1070 * @note The implementation of this function is platform and OS-specific.
1071 * The system clock rate is not always available - e.g. Linux does not
1072 * provide this information in user mode
1073 */
1074PUBLIC UINT32 ixOsalSysClockRateGet (void);
1075
1076/**
1077 * @ingroup IxOsal
1078 *
1079 * @brief Current system time
1080 *
1081 * @param tv - pointer to an IxOsalTimeval structure to store the current
1082 * time in
1083 *
1084 * Retrieves the current system time (real-time)
1085 *
1086 * @li Reentrant: no
1087 * @li IRQ safe: no
1088 *
1089 * @return - none
1090 *
1091 * @note The implementation of this function is platform-specific. Not all
1092 * platforms have a real-time clock.
1093 */
1094PUBLIC void ixOsalTimeGet (IxOsalTimeval * tv);
1095
1096
1097
1098/* Internal function to convert timer val to ticks.
1099 * NOTE - This should not be called by the user.
1100 * Use the macro IX_OSAL_TIMEVAL_TO_TICKS
1101 * OS-independent, implemented in framework.
1102 */
1103PUBLIC UINT32 ixOsalTimevalToTicks (IxOsalTimeval tv);
1104
1105
1106/**
1107 * @ingroup IxOsal
1108 *
1109 * @brief Converts ixOsalTimeVal into ticks
1110 *
1111 * @param tv - an IxOsalTimeval structure
1112 *
1113 * Converts an IxOsalTimeval structure into OS ticks
1114 *
1115 * @li Reentrant: yes
1116 * @li IRQ safe: yes
1117 *
1118 * @return - Corresponding number of ticks
1119 *
1120 * Note: This function is OS-independent. Implemented by core.
1121 */
1122#define IX_OSAL_TIMEVAL_TO_TICKS(tv) ixOsalTimevalToTicks(tv)
1123
1124
1125
1126/* Internal function to convert ticks to timer val
1127 * NOTE - This should not be called by the user.
1128 * Use the macro IX_OSAL_TICKS_TO_TIMEVAL
1129 */
1130
1131PUBLIC void ixOsalTicksToTimeval (UINT32 ticks, IxOsalTimeval * pTv);
1132
1133
1134/**
1135 * @ingroup IxOsal
1136 *
1137 * @brief Converts ticks into ixOsalTimeVal
1138 *
1139 * @param ticks - number of ticks
1140 * @param pTv - pointer to the destination structure
1141 *
1142 * Converts the specified number of ticks into an IxOsalTimeval structure
1143 *
1144 * @li Reentrant: yes
1145 * @li IRQ safe: yes
1146 *
1147 * @return - Corresponding IxOsalTimeval structure
1148 * Note: This function is OS-independent. Implemented by core.
1149 */
1150#define IX_OSAL_TICKS_TO_TIMEVAL(ticks, pTv) \
1151 ixOsalTicksToTimeval(ticks, pTv)
1152
1153
1154
1155
1156/**
1157 * @ingroup IxOsal
1158 *
1159 * @brief Converts ixOsalTimeVal to milliseconds
1160 *
1161 * @param tv - IxOsalTimeval structure to convert
1162 *
1163 * Converts an IxOsalTimeval structure into milliseconds
1164 *
1165 * @li Reentrant: yes
1166 * @li IRQ safe: yes
1167 *
1168 * @return - Corresponding number of milliseconds
1169 * Note: This function is OS-independent. Implemented by core.
1170 */
1171#define IX_OSAL_TIMEVAL_TO_MS(tv) ((tv.secs * 1000) + (tv.nsecs / 1000000))
1172
1173
1174/**
1175 * @ingroup IxOsal
1176 *
1177 * @brief Converts milliseconds to IxOsalTimeval
1178 *
1179 * @param milliseconds - number of milliseconds to convert
1180 * @param pTv - pointer to the destination structure
1181 *
1182 * Converts a millisecond value into an IxOsalTimeval structure
1183 *
1184 * @li Reentrant: yes
1185 * @li IRQ safe: yes
1186 *
1187 * @return - Corresponding IxOsalTimeval structure
1188 * Note: This function is OS-independent. Implemented by core.
1189 */
1190#define IX_OSAL_MS_TO_TIMEVAL(milliseconds, pTv) \
1191 ((IxOsalTimeval *) pTv)->secs = milliseconds / 1000; \
1192 ((IxOsalTimeval *) pTv)->nsecs = (milliseconds % 1000) * 1000000
1193
1194
1195/**
1196 * @ingroup IxOsal
1197 *
1198 * @brief "equal" comparison for IxOsalTimeval
1199 *
1200 * @param tvA, tvB - IxOsalTimeval structures to compare
1201 *
1202 * Compares two IxOsalTimeval structures for equality
1203 *
1204 * @li Reentrant: yes
1205 * @li IRQ safe: yes
1206 *
1207 * @return - TRUE if the structures are equal
1208 * - FALSE otherwise
1209 * Note: This function is OS-independant
1210 */
1211#define IX_OSAL_TIME_EQ(tvA, tvB) \
1212 ((tvA).secs == (tvB).secs && (tvA).nsecs == (tvB).nsecs)
1213
1214
1215/**
1216 * @ingroup IxOsal
1217 *
1218 * @brief "less than" comparison for IxOsalTimeval
1219 *
1220 * @param tvA, tvB - IxOsalTimeval structures to compare
1221 *
1222 * Compares two IxOsalTimeval structures to determine if the first one is
1223 * less than the second one
1224 *
1225 * @li Reentrant: yes
1226 * @li IRQ safe: yes
1227 *
1228 * @return - TRUE if tvA < tvB
1229 * - FALSE otherwise
1230 * Note: This function is OS-independent. Implemented by core.
1231 */
1232#define IX_OSAL_TIME_LT(tvA,tvB) \
1233 ((tvA).secs < (tvB).secs || \
1234 ((tvA).secs == (tvB).secs && (tvA).nsecs < (tvB).nsecs))
1235
1236
1237/**
1238 * @ingroup IxOsal
1239 *
1240 * @brief "greater than" comparison for IxOsalTimeval
1241 *
1242 * @param tvA, tvB - IxOsalTimeval structures to compare
1243 *
1244 * Compares two IxOsalTimeval structures to determine if the first one is
1245 * greater than the second one
1246 *
1247 * @li Reentrant: yes
1248 * @li IRQ safe: yes
1249 *
1250 * @return - TRUE if tvA > tvB
1251 * - FALSE otherwise
1252 * Note: This function is OS-independent.
1253 */
1254#define IX_OSAL_TIME_GT(tvA, tvB) \
1255 ((tvA).secs > (tvB).secs || \
1256 ((tvA).secs == (tvB).secs && (tvA).nsecs > (tvB).nsecs))
1257
1258
1259/**
1260 * @ingroup IxOsal
1261 *
1262 * @brief "add" operator for IxOsalTimeval
1263 *
1264 * @param tvA, tvB - IxOsalTimeval structures to add
1265 *
1266 * Adds the second IxOsalTimevalStruct to the first one (equivalent to
1267 * tvA += tvB)
1268 *
1269 * @li Reentrant: yes
1270 * @li IRQ safe: yes
1271 *
1272 * @return - none
1273 * Note: This function is OS-independent.
1274 */
1275#define IX_OSAL_TIME_ADD(tvA, tvB) \
1276 (tvA).secs += (tvB).secs; \
1277 (tvA).nsecs += (tvB).nsecs; \
1278 if ((tvA).nsecs >= IX_OSAL_BILLION) \
1279 { \
1280 (tvA).secs++; \
1281 (tvA).nsecs -= IX_OSAL_BILLION; }
1282
1283
1284/**
1285 * @ingroup IxOsal
1286 *
1287 * @brief "subtract" operator for IxOsalTimeval
1288 *
1289 * @param tvA, tvB - IxOsalTimeval structures to subtract
1290 *
1291 * Subtracts the second IxOsalTimevalStruct from the first one (equivalent
1292 * to tvA -= tvB)
1293 *
1294 * @li Reentrant: yes
1295 * @li IRQ safe: yes
1296 *
1297 * @return - none
1298 * Note: This function is OS-independent. Implemented by core.
1299 */
1300#define IX_OSAL_TIME_SUB(tvA, tvB) \
1301 if ((tvA).nsecs >= (tvB).nsecs) \
1302 { \
1303 (tvA).secs -= (tvB).secs; \
1304 (tvA).nsecs -= (tvB).nsecs; \
1305 } \
1306 else \
1307 { \
1308 (tvA).secs -= ((tvB).secs + 1); \
1309 (tvA).nsecs += IX_OSAL_BILLION - (tvB).nsecs; \
1310 }
1311
1312
1313/* ============================= Logging ==============================
1314 *
1315 */
1316
1317/**
1318 * @ingroup IxOsal
1319 *
1320 * @brief Interrupt-safe logging function
1321 *
1322 * @param level - identifier prefix for the message
1323 * @param device - output device
1324 * @param format - message format, in a printf format
1325 * @param ... - up to 6 arguments to be printed
1326 *
1327 * IRQ-safe logging function, similar to printf. Accepts up to 6 arguments
1328 * to print (excluding the level, device and the format). This function will
1329 * actually display the message only if the level is lower than the current
1330 * verbosity level or if the IX_OSAL_LOG_USER level is used. An output device
1331 * must be specified (see IxOsalTypes.h).
1332 *
1333 * @li Reentrant: yes
1334 * @li IRQ safe: yes
1335 *
1336 * @return - Beside the exceptions documented in the note below, the returned
1337 * value is the number of printed characters, or -1 if the parameters are
1338 * incorrect (NULL format, unknown output device)
1339 *
1340 * @note The exceptions to the return value are:
1341 * VxWorks: The return value is 32 if the specified level is 1 and 64
1342 * if the specified level is greater than 1 and less or equal than 9.
1343 * WinCE: If compiled for EBOOT then the return value is always 0.
1344 *
1345 * @note The given print format should take into account the specified
1346 * output device. IX_OSAL_STDOUT supports all the usual print formats,
1347 * however a custom hex display specified by IX_OSAL_HEX would support
1348 * only a fixed number of hexadecimal digits.
1349 */
1350PUBLIC INT32 ixOsalLog (IxOsalLogLevel level,
1351 IxOsalLogDevice device,
1352 char *format,
1353 int arg1,
1354 int arg2, int arg3, int arg4, int arg5, int arg6);
1355
1356/**
1357 * @ingroup IxOsal
1358 *
1359 * @brief sets the current logging verbosity level
1360 *
1361 * @param level - new log verbosity level
1362 *
1363 * Sets the log verbosity level. The default value is IX_OSAL_LOG_ERROR.
1364 *
1365 * @li Reentrant: yes
1366 * @li IRQ safe: yes
1367 *
1368 * @return - Old log verbosity level
1369 */
1370PUBLIC UINT32 ixOsalLogLevelSet (UINT32 level);
1371
1372
1373/* ============================= Logging ==============================
1374 *
1375 */
1376
1377/**
1378 * @ingroup IxOsal
1379 *
1380 * @brief Schedules a repeating timer
1381 *
1382 * @param timer - handle of the timer object
1383 * @param period - timer trigger period, in milliseconds
1384 * @param priority - timer priority (0 being the highest)
1385 * @param callback - user callback to invoke when the timer triggers
1386 * @param param - custom parameter passed to the callback
1387 *
1388 * Schedules a timer to be called every period milliseconds. The timer
1389 * will invoke the specified callback function possibly in interrupt
1390 * context, passing the given parameter. If several timers trigger at the
1391 * same time contention issues are dealt according to the specified timer
1392 * priorities.
1393 *
1394 * @li Reentrant: no
1395 * @li IRQ safe: no
1396 *
1397 * @return - IX_SUCCESS/IX_FAIL
1398 */
1399PUBLIC IX_STATUS ixOsalRepeatingTimerSchedule (IxOsalTimer * timer,
1400 UINT32 period,
1401 UINT32 priority,
1402 IxOsalVoidFnVoidPtr callback,
1403 void *param);
1404
1405/**
1406 * @ingroup IxOsal
1407 *
1408 * @brief Schedules a single-shot timer
1409 *
1410 * @param timer - handle of the timer object
1411 * @param period - timer trigger period, in milliseconds
1412 * @param priority - timer priority (0 being the highest)
1413 * @param callback - user callback to invoke when the timer triggers
1414 * @param param - custom parameter passed to the callback
1415 *
1416 * Schedules a timer to be called after period milliseconds. The timer
1417 * will cease to function past its first trigger. The timer will invoke
1418 * the specified callback function, possibly in interrupt context, passing
1419 * the given parameter. If several timers trigger at the same time contention
1420 * issues are dealt according to the specified timer priorities.
1421 *
1422 * @li Reentrant: no
1423 * @li IRQ safe: no
1424 *
1425 * @return - IX_SUCCESS/IX_FAIL
1426 */
1427PUBLIC IX_STATUS
1428ixOsalSingleShotTimerSchedule (IxOsalTimer * timer,
1429 UINT32 period,
1430 UINT32 priority,
1431 IxOsalVoidFnVoidPtr callback, void *param);
1432
1433/**
1434 * @ingroup IxOsal
1435 *
1436 * @brief Cancels a running timer
1437 *
1438 * @param timer - handle of the timer object
1439 *
1440 * Cancels a single-shot or repeating timer.
1441 *
1442 * @li Reentrant: no
1443 * @li IRQ safe: yes
1444 *
1445 * @return - IX_SUCCESS/IX_FAIL
1446 */
1447PUBLIC IX_STATUS ixOsalTimerCancel (IxOsalTimer * timer);
1448
1449/**
1450 * @ingroup IxOsal
1451 *
1452 * @brief displays all the running timers
1453 *
1454 * Displays a list with all the running timers and their parameters (handle,
1455 * period, type, priority, callback and user parameter)
1456 *
1457 * @li Reentrant: no
1458 * @li IRQ safe: no
1459 *
1460 * @return - none
1461 */
1462PUBLIC void ixOsalTimersShow (void);
1463
1464
1465/* ============================= Version ==============================
1466 *
1467 */
1468
1469/**
1470 * @ingroup IxOsal
1471 *
1472 * @brief provides the name of the Operating System running
1473 *
1474 * @param osName - Pointer to a NULL-terminated string of characters
1475 * that holds the name of the OS running.
1476 * This is both an input and an ouput parameter
1477 * @param maxSize - Input parameter that defines the maximum number of
1478 * bytes that can be stored in osName
1479 *
1480 * Returns a string of characters that describe the Operating System name
1481 *
1482 * @li Reentrant: yes
1483 * @li IRQ safe: yes
1484 *
1485 * return - IX_SUCCESS for successful retrieval
1486 * - IX_FAIL if (osType == NULL | maxSize =< 0)
1487 */
1488PUBLIC IX_STATUS ixOsalOsNameGet (INT8* osName, INT32 maxSize);
1489
1490/**
1491 * @ingroup IxOsal
1492 *
1493 * @brief provides the version of the Operating System running
1494 *
1495 * @param osVersion - Pointer to a NULL terminated string of characters
1496 * that holds the version of the OS running.
1497 * This is both an input and an ouput parameter
1498 * @param maxSize - Input parameter that defines the maximum number of
1499 * bytes that can be stored in osVersion
1500 *
1501 * Returns a string of characters that describe the Operating System's version
1502 *
1503 * @li Reentrant: yes
1504 * @li IRQ safe: yes
1505 *
1506 * return - IX_SUCCESS for successful retrieval
1507 * - IX_FAIL if (osVersion == NULL | maxSize =< 0)
1508 */
1509PUBLIC IX_STATUS ixOsalOsVersionGet(INT8* osVersion, INT32 maxSize);
1510
1511
1512
1513/**
1514 * @} IxOsal
1515 */
1516
1517#endif /* IxOsal_H */