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 + -
显示快捷键?