/****************************** (C) COPYRIGHT 2011 YQDZ **************************
* 文 件 名 : FILE_SYS.H
* 作 者 : 亿全电子
* FAE现场应用工程师 QQ:1027413631
* 7*24小时技术支持电话:15366066738
* http://shop57138657.taobao.com/
* 版 本 : V1.0
* 日 期 : 2011/08/29
* 描 述 : CH376芯片 文件系统层 V1.2
* 提供文件系统常用子程序,提供命令打包.
* 不使用的子程序可以注释掉,从而节约单片机的程序ROM空间和数据
* RAM空间.
* 这里的子程序是通过括号中的变量传递参数,如果参数较多,为了节
* 约RAM,也可以参考CH375子程序库改成通过同一全局变量/联合结构
* CH376_CMD_DATA传递.
*********************************************************************************/
/* name 参数是指短文件名, 可以包括根目录符, 但不含有路径分隔符, 总长度不超过1+8+1+3+1字节 */
/* PathName 参数是指全路径的短文件名, 包括根目录符、多级子目录及路径分隔符、文件名/目录名 */
/* LongName 参数是指长文件名, 以UNICODE小端顺序编码, 以两个0字节结束, 使用长文件名子程序必须先定义全局缓冲区GlobalBuf, 长度不小于64字节, 可以与其它子程序共用 */
/* 定义 NO_DEFAULT_CH376_INT 用于禁止默认的Wait376Interrupt子程序,禁止后,应用程序必须自行定义一个同名子程序 */
/* 定义 DEF_INT_TIMEOUT 用于设置默认的Wait376Interrupt子程序中的等待中断的超时时间/循环计数值, 0则不检查超时而一直等待 */
/* 定义 EN_DIR_CREATE 用于提供新建多级子目录的子程序,默认是不提供 */
/* 定义 EN_DISK_QUERY 用于提供磁盘容量查询和剩余空间查询的子程序,默认是不提供 */
/* 定义 EN_SECTOR_ACCESS 用于提供以扇区为单位读写文件的子程序,默认是不提供 */
/* 定义 EN_LONG_NAME 用于提供支持长文件名的子程序,默认是不提供 */
/* 定义 DEF_IC_V43_U 用于去掉支持低版本的程序代码,仅支持V4.3及以上版本的CH376芯片,默认是支持低版本 */
#include <pic.h>
#include<FILESYS.H>
/*******************************************************************************
* 函 数 名 : CH376ReadBlock
* 描 述 : 从当前主机端点的接收缓冲区读取数据块,.
* 输 入 : PUINT8 buf:
* 指向外部接收缓冲区.
* 返 回 : 返回长度.
*******************************************************************************/
UINT8 CH376ReadBlock( PUINT8 buf )
{
UINT8 s, l;
xWriteCH376Cmd( CMD01_RD_USB_DATA0 );
s = l = xReadCH376Data( ); /* 后续数据长度 */
if ( l )
{
do
{
*buf = xReadCH376Data( );
buf ++;
} while ( -- l );
}
return( s );
}
/*******************************************************************************
* 函 数 名 : CH376WriteReqBlock
* 描 述 : 向内部指定缓冲区写入请求的数据块,返回长度.
* 输 入 : PUINT8 buf:
* 指向发送缓冲区.
* 返 回 : UINT8 s:后续数据长度.
*******************************************************************************/
UINT8 CH376WriteReqBlock( PUINT8 buf )
{
UINT8 s, l;
xWriteCH376Cmd( CMD01_WR_REQ_DATA ); /* 向内部指定缓冲区写入请求的数据块 */
s = l = xReadCH376Data( ); /* 后续数据长度 */
if ( l )
{
do
{
xWriteCH376Data( *buf );
buf ++;
} while ( -- l );
}
return( s );
}
/*******************************************************************************
* 函 数 名 : CH376WriteHostBlock
* 描 述 : 向USB主机端点的发送缓冲区写入数据块.
* 输 入 : PUINT8 buf:
* 指向发送数据缓冲区.
* UINT8 len:
* 数据长度.
* 返 回 : 无.
*******************************************************************************/
void CH376WriteHostBlock( PUINT8 buf, UINT8 len )
{
xWriteCH376Cmd( CMD10_WR_HOST_DATA );
xWriteCH376Data( len ); /* 后续数据长度 */
if ( len )
{
do
{
xWriteCH376Data( *buf );
buf ++;
} while ( -- len );
}
}
/*******************************************************************************
* 函 数 名 : CH376WriteOfsBlock
* 描 述 : 向内部缓冲区指定偏移地址写入数据块.
* 输 入 : PUINT8 buf:
* 指向发送数据缓冲区.
* UINT8 ofs:
* 偏移地址.
* UINT8 len:
* 数据长度.
* 返 回 : 无.
*******************************************************************************/
void CH376WriteOfsBlock( PUINT8 buf, UINT8 ofs, UINT8 len )
{
xWriteCH376Cmd( CMD20_WR_OFS_DATA );
xWriteCH376Data( ofs ); /* 偏移地址 */
xWriteCH376Data( len ); /* 数据长度 */
if ( len )
{
do
{
xWriteCH376Data( *buf );
buf ++;
} while ( -- len );
}
}
/*******************************************************************************
* 函 数 名 : CH376SetFileName
* 描 述 : 设置将要操作的文件的文件名 .
* 输 入 : PUINT8 name:
* 指向文件名缓冲区.
* 返 回 : 无.
*******************************************************************************/
void CH376SetFileName( PUINT8 name )
{
UINT8 c;
#ifndef DEF_IC_V43_U /* 默认支持低版本 */
UINT8 s;
xWriteCH376Cmd( CMD01_GET_IC_VER ); /* 获取芯片版本 */
if ( xReadCH376Data( ) < 0x43 )
{
if ( CH376ReadVar8( VAR_DISK_STATUS ) < DEF_DISK_READY )
{
xWriteCH376Cmd( CMD10_SET_FILE_NAME );
xWriteCH376Data( 0 );
s = CH376SendCmdWaitInt( CMD0H_FILE_OPEN );
if ( s == USB_INT_SUCCESS )
{
s = CH376ReadVar8( 0xCF );
if ( s )
{
CH376WriteVar32( 0x4C, CH376ReadVar32( 0x4C ) + ( (UINT16)s << 8 ) );
CH376WriteVar32( 0x50, CH376ReadVar32( 0x50 ) + ( (UINT16)s << 8 ) );
CH376WriteVar32( 0x70, 0 );
}
}
}
}
#endif
xWriteCH376Cmd( CMD10_SET_FILE_NAME );
c = *name;
xWriteCH376Data( c );
while ( c )
{
name ++;
c = *name;
if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 )
{
c = 0; /* 强行将文件名截止 */
}
xWriteCH376Data( c );
}
}
/*******************************************************************************
* 函 数 名 : CH376Read32bitDat
* 描 述 : 从CH376芯片读取32位的数据并结束命令.
* 输 入 : 无.
* 返 回 : 32位数据.
*******************************************************************************/
UINT32 CH376Read32bitDat( void )
{
UINT8 c0, c1, c2, c3;
c0 = xReadCH376Data( );
c1 = xReadCH376Data( );
c2 = xReadCH376Data( );
c3 = xReadCH376Data( );
return( c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24 );
}
/*******************************************************************************
* 函 数 名 : CH376ReadVar8
* 描 述 : 读CH376芯片内部的8位变量.
* 输 入 : 无.
* 返 回 : 8位变量.
*******************************************************************************/
UINT8 CH376ReadVar8( UINT8 var )
{
UINT8 c0;
xWriteCH376Cmd( CMD11_READ_VAR8 ); /* 读取指定的8位文件系统变量 */
xWriteCH376Data( var );
c0 = xReadCH376Data( );
return( c0 );
}
/*******************************************************************************
* 函 数 名 : CH376WriteVar8
* 描 述 : 写CH376芯片内部的8位变量.
* 输 入 : UINT8 var:
* 变量地址.
* UINT8 dat:
数据.
* 返 回 : 无.
*******************************************************************************/
void CH376WriteVar8( UINT8 var, UINT8 dat )
{
xWriteCH376Cmd( CMD20_WRITE_VAR8 ); /* 设置指定的8位文件系统变量 */
xWriteCH376Data( var );
xWriteCH376Data( dat );
}
/*******************************************************************************
* 函 数 名 : CH376ReadVar8
* 描 述 : 读CH376芯片内部的32位变量.
* 输 入 : UINT8 var:
* 变量地址.
* 返 回 : 32位变量.
*****************