www.pudn.com > OS.rar > DirectReadUser.c, change:2006-12-11,size:4806b


/******************************************************************************* 
 * Copyright (c) 2005 BEIJING HANDHELD ELECTRONIC TECHNOLOGY CO., LTD. 
 * All rights reserved. 
 * AUTHOR      xiaofang for ezvideo 
 * FILENAME    DirectRead.c 
 * CREATE_DATE 2005/09/01 
 * 调用顺序: 
 *             get_cluster_size 
 *             direct_fopen 
 *             direct_freadB 
 *******************************************************************************/ 
 
#include ".\System\GPL162002_Far\include\system_head.h" 
#include ".\component\GPL162002_Far\include\component_head.h" 
#include ".\driver\GPL162002_Far\include\driver_head.h" 
 
#define	USER_DISK_NO	2 
#define	SECTOR_SIZE		512 
 
extern unsigned long Nand_Part1_Offset; 
 
U16	userdisk_cluster_size; 
 
unsigned int get_usercluster_size( void ) 
{ 
	userdisk_cluster_size = ( GetSectorsPerCluster( USER_DISK_NO )*512 ) & 0xffff; 
	return userdisk_cluster_size; 
} 
 
//------------------------------------------------------------------------------ 
// int direct_fopen( LPTR path, LPTR cluster_buf, unsigned int cluster_buf_len ); 
// function: 搜索文件的簇号,并放在缓冲区中 
// input:    path --- 文件的路径名 
//           cluster_buf --- 存放簇号的缓冲区 
//           cluster_buf_len --- 缓冲区长度 
// return:   0 --- no error 
//          -1 --- 打开文件错误 
//          -2 --- 缓冲区长度太小 
//------------------------------------------------------------------------------ 
int direct_user_fopen( LPTR path, LPTR cluster_buf, unsigned long cluster_buf_len ) 
{ 
	int fd; 
	unsigned long file_ofs, nand_log_addr, buf_ptr; 
	struct stat statbuf; 
 
	memset( (void *)cluster_buf, 0, cluster_buf_len ); 
	stat( path, &statbuf ); 
	fd = open( path, O_RDONLY ); 
	if( -1 == fd ) return -1; 
	if( 0 == statbuf.st_size ) { 
		close( fd ); 
		return 0; 
	} 
 
	buf_ptr = 0; file_ofs = 0; 
	do { 
		if( buf_ptr >= cluster_buf_len ) { 
			close( fd ); 
			return -2; 
		} 
		lseek( fd, file_ofs, SEEK_SET ); 
		nand_log_addr = Clus2Phy( USER_DISK_NO, _GetCluster( fd ) ) * SECTOR_SIZE + Nand_Part1_Offset*SECTOR_SIZE; 
		WVUL( (cluster_buf+buf_ptr), nand_log_addr ); 
		buf_ptr += 2; 
		file_ofs += userdisk_cluster_size; 
	} while( file_ofs  statbuf.st_size ); 
 
	close( fd ); 
	return 0; 
} 
 
//------------------------------------------------------------------------------ 
// int direct_user_freadB( LPTR cluster_buf, long file_ofs, LPTR dat_buf, unsigned int byte_len ); 
// function: 根据簇号缓冲区读取文件内容 
// input:    cluster_buf --- 簇号缓冲区 
//           file_ofs --- 文件偏移 
//           dat_buf --- 读取内容存放缓冲区 
//           byte_len --- 要读取内容的字节长度 
// return:   0 --- OK 
//          -1 --- 读取error 
//------------------------------------------------------------------------------ 
int direct_user_freadB( LPTR cluster_buf, long file_ofs, LPTR dat_buf, unsigned int byte_len ) 
{ 
	unsigned long Addr; 
	unsigned int buf_ptr, len_bak, rd_len, cluster_ofs; 
 
	len_bak = byte_len; 
	buf_ptr = (unsigned int)((unsigned long)file_ofs / userdisk_cluster_size)*2; 
	cluster_ofs = file_ofs % userdisk_cluster_size; 
	rd_len = userdisk_cluster_size - cluster_ofs; 
	if( rd_len > byte_len ) rd_len = byte_len; 
	do { 
		Addr = RVUL( (cluster_buf + buf_ptr) ) + cluster_ofs; 
		_Nand_LogicRead_Byte( Addr, dat_buf, rd_len ); 
		cluster_ofs = 0; 
		byte_len -= rd_len; 
		dat_buf += rd_len; 
		rd_len = byte_len > userdisk_cluster_size ? userdisk_cluster_size : byte_len; 
		buf_ptr += 2; 
	} while ( byte_len ); 
 
	return 0; 
} 
 
#if	1 
//------------------------------------------------------------------------------ 
// int direct_freadW( LPTR cluster_buf, long file_ofs, LPTR dat_buf, unsigned int word_len ) 
// function: 根据簇号缓冲区读取文件内容 
// input:    cluster_buf --- 簇号缓冲区 
//           file_ofs --- 文件偏移 
//           dat_buf --- 读取内容存放缓冲区 
//           word_len --- 要读取内容的word长度 
// return:   0 --- OK 
//          -1 --- 读取error 
//------------------------------------------------------------------------------ 
int direct_freadW( LPTR cluster_buf, long file_ofs, LPTR dat_buf, unsigned long byte_len ) 
{ 
	unsigned long Addr; 
	unsigned long buf_ptr, len_bak, rd_len, cluster_ofs; 
 
	len_bak = byte_len; 
	buf_ptr = (unsigned int)((unsigned long)file_ofs / userdisk_cluster_size)*2; 
	cluster_ofs = file_ofs % userdisk_cluster_size; 
	rd_len = userdisk_cluster_size - cluster_ofs; 
	if( rd_len > byte_len ) rd_len = byte_len; 
	do { 
		Addr = RVUL( (cluster_buf + buf_ptr) ) + cluster_ofs; 
		_Nand_LogicRead_Word( Addr, dat_buf, rd_len ); 
		cluster_ofs = 0; 
		byte_len -= rd_len; 
		dat_buf += rd_len/2; 
		rd_len = byte_len > userdisk_cluster_size ? userdisk_cluster_size : byte_len; 
		buf_ptr += 2; 
	} while ( byte_len ); 
 
	return 0; 
} 
#endif