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
 |