1*10465441SEvalZero #ifndef __ASM_SEMAPHORE_H__
2*10465441SEvalZero #define __ASM_SEMAPHORE_H__
3*10465441SEvalZero
4*10465441SEvalZero #define CONFIG_JFFS2_SEMAPHORE 0 // no mutex, 1 use static, 2 use dynamic
5*10465441SEvalZero #if CONFIG_JFFS2_SEMAPHORE == 0
6*10465441SEvalZero //#include <cyg/hal/drv_api.h>
7*10465441SEvalZero
8*10465441SEvalZero struct semaphore {
9*10465441SEvalZero int x;
10*10465441SEvalZero };
11*10465441SEvalZero
12*10465441SEvalZero #define DECLARE_MUTEX(x)
13*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
14*10465441SEvalZero
15*10465441SEvalZero #define init_MUTEX(sem)
16*10465441SEvalZero #define init_MUTEX_LOCKED(sem)
17*10465441SEvalZero #define down(sem)
18*10465441SEvalZero #define down_interruptible(sem) 0
19*10465441SEvalZero #define down_trylock(sem)
20*10465441SEvalZero #define up(sem)
21*10465441SEvalZero
22*10465441SEvalZero #elif CONFIG_JFFS2_SEMAPHORE == 1
23*10465441SEvalZero #include <rtthread.h>
24*10465441SEvalZero
25*10465441SEvalZero struct semaphore {
26*10465441SEvalZero struct rt_mutex mutex;
27*10465441SEvalZero };
28*10465441SEvalZero
29*10465441SEvalZero #define DECLARE_MUTEX(x)
30*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
init_MUTEX(struct semaphore * sem)31*10465441SEvalZero rt_inline void init_MUTEX(struct semaphore * sem)
32*10465441SEvalZero {
33*10465441SEvalZero if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
34*10465441SEvalZero {
35*10465441SEvalZero /* detach the object from system object container */
36*10465441SEvalZero rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
37*10465441SEvalZero return;
38*10465441SEvalZero }
39*10465441SEvalZero rt_kprintf("get an error at %s:%d \n", __FUNCTION__, __LINE__);
40*10465441SEvalZero RT_ASSERT(0);
41*10465441SEvalZero }
42*10465441SEvalZero
init_MUTEX_LOCKED(struct semaphore * sem)43*10465441SEvalZero rt_inline void init_MUTEX_LOCKED(struct semaphore * sem)
44*10465441SEvalZero {
45*10465441SEvalZero rt_enter_critical();
46*10465441SEvalZero if (rt_mutex_init((rt_mutex_t)sem, "mutex", RT_IPC_FLAG_FIFO) == RT_EOK)
47*10465441SEvalZero {
48*10465441SEvalZero /* detach the object from system object container */
49*10465441SEvalZero rt_object_detach(&(((rt_mutex_t)sem)->parent.parent));
50*10465441SEvalZero rt_exit_critical();
51*10465441SEvalZero rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
52*10465441SEvalZero return;
53*10465441SEvalZero }
54*10465441SEvalZero rt_exit_critical();
55*10465441SEvalZero
56*10465441SEvalZero rt_kprintf("get an error at %s:%d \n", __FUNCTION__, __LINE__);
57*10465441SEvalZero RT_ASSERT(0);
58*10465441SEvalZero }
59*10465441SEvalZero
down(struct semaphore * sem)60*10465441SEvalZero rt_inline down(struct semaphore * sem)
61*10465441SEvalZero {
62*10465441SEvalZero rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
63*10465441SEvalZero }
down_interruptible(struct semaphore * sem)64*10465441SEvalZero rt_inline int down_interruptible(struct semaphore* sem)
65*10465441SEvalZero {
66*10465441SEvalZero rt_mutex_take((rt_mutex_t)sem, RT_WAITING_FOREVER);
67*10465441SEvalZero return 0;
68*10465441SEvalZero }
up(struct semaphore * sem)69*10465441SEvalZero rt_inline up(struct semaphore * sem)
70*10465441SEvalZero {
71*10465441SEvalZero rt_mutex_release((rt_mutex_t)sem);
72*10465441SEvalZero }
73*10465441SEvalZero #elif CONFIG_JFFS2_SEMAPHORE == 2
74*10465441SEvalZero
75*10465441SEvalZero #include <rtthread.h>
76*10465441SEvalZero
77*10465441SEvalZero struct semaphore {
78*10465441SEvalZero rt_mutex_t mutex;
79*10465441SEvalZero };
80*10465441SEvalZero
81*10465441SEvalZero #define DECLARE_MUTEX(x)
82*10465441SEvalZero #define DECLARE_MUTEX_LOCKED(x)
83*10465441SEvalZero
init_MUTEX(struct semaphore * sem)84*10465441SEvalZero rt_inline void init_MUTEX(struct semaphore * sem)
85*10465441SEvalZero {
86*10465441SEvalZero sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
87*10465441SEvalZero }
init_MUTEX_LOCKED(struct semaphore * sem)88*10465441SEvalZero rt_inline init_MUTEX_LOCKED(struct semaphore * sem)
89*10465441SEvalZero {
90*10465441SEvalZero sem->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO);
91*10465441SEvalZero rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
92*10465441SEvalZero }
down(struct semaphore * sem)93*10465441SEvalZero rt_inline down(struct semaphore * sem)
94*10465441SEvalZero {
95*10465441SEvalZero rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
96*10465441SEvalZero }
down_interruptible(struct semaphore * sem)97*10465441SEvalZero rt_inline int down_interruptible(struct semaphore* sem)
98*10465441SEvalZero {
99*10465441SEvalZero rt_mutex_take(sem->mutex, RT_WAITING_FOREVER);
100*10465441SEvalZero return 0;
101*10465441SEvalZero }
102*10465441SEvalZero /*
103*10465441SEvalZero Attempt to lock the mutex pointed to by the mutex argument without waiting.
104*10465441SEvalZero If the mutex is already locked by some other thread then this function
105*10465441SEvalZero returns FALSE. If the function can lock the mutex without waiting, then
106*10465441SEvalZero TRUE is returned.
107*10465441SEvalZero void cyg_drv_mutex_unlock( cyg_drv_mutex *mutex )
108*10465441SEvalZero */
109*10465441SEvalZero
110*10465441SEvalZero //#define down_trylock(struct semaphore * sem) rt_mutex_take((rt_mutex_t)sem, RT_WAITING_NO)
up(struct semaphore * sem)111*10465441SEvalZero rt_inline up(struct semaphore * sem)
112*10465441SEvalZero {
113*10465441SEvalZero rt_mutex_release(sem->mutex);
114*10465441SEvalZero }
115*10465441SEvalZero
116*10465441SEvalZero #else
117*10465441SEvalZero #error "CONFIG_JFFS2_SEMAPHORE should be 0, 1 or 2"
118*10465441SEvalZero #endif
119*10465441SEvalZero
120*10465441SEvalZero #endif /* __ASM_SEMAPHORE_H__ */
121