f_driver.c

来自「基于arm9的,usb设备(u盘)的读写操作实现.」· C语言 代码 · 共 140 行

C
140
字号
/***************************************************************/
/*
 * 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;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?