⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide_drv.c

📁 atmel at89c51snd1c mp3芯片方案源码
💻 C
字号:

#include "config.h"                         /* system configuration */
#include "ide_drv.h"
#include "..\usb\usb_drv.h"                 /* usb driver definition */
#include "lib_mcu\lcd\lcd_drv.h"            /* c51 driver definition */
#include "lib_mcu\clock\clock.h"
//#include "lib_mcu\serial\serial.h"

#define Usb_clear_RXOUTB0()  {if(UEPSTAX & 0x42)  UEPSTAX &= 0xbd;}


extern  xdata  Byte     gl_media_buffer[512];
extern         bit      bMediaReadOpenFlag;
extern         INT16U   u16MediaBytePointer;
extern         INT32U   u32MediaSector;

extern  data   Uint32   dCBWDataTransferLength;
extern  data   Uint16   hdd_data_length;



/////////////////////////////////////////////////////////////////////
bit WriteCommand(INT8U u8Command)
{
  INT8U u8Try = 0;

  do
  {
    ACC = FILE7;
    u8Try ++;
    if(u8Try > 250)
    {
      return FALSE;
    }
  }
  while(BSY);

  FILE7 = u8Command;
  return TRUE;
}


/////////////////////////////////////////////////////////////////////
bit hdd_install(void)
{ 
  AUXR = 0x5c;         //设置EXT16=1,使能16-BIT传送模式
  INTQ = 1;
  ARST = 0;
  clock_vDelay(0xff);
  ARST = 1;

  do
  { 
     FILE6 = 0xa0; 
     ACC = FILE7;
  } 
  while(!DRDY | BSY);
  FILE6 = 0x20;
  FILE2 = 64;
  FILE7 = 0x91;

  do{ACC = FILE7;} while(BSY);
  FILE7 = 0x10;

  do{ACC = FILE7;} while(BSY); 

  return OK;
}


/////////////////////////////////////////////////////////////////////
void HardDiskSleep(void)
{
 do{ACC = FILE7;} while(BSY); //wait for NO busy
 WriteCommand(0xe0);   //write command code
// do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
}


/////////////////////////////////////////////////////////////////////
bit hdd_read_open(Uint32 hdd_sector)
{   
   INT16U i = 0;
   INT8U head, cylinderh, cylinderl, sector;

   u32MediaSector = hdd_sector;

   head      = ((Byte*)&u32MediaSector)[0];
   cylinderh = ((Byte*)&u32MediaSector)[1];
   cylinderl = ((Byte*)&u32MediaSector)[2];
   sector    = ((Byte*)&u32MediaSector)[3];

   do{ACC = FILE7;} while(BSY); //wait for NO busy

   FILE6 = (0xe0 | (head & 0x0f)); 
   FILE5 = cylinderh;    //high 2-bit cylinder
   FILE4 = cylinderl;    //low 8-bit cylinder
   FILE3 = sector;       //start sector
   FILE2 = 0x01;         //sector counter
   WriteCommand(0x20);   //write command code
 
   do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request

   ACC = FILE7;
   if (ERR)
     return KO;

   for (i=0; i<512; )
   {
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
	  gl_media_buffer[i++] = FILE0;
      gl_media_buffer[i++] = DAT16H;
   }

   u16MediaBytePointer = 0;
   bMediaReadOpenFlag = 1;

   return OK;
}

/////////////////////////////////////////////////////////////////////
Byte hdd_read_byte(void)
{
   INT8U u8Data;

   if(u16MediaBytePointer >= 512)       //a new sector
   {
      u32MediaSector += 1;
      hdd_read_open(u32MediaSector);
   }

   u8Data = gl_media_buffer[u16MediaBytePointer ++];
   return(u8Data);
}


/////////////////////////////////////////////////////////////////////
bit hdd_read_close(void)
{  
   u16MediaBytePointer = 0;
   bMediaReadOpenFlag = 0;
   return OK;
}


/////////////////////////////////////////////////////////////////////
bit hdd_read_one_sector(Uint32 hdd_sector)
{
   Byte i;

   if(hdd_read_open(hdd_sector) == OK)
   {
      for (i = 0; i < 8; i++)
      {
        Usb_select_ep(EP_IN);
                      /* read 64 bytes from card */
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
        Usb_write_byte(hdd_read_byte());        
        Usb_write_byte(hdd_read_byte());
     
        Usb_set_TXRDY();
        Usb_select_ep(EP_IN);
        while (!Usb_tx_complete());
        Usb_clear_TXCMPL();  
      }	 
      hdd_read_close();

      return OK;
    }
    return KO;
}

///////////////////////////////////////////////////////////////////// 
bit hdd_write_open(Uint32 hdd_sector)
{
   INT8U head,cylinderh,cylinderl,sector;

   u32MediaSector = hdd_sector;

   head      = ((Byte*)&u32MediaSector)[0];
   cylinderh = ((Byte*)&u32MediaSector)[1];
   cylinderl = ((Byte*)&u32MediaSector)[2];
   sector    = ((Byte*)&u32MediaSector)[3];

   do{ACC = FILE7;} while(BSY);

   FILE6 = (0xe0 | (head & 0x0f));
   FILE5 = cylinderh;               //high 2-bit cylinder
   FILE4 = cylinderl;               //low 8-bit cylinder
   FILE3 = sector;                  //start sector
   FILE2 = 1;                       //sector counter
    
   WriteCommand(0x30); 

   do{ACC = FILE7;} while(BSY |! DRQ); //wait for noBUSY and data request
  
   ACC = FILE7;
   if (ERR)
     return KO;

   u16MediaBytePointer = 0;
   return OK;
}


///////////////////////////////////////////////////////////////////// 
bit hdd_write_byte(Byte hdd_data)
{
   gl_media_buffer[u16MediaBytePointer ++] = hdd_data;
   return OK;
}

///////////////////////////////////////////////////////////////////// 
bit hdd_write_close(void)
{
   INT16U i;

   for(i=0; i<512;)
   {
      DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;  
      DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2; 
	  DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;
   	  DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;
      DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;  
      DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2; 
	  DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;
   	  DAT16H = gl_media_buffer[i + 1];
      FILE0  = gl_media_buffer[i];
	  i += 2;	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   
   }

   do{ACC = FILE7;} while(BSY); 
   return OK;
}



///////////////////////////////////////////////////////////////////// 
bit hdd_write_one_sector(Uint32 hdd_sector)
{
   INT8U j;

   Usb_select_ep(EP_OUT);   

   for (j=0; j<8; j++)
   {
      while(!Usb_rx_complete());          /* wait end of reception */

	  hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());
      hdd_write_byte(Usb_read_byte());

      Usb_clear_RXOUT_PP();	     
   }
  
   hdd_write_open(hdd_sector);
   hdd_write_close();
   return OK;
}


/////////////////////////////////////////////////////////////////////////////////
Uint32 hdd_read_long_big_endian()
{
 Uint32  cluster;

  ((Byte*)&cluster)[3] = hdd_read_byte();
  ((Byte*)&cluster)[2] = hdd_read_byte();   
  ((Byte*)&cluster)[1] = hdd_read_byte();   
  ((Byte*)&cluster)[0] = hdd_read_byte();

   return  cluster;
}




⌨️ 快捷键说明

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