1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero */
9*10465441SEvalZero /*
10*10465441SEvalZero This file is part of UFFS, the Ultra-low-cost Flash File System.
11*10465441SEvalZero
12*10465441SEvalZero Copyright (C) 2005-2009 Ricky Zheng <[email protected]>
13*10465441SEvalZero
14*10465441SEvalZero UFFS is free software; you can redistribute it and/or modify it under
15*10465441SEvalZero the GNU Library General Public License as published by the Free Software
16*10465441SEvalZero Foundation; either version 2 of the License, or (at your option) any
17*10465441SEvalZero later version.
18*10465441SEvalZero
19*10465441SEvalZero UFFS is distributed in the hope that it will be useful, but WITHOUT
20*10465441SEvalZero ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21*10465441SEvalZero FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22*10465441SEvalZero or GNU Library General Public License, as applicable, for more details.
23*10465441SEvalZero
24*10465441SEvalZero You should have received a copy of the GNU General Public License
25*10465441SEvalZero and GNU Library General Public License along with UFFS; if not, write
26*10465441SEvalZero to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
27*10465441SEvalZero Boston, MA 02110-1301, USA.
28*10465441SEvalZero
29*10465441SEvalZero As a special exception, if other files instantiate templates or use
30*10465441SEvalZero macros or inline functions from this file, or you compile this file
31*10465441SEvalZero and link it with other works to produce a work based on this file,
32*10465441SEvalZero this file does not by itself cause the resulting work to be covered
33*10465441SEvalZero by the GNU General Public License. However the source code for this
34*10465441SEvalZero file must still be made available in accordance with section (3) of
35*10465441SEvalZero the GNU General Public License v2.
36*10465441SEvalZero
37*10465441SEvalZero This exception does not invalidate any other reasons why a work based
38*10465441SEvalZero on this file might be covered by the GNU General Public License.
39*10465441SEvalZero */
40*10465441SEvalZero
41*10465441SEvalZero /**
42*10465441SEvalZero * \file uffs_os_posix.c
43*10465441SEvalZero * \brief Emulation on POSIX host. This is just a dumb implementation, does not really create semaphores.
44*10465441SEvalZero * \author Ricky Zheng
45*10465441SEvalZero */
46*10465441SEvalZero
47*10465441SEvalZero #include "uffs_config.h"
48*10465441SEvalZero #include "uffs/uffs_os.h"
49*10465441SEvalZero #include "uffs/uffs_public.h"
50*10465441SEvalZero //#include <time.h>
51*10465441SEvalZero
52*10465441SEvalZero #define PFX "os : "
53*10465441SEvalZero
uffs_SemCreate(OSSEM * sem)54*10465441SEvalZero int uffs_SemCreate(OSSEM *sem)
55*10465441SEvalZero {
56*10465441SEvalZero static int count = 0;
57*10465441SEvalZero char name [RT_NAME_MAX+1];
58*10465441SEvalZero struct rt_mutex *mutex = RT_NULL;
59*10465441SEvalZero
60*10465441SEvalZero rt_snprintf(name, sizeof(name), "usem%d", count++);
61*10465441SEvalZero mutex = rt_mutex_create(name, RT_IPC_FLAG_FIFO);
62*10465441SEvalZero if (mutex != RT_NULL)
63*10465441SEvalZero {
64*10465441SEvalZero *sem = (OSSEM *)mutex;
65*10465441SEvalZero return 0;
66*10465441SEvalZero }
67*10465441SEvalZero uffs_Perror(UFFS_MSG_SERIOUS, "can't get a semphore");
68*10465441SEvalZero return -1;
69*10465441SEvalZero }
70*10465441SEvalZero
uffs_SemWait(OSSEM sem)71*10465441SEvalZero int uffs_SemWait(OSSEM sem)
72*10465441SEvalZero {
73*10465441SEvalZero return rt_mutex_take((struct rt_mutex *)sem, RT_WAITING_FOREVER);
74*10465441SEvalZero }
75*10465441SEvalZero
uffs_SemSignal(OSSEM sem)76*10465441SEvalZero int uffs_SemSignal(OSSEM sem)
77*10465441SEvalZero {
78*10465441SEvalZero return rt_mutex_release((struct rt_mutex *)sem);
79*10465441SEvalZero }
80*10465441SEvalZero
uffs_SemDelete(OSSEM * sem)81*10465441SEvalZero int uffs_SemDelete(OSSEM *sem)
82*10465441SEvalZero {
83*10465441SEvalZero int ret = -1;
84*10465441SEvalZero
85*10465441SEvalZero if (sem) {
86*10465441SEvalZero ret = rt_mutex_delete((struct rt_mutex *)(*sem));
87*10465441SEvalZero if (ret == RT_EOK) {
88*10465441SEvalZero *sem = 0;
89*10465441SEvalZero }
90*10465441SEvalZero }
91*10465441SEvalZero return ret;
92*10465441SEvalZero }
93*10465441SEvalZero
uffs_OSGetTaskId(void)94*10465441SEvalZero int uffs_OSGetTaskId(void)
95*10465441SEvalZero {
96*10465441SEvalZero //TODO: ... return current task ID ...
97*10465441SEvalZero return 0;
98*10465441SEvalZero }
99*10465441SEvalZero
uffs_GetCurDateTime(void)100*10465441SEvalZero unsigned int uffs_GetCurDateTime(void)
101*10465441SEvalZero {
102*10465441SEvalZero // FIXME: return system time, please modify this for your platform !
103*10465441SEvalZero // or just return 0 if you don't care about file time.
104*10465441SEvalZero #if 0
105*10465441SEvalZero time_t tvalue;
106*10465441SEvalZero
107*10465441SEvalZero tvalue = time(NULL);
108*10465441SEvalZero
109*10465441SEvalZero return (unsigned int)tvalue;
110*10465441SEvalZero #endif
111*10465441SEvalZero return 0;
112*10465441SEvalZero }
113*10465441SEvalZero
114*10465441SEvalZero #if CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR > 0
sys_malloc(struct uffs_DeviceSt * dev,unsigned int size)115*10465441SEvalZero static void * sys_malloc(struct uffs_DeviceSt *dev, unsigned int size)
116*10465441SEvalZero {
117*10465441SEvalZero dev = dev;
118*10465441SEvalZero uffs_Perror(UFFS_MSG_NORMAL, "system memory alloc %d bytes", size);
119*10465441SEvalZero return rt_malloc(size);
120*10465441SEvalZero }
121*10465441SEvalZero
sys_free(struct uffs_DeviceSt * dev,void * p)122*10465441SEvalZero static URET sys_free(struct uffs_DeviceSt *dev, void *p)
123*10465441SEvalZero {
124*10465441SEvalZero dev = dev;
125*10465441SEvalZero rt_free(p);
126*10465441SEvalZero return U_SUCC;
127*10465441SEvalZero }
128*10465441SEvalZero
uffs_MemSetupSystemAllocator(uffs_MemAllocator * allocator)129*10465441SEvalZero void uffs_MemSetupSystemAllocator(uffs_MemAllocator *allocator)
130*10465441SEvalZero {
131*10465441SEvalZero allocator->malloc = sys_malloc;
132*10465441SEvalZero allocator->free = sys_free;
133*10465441SEvalZero }
134*10465441SEvalZero #endif
135*10465441SEvalZero
136*10465441SEvalZero #if !defined(RT_THREAD)
137*10465441SEvalZero /* debug message output throught 'printf' */
138*10465441SEvalZero static void output_dbg_msg(const char *msg);
139*10465441SEvalZero static struct uffs_DebugMsgOutputSt m_dbg_ops = {
140*10465441SEvalZero output_dbg_msg,
141*10465441SEvalZero NULL,
142*10465441SEvalZero };
143*10465441SEvalZero
output_dbg_msg(const char * msg)144*10465441SEvalZero static void output_dbg_msg(const char *msg)
145*10465441SEvalZero {
146*10465441SEvalZero rt_kprintf("%s", msg);
147*10465441SEvalZero }
148*10465441SEvalZero
uffs_SetupDebugOutput(void)149*10465441SEvalZero void uffs_SetupDebugOutput(void)
150*10465441SEvalZero {
151*10465441SEvalZero uffs_InitDebugMessageOutput(&m_dbg_ops, UFFS_MSG_NOISY);
152*10465441SEvalZero }
153*10465441SEvalZero #else
154*10465441SEvalZero
uffs_SetupDebugOutput(void)155*10465441SEvalZero void uffs_SetupDebugOutput(void)
156*10465441SEvalZero {
157*10465441SEvalZero }
158*10465441SEvalZero #endif
159