disk.c

来自「汽车记录仪元代码」· C语言 代码 · 共 327 行

C
327
字号
//#include "ezusb.h"
//#include "ezregs.h"
#include "host_811.h"
//////////////////////////////////////////////////////////////////////////////


extern EZUSB_Delay(int i);
//extern unsigned char Read_Bytes64 ( unsigned int Address );//, unsigned char DataBuff [] );

extern unsigned char i2c_read(unsigned int address);
//#define Ram_Size 3072
//extern xdata unsigned char Ram3K [ Ram_Size ];
extern xdata BYTE 			DBUF[512];
extern xdata BYTE 			TRBUF[52];
extern BYTE disk_out;
extern BYTE disk_in;

extern void	kick_watchdog();

int read_disk(WORD LB_addrH,WORD LB_addrL,WORD TR_length)		//读取U DISK中的信息(一个扇区一读)
{ BYTE i; 
      TRBUF[0]=0x55;
      TRBUF[1]=0x53;
      TRBUF[2]=0x42;
      TRBUF[3]=0x43;
      TRBUF[4]=0x28;
      TRBUF[5]=0xE8;
      TRBUF[6]=0x31;
      TRBUF[7]=0xFE;
      TRBUF[8]=0x00;
      TRBUF[9]=0x02;
      TRBUF[10]=0x00;
      TRBUF[11]=0x00;
      TRBUF[12]=0x80;
      TRBUF[13]=0x00;
      TRBUF[14]=0x0A;
      TRBUF[0+15]=0x28;
      TRBUF[1+15]=0;
      TRBUF[2+15]=(BYTE)(LB_addrH>>16);
      TRBUF[3+15]=(BYTE)(LB_addrH);
      TRBUF[4+15]=(BYTE)(LB_addrL>>8);
      TRBUF[5+15]=(BYTE)(LB_addrL);
      TRBUF[6+15]=0;
      TRBUF[7+15]=(BYTE)(TR_length>>8);
      TRBUF[8+15]=(BYTE)(TR_length);
      TRBUF[9+15]=0;
      TRBUF[10+15]=0;
      TRBUF[11+15]=0;
	  for(i=26;i<32;i++) TRBUF[i]=0;
	  
//	  	kick_watchdog();	//12.23 updated by Bian Zhuoyue

     
   if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
      return(0);
  
   if( !usbXfer(1,disk_in,PID_IN,0,64,512,DBUF))
      return(0);
 


   if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
     return(0); 
     return(1);

}


int write_disk(WORD LB_addrH,WORD LB_addrL,WORD TR_length)		//写入U DISK信息(一个扇区一写)
{   
      
BYTE i,j,detime; 

//detime = 200;
	switch ( TR_length )
	{
		case 0: return 0;
		case 1: detime = 200;
			break;
		default: detime = 100;
	}

      TRBUF[0]=0x55;
      TRBUF[1]=0x53;
      TRBUF[2]=0x42;
      TRBUF[3]=0x43;
      TRBUF[4]=0x28;
      TRBUF[5]=0xE8;
      TRBUF[6]=0x31;
      TRBUF[7]=0xFE;
      TRBUF[8]=0x00;
      TRBUF[9]=0x02;
      TRBUF[10]=0x00;
      TRBUF[11]=0x00;
      TRBUF[12]=0x00;
      TRBUF[13]=0x00;
      TRBUF[14]=0x0A;
      TRBUF[0+15]=0x2A;
      TRBUF[1+15]=0;
      TRBUF[2+15]=(BYTE)(LB_addrH>>8);
      TRBUF[3+15]=(BYTE)(LB_addrH);
      TRBUF[4+15]=(BYTE)(LB_addrL>>8);
      TRBUF[5+15]=(BYTE)(LB_addrL);
      TRBUF[6+15]=0;
      TRBUF[7+15]=(BYTE)(TR_length>>8);
      TRBUF[8+15]=(BYTE)(TR_length);
      TRBUF[9+15]=0;
      TRBUF[10+15]=0;
      TRBUF[11+15]=0;
	  for(i=26;i<32;i++) TRBUF[i]=0;

  if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
      return(0);
  EZUSB_Delay(detime);
  for(j=0;j<TR_length;j++)
  {	 
	  for(i=0;i<8;i++)   
	   { if( !usbXfer(1,disk_out,PID_OUT,0,64,64,&DBUF[i*64]))
	        return(0);
	      EZUSB_Delay(detime);
  	  	kick_watchdog();	//12.23 updated by Bian Zhuoyue
		}
  }
  if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
       return(0); 
	 
       return(1);

}

int write_disk8(WORD I2CLBA,WORD LB_addrH,WORD LB_addrL,WORD TR_length) //写入U DISK信息(八个扇区一写)主要写文件内容
{   
      
BYTE j,k;
WORD I2Caddr,i;      

      TRBUF[0]=0x55;
      TRBUF[1]=0x53;
      TRBUF[2]=0x42;
      TRBUF[3]=0x43;
      TRBUF[4]=0x28;
      TRBUF[5]=0xE8;
      TRBUF[6]=0x31;
      TRBUF[7]=0xFE;
      TRBUF[8]=0x00;
      TRBUF[9]=0x02;
      TRBUF[10]=0x00;
      TRBUF[11]=0x00;
      TRBUF[12]=0x00;
      TRBUF[13]=0x00;
      TRBUF[14]=0x0A;
      TRBUF[0+15]=0x2A;
      TRBUF[1+15]=0;
      TRBUF[2+15]=(BYTE)(LB_addrH>>8);
      TRBUF[3+15]=(BYTE)(LB_addrH);
      TRBUF[4+15]=(BYTE)(LB_addrL>>8);
      TRBUF[5+15]=(BYTE)(LB_addrL);
      TRBUF[6+15]=0;
      TRBUF[7+15]=(BYTE)(TR_length>>8);
      TRBUF[8+15]=(BYTE)(TR_length);
      TRBUF[9+15]=0;
      TRBUF[10+15]=0;
      TRBUF[11+15]=0;
      for(i=26;i<32;i++) TRBUF[i]=0;

     I2Caddr=I2CLBA*512;
  if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
      return(0);
  for(j=0;j<TR_length;j++)   
  for(i=0;i<500;i+=64)
  {    for(k=0;k<64;k++)
      DBUF[i+k]=i2c_read(I2Caddr++);
    if( !usbXfer(1,disk_out,PID_OUT,0,64,64,&DBUF[i]))
        return(0);
     
 }
  if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
       return(0); 
     
       return(1);

}

int med_rem(BYTE flag)		//flag	1:允许建立、或删除文件和目录	0:不允许建立、或删除文件和目录
{ BYTE i; 
      TRBUF[0]=0x55;
      TRBUF[1]=0x53;
      TRBUF[2]=0x42;
      TRBUF[3]=0x43;
      TRBUF[4]=0x08;
      TRBUF[5]=0x0A;
      TRBUF[6]=0xE1;
      TRBUF[7]=0xFC;
      TRBUF[8]=0x00;
      TRBUF[9]=0x00;
      TRBUF[10]=0x00;
      TRBUF[11]=0x00;
      TRBUF[12]=0x00;
      TRBUF[13]=0x00;
      TRBUF[14]=0x06;
      TRBUF[0+15]=0x1E;
      TRBUF[1+15]=0;
      TRBUF[2+15]=0;
      TRBUF[3+15]=0;
      TRBUF[4+15]=flag;
      TRBUF[5+15]=0;
      TRBUF[6+15]=0;
      TRBUF[7+15]=0;
      TRBUF[8+15]=0;
      TRBUF[9+15]=0;
      TRBUF[10+15]=0;
      TRBUF[11+15]=0;
	  for(i=26;i<32;i++) TRBUF[i]=0;
	  
     
if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
     return(0);


if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
     return(0); 
     return(1);

}
/*
int unit_ready()		//设备准备好了??(未使用)
{ BYTE i; 
      TRBUF[0]=0x55;
      TRBUF[1]=0x53;
      TRBUF[2]=0x42;
      TRBUF[3]=0x43;
      TRBUF[4]=0x08;
      TRBUF[5]=0x0A;
      TRBUF[6]=0xE1;
      TRBUF[7]=0xFC;
      TRBUF[8]=0x00;
      TRBUF[9]=0x00;
      TRBUF[10]=0x00;
      TRBUF[11]=0x00;
      TRBUF[12]=0x00;
      TRBUF[13]=0x00;
      TRBUF[14]=0x06;
      TRBUF[0+15]=0;
      TRBUF[1+15]=0;
      TRBUF[2+15]=0;
      TRBUF[3+15]=0;
      TRBUF[4+15]=0;
      TRBUF[5+15]=0;
      TRBUF[6+15]=0;
      TRBUF[7+15]=0;
      TRBUF[8+15]=0;
      TRBUF[9+15]=0;
      TRBUF[10+15]=0;
      TRBUF[11+15]=0;
	  for(i=26;i<32;i++) TRBUF[i]=0;
	  
     
if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
     return(0);


if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
     return(0); 
     return(1);

}
*/

int write_pro()		//0: error;		1: not protect;		2: protect
{
	BYTE i; 
    TRBUF[0]=0x55;
    TRBUF[1]=0x53;
    TRBUF[2]=0x42;
    TRBUF[3]=0x43;
    TRBUF[4]=0x08;
    TRBUF[5]=0x0A;
    TRBUF[6]=0xE1;
    TRBUF[7]=0xFC;
    TRBUF[8]=0xC0;
    TRBUF[9]=0x00;
    TRBUF[10]=0x00;
    TRBUF[11]=0x00;
    TRBUF[12]=0x80;
    TRBUF[13]=0x00;
    TRBUF[14]=0x06;
    TRBUF[0+15]=0x1A;
    TRBUF[1+15]=0x00;
    TRBUF[2+15]=0x1C;
    TRBUF[3+15]=0x00;
    TRBUF[4+15]=0xC0;
    TRBUF[5+15]=0x00;
    TRBUF[6+15]=0x00;
    TRBUF[7+15]=0x00;
    TRBUF[8+15]=0x00;
    TRBUF[9+15]=0x00;
    TRBUF[10+15]=0x00;
    TRBUF[11+15]=0x00;
	for(i=26;i<32;i++) TRBUF[i]=0;
	   
	if( !usbXfer(1,disk_out,PID_OUT,0,64,31,TRBUF))
	{
    	return(0);
	}

	if( !usbXfer(1,disk_in,PID_IN,0,64,4,TRBUF))
	{
    	return(0);
	}
	i = TRBUF[2];

	if( !usbXfer(1,disk_in,PID_IN,0,64,13,TRBUF))
	{
    	return(0);
	}

	if ( i & 0x80 )
	{
		return(2);
	}
	else
	{
		return(1);
	}
   	return(0);
}

⌨️ 快捷键说明

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