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
							 |