159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2018, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  */
 | |
| /*
 | |
|   This file is part of UFFS, the Ultra-low-cost Flash File System.
 | |
|   
 | |
|   Copyright (C) 2005-2009 Ricky Zheng <ricky_gz_zheng@yahoo.co.nz>
 | |
| 
 | |
|   UFFS is free software; you can redistribute it and/or modify it under
 | |
|   the GNU Library General Public License as published by the Free Software 
 | |
|   Foundation; either version 2 of the License, or (at your option) any
 | |
|   later version.
 | |
| 
 | |
|   UFFS is distributed in the hope that it will be useful, but WITHOUT
 | |
|   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | |
|   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | |
|   or GNU Library General Public License, as applicable, for more details.
 | |
|  
 | |
|   You should have received a copy of the GNU General Public License
 | |
|   and GNU Library General Public License along with UFFS; if not, write
 | |
|   to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 | |
|   Boston, MA  02110-1301, USA.
 | |
| 
 | |
|   As a special exception, if other files instantiate templates or use
 | |
|   macros or inline functions from this file, or you compile this file
 | |
|   and link it with other works to produce a work based on this file,
 | |
|   this file does not by itself cause the resulting work to be covered
 | |
|   by the GNU General Public License. However the source code for this
 | |
|   file must still be made available in accordance with section (3) of
 | |
|   the GNU General Public License v2.
 | |
|  
 | |
|   This exception does not invalidate any other reasons why a work based
 | |
|   on this file might be covered by the GNU General Public License.
 | |
| */
 | |
| 
 | |
| /**
 | |
|  * \file uffs_os_posix.c
 | |
|  * \brief Emulation on POSIX host. This is just a dumb implementation, does not really create semaphores.
 | |
|  * \author Ricky Zheng
 | |
|  */
 | |
| 
 | |
| #include "uffs_config.h"
 | |
| #include "uffs/uffs_os.h"
 | |
| #include "uffs/uffs_public.h"
 | |
| //#include <time.h>
 | |
| 
 | |
| #define PFX "os  : "
 | |
| 
 | |
| int uffs_SemCreate(OSSEM *sem)
 | |
| {
 | |
| 	static int count = 0;
 | |
| 	char name [RT_NAME_MAX+1];
 | |
| 	struct rt_mutex *mutex = RT_NULL;
 | |
| 
 | |
| 	rt_snprintf(name, sizeof(name), "usem%d", count++);
 | |
| 	mutex = rt_mutex_create(name, RT_IPC_FLAG_FIFO);
 | |
| 	if (mutex != RT_NULL)
 | |
| 	{
 | |
| 		*sem = (OSSEM *)mutex;
 | |
| 		return 0;
 | |
| 	}
 | |
| 	uffs_Perror(UFFS_MSG_SERIOUS, "can't get a semphore");
 | |
| 	return -1;
 | |
| }
 | |
| 
 | |
| int uffs_SemWait(OSSEM sem)
 | |
| {
 | |
| 	return rt_mutex_take((struct rt_mutex *)sem, RT_WAITING_FOREVER);
 | |
| }
 | |
| 
 | |
| int uffs_SemSignal(OSSEM sem)
 | |
| {
 | |
| 	return rt_mutex_release((struct rt_mutex *)sem);
 | |
| }
 | |
| 
 | |
| int uffs_SemDelete(OSSEM *sem)
 | |
| {
 | |
| 	int ret = -1;
 | |
| 	
 | |
| 	if (sem) {
 | |
| 		ret = rt_mutex_delete((struct rt_mutex *)(*sem));
 | |
| 		if (ret == RT_EOK) {
 | |
| 			*sem = 0;
 | |
| 		}			
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| int uffs_OSGetTaskId(void)
 | |
| {
 | |
| 	//TODO: ... return current task ID ...
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| unsigned int uffs_GetCurDateTime(void)
 | |
| {
 | |
| 	// FIXME: return system time, please modify this for your platform ! 
 | |
| 	//			or just return 0 if you don't care about file time.
 | |
| #if 0
 | |
| 	time_t tvalue;
 | |
| 
 | |
| 	tvalue = time(NULL);
 | |
| 	
 | |
| 	return (unsigned int)tvalue;
 | |
| #endif
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #if CONFIG_USE_SYSTEM_MEMORY_ALLOCATOR > 0
 | |
| static void * sys_malloc(struct uffs_DeviceSt *dev, unsigned int size)
 | |
| {
 | |
| 	dev = dev;
 | |
| 	uffs_Perror(UFFS_MSG_NORMAL, "system memory alloc %d bytes", size);
 | |
| 	return rt_malloc(size);
 | |
| }
 | |
| 
 | |
| static URET sys_free(struct uffs_DeviceSt *dev, void *p)
 | |
| {
 | |
| 	dev = dev;
 | |
| 	rt_free(p);
 | |
| 	return U_SUCC;
 | |
| }
 | |
| 
 | |
| void uffs_MemSetupSystemAllocator(uffs_MemAllocator *allocator)
 | |
| {
 | |
| 	allocator->malloc = sys_malloc;
 | |
| 	allocator->free = sys_free;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #if !defined(RT_THREAD)
 | |
| /* debug message output throught 'printf' */
 | |
| static void output_dbg_msg(const char *msg);
 | |
| static struct uffs_DebugMsgOutputSt m_dbg_ops = {
 | |
| 	output_dbg_msg,
 | |
| 	NULL,
 | |
| };
 | |
| 
 | |
| static void output_dbg_msg(const char *msg)
 | |
| {
 | |
| 	rt_kprintf("%s", msg);
 | |
| }
 | |
| 
 | |
| void uffs_SetupDebugOutput(void)
 | |
| {
 | |
| 	uffs_InitDebugMessageOutput(&m_dbg_ops, UFFS_MSG_NOISY);
 | |
| }
 | |
| #else
 | |
| 
 | |
| void uffs_SetupDebugOutput(void)
 | |
| {
 | |
| }
 | |
| #endif
 |