www.pudn.com > LPC2200_USB.rar > USB_MASS.c, change:2005-05-08,size:4885b


/****************************************Copyright (c)************************************************** 
**                               广州周立功单片机发展有限公司 
**                                     研    究    所 
**                                        ARM开发组 
** 
**                                 http://www.zlgmcu.com 
** 
**--------------文件信息-------------------------------------------------------------------------------- 
**文   件   名: flash.c 
**创   建   人: 陈明计 
**最后修改日期:  2003年9月3日 
**描        述: FAT文件系统在PC上编译的软盘驱动程序(底层驱动) 
**               
**--------------历史版本信息---------------------------------------------------------------------------- 
** 创建人: 陈明计 
** 版  本: V1.0 
** 日 期: 2003年9月3日 
** 描 述: 原始版本 
** 
**--------------当前版本修订------------------------------------------------------------------------------ 
** 修改人:  
** 日 期: 
** 描 述: 
** 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
 
#define IN_FLOPPY 
#include "config.h" 
 
 
hMedLUN 	*g_MediumPtr; 
 
uint32 GetVolumeFirstSect(uint8 Device) 
{ 
	uint8 buffer[512]; 
	uint32 RelaStaSect; 
 
	if(g_MediumPtr == NULL) 
		return -1;	 
	if(ReadBlockData(g_MediumPtr, buffer, 0, 1)==0) 
		return -1;	 
	 
	if((buffer[510]==0x55)&&(buffer[511]==0xAA)) 
	{ 
		if(((buffer[0]==0xEB)&&(buffer[2]==0x90))||(buffer[0] == 0xE9))/**/ 
		{ 
			RelaStaSect = 0; 
		} 
		else 
		{ 
			RelaStaSect = buffer[454]+  
					 	  buffer[455]*0x100 +  
					 	  buffer[456]*0x10000 +  
					 	  buffer[457]*0x1000000; 
		} 
	} 
	return RelaStaSect;	 
} 
 
/********************************************************************************************************* 
** 函数名称: CFCammand 
** 功能描述: 底层驱动程序与上层的接口程序 
** 
** 输 入: Cammand:DISK_INIT:驱动程序初始化 
**                 DISK_CLOSE:关闭驱动器(移除驱动程序)                  
**                 DISK_CREATE_BOOT_SECTOR:重建引导扇区 
**                 DISK_READ_SECTOR:读扇区 
**                 DISK_WRITE_SECTOR:写扇区 
**        Parameter:剩余参数 
** 输 出: DISK_READ_OK:读扇区完成 
**        DISK_READ_NOT_OK:读扇区失败 
**        DISK_WRITE_OK:写扇区完成 
**        DISK_WRITE_NOT_OK:写扇区失败 
**        DISK_INIT_OK:初始化完成 
**        DISK_INIT_NOT_OK:初始化失败 
**        BAD_DISK_COMMAND:无效的命令 
** 全局变量: 无 
** 调用模块: 无 
** 
** 作 者: 陈明计 
** 日 期: 2003年9月3日 
**------------------------------------------------------------------------------------------------------- 
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
        uint16 USBCammand(uint8 Cammand, void *Parameter) 
{ 
    uint16 rt; 
    Disk_RW_Parameter * Dp; 
    Disk_Info *DiskInfo; 
     
    device_instance * dviPtr; 
     
    Dp = (Disk_RW_Parameter *)Parameter; 
 
    switch (Cammand) 
    { 
        case DISK_INIT:											/*设备初始化*/ 
            rt = DISK_INIT_NOT_OK; 
			dviPtr = find_mass_device(0);						/* 查找U盘,返回0则U盘不存在 */ 
			if(dviPtr) 
				g_MediumPtr =  Creat_Medium( dviPtr ,0); 
            if(g_MediumPtr)										/*查找逻辑单元,返回0则逻辑单元无效*/ 
			{ 
            	DiskInfo = GetEmptyDiskInfoAddr(); 
            	if (DiskInfo != NULL) 
            	{ 
                	DiskInfo->DiakCommand = USBCammand; 
                	DiskInfo->RsvdForLow = GetVolumeFirstSect(0);/*获取卷首扇区*/ 
                	rt = DISK_INIT_OK; 
            	} 
	        } 
            break; 
        case DISK_CLOSE: 
       		Close_Medium(g_MediumPtr,0);						/* 关闭逻辑单元,再次打开逻辑单元前须关闭该逻辑单元 */		 
            rt = RETURN_OK; 
            break; 
        case DISK_READ_SECTOR:									/*读扇区*/ 
            rt = DISK_READ_NOT_OK; 
            if(ReadBlockData(g_MediumPtr, Dp->Buf, Dp->SectorIndex + Dp->RsvdForLow, 1)) 
            { 
                rt = DISK_READ_OK; 
            } 
            break; 
        case DISK_WRITE_SECTOR:									/*写扇区*/ 
            rt = DISK_WRITE_NOT_OK; 
            if(WriteBlockData(g_MediumPtr, Dp->Buf, Dp->SectorIndex + Dp->RsvdForLow, 1)) 
            { 
               rt = DISK_WRITE_OK; 
            } 
 
            break; 
        default: 
            rt = BAD_DISK_COMMAND; 
            break; 
    } 
    return rt; 
} 
 
 
/********************************************************************************************************* 
**                            End Of File 
********************************************************************************************************/