⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 massstorage.c

📁 smartARM2400 USB OTG例程
💻 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 + -