📄 massstorage.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: massStorage.c
** Latest modified Date: 2007-10-8
** Latest Version: 1.0
** Descriptions: 大容量类存储器接口函数
**
**--------------------------------------------------------------------------------------------------------
** Created by: Lizhenming
** Created date: 2007-09-9
** Version: 1.0
** Descriptions: The original version
**
*********************************************************************************************************/
#include "RbcBasicType.h"
#include "Hal4Rbc.h"
#include "RBCCmd.h"
#include "TPBulk.h"
#include "massStorage.h"
#include "ramdisk.h"
/*
* 储存器缓冲区首址(缓冲区大小为一个扇区),在这里定义,由具体存储器接口实现程序维护
*/
__uint8 *__GpucMassStorageBufs[__MAXLUN+1];
/*
* 接口函数指针数组,初始化为具体存储器接口程序(如果可选接口没支持,则需要初始化为0)
*/
const __DISK_OPERATION __DiskOpertions[__MAXLUN+1] =
{
{
ramdiskInit,
ramdiskReset,
ramdiskGetInfo,
ramdiskGetStatus,
ramdiskRead,
ramdiskWrite,
/*
* Optional function
*/
ramdiskReadSetting,
ramdiskWriteSetting,
0
}
#if __MAXLUN > 0
,
{
ramdisk2Init,
ramdisk2Reset,
ramdisk2GetInfo,
ramdisk2GetStatus,
ramdisk2Read,
ramdisk2Write,
/*
* Optional function
*/
ramdisk2ReadSetting,
ramdisk2WriteSetting,
0
}
#endif
};
__uint8 __GbCurLun = 0; /* 当前逻辑单元 */
static __uint16 __GuiMsCacheSizes[__MAXLUN+1]; /* 缓冲区大小 */
static __uint16 __GusMsCacheCnts[__MAXLUN+1]; /* 缓冲区中有效字节数 */
static __uint32 __GuiLBAs[__MAXLUN+1]; /* 当前逻辑块 */
#define __GuiMsCacheSize __GuiMsCacheSizes[__GbCurLun]
#define __GusMsCacheCnt __GusMsCacheCnts[__GbCurLun]
#define __GuiLBA __GuiLBAs[__GbCurLun]
/*********************************************************************************************************
** Function name: __msReadSetting
**
** Descriptions: 读存储器之前的设置
**
** input parameters: LBA 逻辑块地址
** uiXferCnt 总共要传输的扇区数
** output parameters: 无
** Returned value: __MASS_SUCCESS 设置成功
** __MASS_FAIL 设置失败
**
*********************************************************************************************************/
__uint8 __msReadSetting ( __uint32 uiLBA, __uint32 uiXferCnt)
{
__uint8 ucErr;
__GuiLBA = uiLBA;
if ((&msReadSetting) != __MASS_NULL){ /* 判断函数指针是否为NULL */
ucErr = msReadSetting(uiLBA, uiXferCnt); /* 非NULL则执行可选接口函数 */
}
__GusMsCacheCnt = 0;
return ucErr;
}
/*********************************************************************************************************
** Function name: __msWriteSetting
**
** Descriptions: 写存储器之前的设置
**
** input parameters: LBA 逻辑块地址
** uiXferCnt 总共要传输的扇区数
** output parameters: 无
** Returned value: __MASS_SUCCESS 设置成功
** __MASS_FAIL 设置失败
**
*********************************************************************************************************/
__uint8 __msWriteSetting ( __uint32 uiLBA, __uint32 uiXferCnt)
{
__uint8 ucErr;
__GuiLBA = uiLBA;
if ((&msWriteSetting) != __MASS_NULL){ /* 判断函数指针是否为NULL */
ucErr = msWriteSetting(uiLBA, uiXferCnt); /* 非NULL则执行可选接口函数 */
}
__GusMsCacheCnt = 0;
return ucErr;
}
/*********************************************************************************************************
** Function name: __msXferPkt2USB
**
** Descriptions: 从存储器读出数据并把数据包发送到USB
**
** input parameters: 无
** output parameters: 无
** global parameters: __GpucBOTXferData 批量传输数据指针
** Returned value: 返回发送到USB的字节数或__MASSSTORAGE_ERROR
**
*********************************************************************************************************/
__uint16 __msXferPkt2USB(void)
{
__uint16 usErr, usLen;
if (__GusMsCacheCnt == 0){ /* 缓冲区为空,读存储器扇区数据 */
usErr = msReadSector(__GuiLBA, __GpucMassStorageBuf);
if (usErr != __MASS_SUCCESS){
return __MASSSTORAGE_ERROR;
}
__GuiLBA++;
__GpucBOTXferData = __GpucMassStorageBuf; /* 设置数据传输指针到存储器缓 */
__GusMsCacheCnt = __GuiMsCacheSize; /* 冲区起始位置 */ /* 冲区起始位置 */
}
usLen = __GusMsCacheCnt;
while (__GusMsCacheCnt > 0){
usErr = __tpbulkWrite(); /* 发送数据到USB批量端口 */
if ( usErr == __BULKEP_RW_ERR){
break;
}
__GusMsCacheCnt = (__uint16)(__GusMsCacheCnt - usErr);
}
return (__uint16)(usLen - __GusMsCacheCnt);
}
/*********************************************************************************************************
** Function name: __msXferPktFrUSB
**
** Descriptions: 从USB读取数据包并写入存储器
**
** input parameters: 无
** output parameters: 无
** global parameters: __GpucBOTXferData 批量传输数据指针
** Returned value: 返回读取的字节数或缓冲区空__MASSSTORAGE_ERROR
**
*********************************************************************************************************/
__uint16 __msXferPktFrUSB(void)
{
__uint16 usErr, usLen;
usLen = __GusMsCacheCnt; /* 读取数据包到存储器缓冲区, */
/* 注意不能溢出 */
while (__GuiMsCacheSize > __GusMsCacheCnt){
usErr = __tpbulkRead();
if (usErr == __BULKEP_RW_ERR){
return (__uint16)(__GusMsCacheCnt - usLen);
}
__GusMsCacheCnt = (__uint16)(__GusMsCacheCnt + usErr);
}
usLen = (__uint16)(__GusMsCacheCnt - usLen);
/* 回写存储器缓冲区的数据 */
usErr = msWriteSector(__GuiLBA, __GpucMassStorageBuf);
if (usErr != __MASS_SUCCESS){
return __MASSSTORAGE_ERROR;
}
__GuiLBA++;
__GpucBOTXferData = __GpucMassStorageBuf; /* 设置数据传输指针到存储器缓 */
__GusMsCacheCnt = 0; /* 冲区起始位置 */ /* 冲区起始位置 */
return usLen;
}
/*********************************************************************************************************
** Function name: msInit
**
** Descriptions: 初始化存储器
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS 初始化成功
** __MASS_FAIL 初始化失败
**
*********************************************************************************************************/
__uint8 msInit (void)
{
__uint8 ucRetVal = __MASS_FAIL;
if (__msInit() == __MASS_SUCCESS){
__GuiMsCacheSize = (__uint16)msGetInfo()->uiBlockLen;
ucRetVal = __MASS_SUCCESS;
}
return ucRetVal;
}
/*********************************************************************************************************
** Function name: msReset
**
** Descriptions: 复位存储器
**
** input parameters: 无
** output parameters: 无
** Returned value: __MASS_SUCCESS 复位成功
** __MASS_FAIL 复位失败
**
*********************************************************************************************************/
__uint8 msReset (void)
{
__uint8 ucRetVal = __MASS_FAIL;
if (__msReset() == __MASS_SUCCESS){
ucRetVal = __MASS_SUCCESS;
__GuiMsCacheSize = (__uint16)msGetInfo()->uiBlockLen;
}
return ucRetVal;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -