www.pudn.com > arm_uDisk.rar > F_driver.c


/***************************************************************/ 
/* 
 * F_driver.c, 20070206, denny 
 * 
 * A Marconix Software Product 
 * Copyright(c) Marconix Co., Ltd. 2007 
 * All Rights Reserved. Reproduction, adaption, or 
 * translation without prior written permission is 
 * prohibited, except as allowed under the copyright laws. 
 */ 
/***************************************************************/ 
 
#include "inc.h"  
#include "F_driver.h" 
#include "F_system.h" 
#include "f_fat.h" 
 
const u8 UFI_CBW[8]={0x55,0x53,0x42,0x43}; 
const u8 UFI_CSW[8]={0x55,0x53,0x42,0x53}; 
 
u8 F_ReadSector(tHANDLE Fhandle, u32 Lba, u16 Sectornum, u8 *buffer) 
{ 
	SDI_ReadSector(Fhandle, Lba, Sectornum, buffer); 
 
	return ERR_NONE; 
} 
 
u8 F_WriteSector(tHANDLE Fhandle, u32 Lba, u16 Sectornum, u8 *buffer) 
{ 
	SDI_WriteSector(Fhandle, Lba, Sectornum, buffer); 
 
	return ERR_NONE; 
} 
 
u8 CheckCBWTable(u8 *CBWTable) 
{ 
	u8 i; 
	for(i=0;i<4;i++) 
	{ 
		if(CBWTable[i] != UFI_CBW[i]) 
		{ 
			 
			return 0xff; //not CBW table 
		} 
	} 
	return ERR_NONE; 
} 
 
u8 GetCBWTable(u8 *CBWTable,u8 *DiskIndex,u32 *LBA_START, u16 *LBA_Length, u8 *SCSICommand) 
{ 
	u8 i; 
 
	*DiskIndex = CBWTable[13];  // UFI CBW_LUN 
	*SCSICommand = CBWTable[15]; // SCSI Read(10) Command 
 
	*LBA_START  = (u32)((CBWTable[17]&0xff)<<24); 
	*LBA_START += (u32)((CBWTable[18]&0xff) << 16); 
	*LBA_START+= (u32)((CBWTable[19]&0xff)<< 8) ; 
	*LBA_START += (u32)(CBWTable[20]& 0xff) ; 
	*LBA_Length = (u16)((CBWTable[22] &0xff)<< 8); 
	*LBA_Length +=(u16)(CBWTable[23]  & 0xff); 
 
	if(CBWTable[12]&0x80)//out 
		return 1; 
	else 
		return 0; 
} 
 
void FillCSWTable(u8 *CSWTable) 
{ 
	u8 i; 
	for(i=0;i<13;i++) 
	{ 
		CSWTable[i] = 0; 
	} 
	memcpy(&CSWTable[0],UFI_CSW,4); 
} 
 
void FillInquiryTable(u8 *InquiryTable) 
{ 
	u8 i; 
	u8 strTable[28]= {'S','3','C','2','4','1','0',' ','A','R','M',' ','F','l','a','s','h',' ','D','i','s','k',' ',' ','0','.','0','0'}; 
	for(i=0;i<64;i++) 
	{ 
		InquiryTable[i] = 0; 
	} 
	InquiryTable[0] = 0x00; 
	InquiryTable[1] = 0x80; 
	InquiryTable[2] = 0x00; 
	InquiryTable[3] = 0x00; 
	InquiryTable[4] = 0x1f; 
	for(i=0;i<28;i++) 
	{ 
		InquiryTable[8+i] = strTable[i]; 
	} 
} 
 
u8 FillCapacityTable(u8 *CapacityTable) 
{ 
	u8 i; 
	u8 secBuf[512] = {0}; 
 
	F_partrecord PartInfo; 
	PartInfo.prStartLBA = 0; 
 
	for(i=0;i<64;i++) 
	{ 
		CapacityTable[i] = 0; 
	} 
 
	if(F_ReadSector(hFile, PartInfo.prStartLBA, 1, secBuf)) 
		return F_ERR_DRIVER_READ_FAILURE; 
	if(secBuf[0] == 0xE9 || (secBuf[0] == 0xEB && secBuf[2] == 0x90))//It's Boot Sector  
	{ 
		if(secBuf[510] != BOOTSIG0 || secBuf[511] != BOOTSIG1 ) 
			return F_ERR_INVALID_BOOT_SECTOR; 
	} 
	else//It's MBR 
	{ 
		if(secBuf[510] != BOOTSIG0 || secBuf[511] != BOOTSIG1 ) 
			return F_ERR_INVALID_MBR; 
		//PartInfo.prStartLBA = (u32)((((u32)secBuf[0x1C9])<<24) + (((u32)secBuf[0x1C8])<<16)+ (((u32)secBuf[0x1C7])<<8) + (secBuf[0x1C6])); 
		PartInfo.prStartLBA = (u32)((((u32)secBuf[0x1C9])*0x1000000) + (((u32)secBuf[0x1C8])*0x10000)+ (((u32)secBuf[0x1C7])*0x100) + (secBuf[0x1C6])); 
 
		if(F_ReadSector(hFile, PartInfo.prStartLBA, 1, secBuf)) 
			return F_ERR_DRIVER_READ_FAILURE; 
 
		if(secBuf[510] != BOOTSIG0 || secBuf[511] != BOOTSIG1 ) 
			return F_ERR_INVALID_BOOT_SECTOR; 
	} 
 
	CapacityTable[0]=secBuf[0x23]; 
	CapacityTable[1]=secBuf[0x22]; 
	CapacityTable[2]=secBuf[0x21]; 
	CapacityTable[3]=secBuf[0x20]; 
	 
	CapacityTable[7]=secBuf[0x0B]; 
	CapacityTable[6]=secBuf[0x0C];     //ÿÉÈÇø×Ö½ÚÊý 
	return 0; 
}