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

📄 init.c

📁 ISP1583 Mass Storgae Firmware
💻 C
📖 第 1 页 / 共 2 页
字号:
   //call the initialization routine of ISP1581
	Init_D14_SFR();

   //Initialize Endpoint Size
	Init_Endpoint();		

   //initialize internal varaible
	USB_Device.BITS.State = USB_Default;
	Device_Config_Value = 0;
	USB_Device.BITS.Alter_Interface = 0;

}


//***********************************************************************
//*										    							               *
//*	Routine 	: Init D14 SFR                                     		*
//*	Input		: ISP1581 SFR                      				            *
//*	Output	: None                                  					   *
//*	Function	: To initialize ISP1581                     			      *
//*																		               *
//***********************************************************************

void Init_D14_SFR(void)
{

	D14_Cntrl_Reg.D14_MODE.VALUE = 0x0802;   	
   	
   //set all interrupt source to mode 1
   D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;			


   //set the interrupt mask register
	D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x79090000;	


   //initialize the config and hardware register to
   //set ISP1581 to ATAPI bridge mode
	D14_Cntrl_Reg.D14_DMA_CONFIG.VALUE = 0x0122;
   
   //enable DMA interrupt
	D14_Cntrl_Reg.D14_DMA_INT_ENABLE.VALUE = 0x1E02;
  
}


//***********************************************************************
//*										    							               *
//*	Routine 	: Init Endpoint                                    		*
//*	Input		: ISP1581 FIFO                     				            *
//*	Output	: None                                  					   *
//*	Function	: To initialize ISP1581 endpoint FIFO       			      *
//*																		               *
//***********************************************************************

void Init_Endpoint(void)
{

   //check if device in full speed state
   if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
   {


		//Bulk Out MaxPacketSize Endpoint

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;	


		//Bulk In MaxPacketSize Endpoint

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;	


		//Bulk Out Endpoint Type

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;


		//Bulk In Endpoint Type

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;


      //enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			

      //enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			

	}

   //check if device in high speed         
	if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
	{
      
		//Bulk Out MaxPacketSize Endpoint

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;	


		//Bulk In MaxPacketSize Endpoint

		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;	


		//Bulk Out Endpoint Type

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
      D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;


		//Bulk In Endpoint Type

      D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
      D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;


      //enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			

      //enable FIFO
		D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
		D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;			

	}

   //set to DMA endpoint 1
   //set to Endpoint Index to 2
   //this is to prevent the endpoint index pointing to the same endpoint          
	D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;		
   D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

   D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.CLBUF = 1;
   
	D14_Cntrl_Reg.D14_DMA_ENDPOINT = 2;		
   D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;

   D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.CLBUF = 1;

   //enable device and reset the device address
	D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80;		
}

//***********************************************************************
//*										    							               *
//*	Routine 	: Get Device Info                                  		*
//*	Input		: IDE Device                       				            *
//*	Output	: None                                  					   *
//*	Function	: To retrieve identify drive command data   			      *
//*																		               *
//***********************************************************************

void Get_Device_Info(void)
{
      
         //reset all drive internal variable
			Drive_Setup.General_Config = 0;
			Drive_Setup.PIO_Mode = 0;
			Drive_Setup.MDMA_Mode = 0;
			Drive_Setup.Advanced_PIO = 0;
			Drive_Setup.UDMA_Mode = 0;

         //select master drive
   if(Kernel_Flag.BITS.MASTER_ATA_DRIVE || Kernel_Flag.BITS.MASTER_ATAPI_DRIVE)
   	{
   	
		Check_Busy();
	   D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = MASTER_DRIVE;
		Check_Busy();
   	}
   else
   	{
		Check_Busy();
	D14_Cntrl_Reg.D14_DRIVE_SELECT_TASKFILE = SLAVE_DRIVE;
	Check_Busy();
   	}	
         //initialize bytecount taskfile register to 512 bytes		
			D14_Cntrl_Reg.D14_BYTECOUNT_LSB_TASKFILE = 0;
			D14_Cntrl_Reg.D14_BYTECOUNT_MSB_TASKFILE = 2;

         //check if device is an ATAPI device, if yes issue
         //ATAPI identify drive command
         if(Kernel_Flag.BITS.MASTER_ATAPI_DRIVE ||
         	  Kernel_Flag.BITS.SLAVE_ATAPI_DRIVE)
            D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATAPI_DEVICE;		

      
         //check if device is an ATA device, if yes issue
         //ATA identify drive command
			if(Kernel_Flag.BITS.MASTER_ATA_DRIVE ||
			    Kernel_Flag.BITS.SLAVE_ATA_DRIVE)
				D14_Cntrl_Reg.D14_CMD_STATUS_TASKFILE = ID_ATA_DEVICE;		//issue identify device command

         //check for completion of ATAPI command and clear flag
	      while(!DMA_Int_Flag.BITS.INTRQ_SEEN && !DMA_Int_Flag.BITS.CMD_INTRQ_OK)
	      	{
	      		if(Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.SUSP)
                     	return;
	      	}

         DMA_Int_Flag.BITS.INTRQ_SEEN = 0;
         DMA_Int_Flag.BITS.CMD_INTRQ_OK = 0;

         //set DMA counter to 512 bytes                           
			D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_LSB = 0;
			D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE2 = 2;
			D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_BYTE3 = 0;
			D14_Cntrl_Reg.D14_DMA_TRANSFER_COUNTER_MSB = 0;

         //issue read 1F0 command to ISP1581
			Read_1F0();


         //retrieve identify drive command data
         for(count = 0 ; count < 512 ; count++)
			{
            
				switch(count)		
				{
				
            //General Configuration	
				case	0	:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	1	:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.General_Config = Data_Swap.word;
							   break;

            //Logical Cylinders	
				case	2	:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	3  :
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Logical_Cylinders = Data_Swap.word;
							   break;
				

            //Logical Heads	
				case	6	:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	7  :
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Logical_Heads = Data_Swap.word;
							   break;

            //Logical Sectors	
				case	12	:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	13 :
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Logical_Sectors = Data_Swap.word;
							   break;


				//Max Sector Burst Length
				case	94:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   break;
				case	95:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   Drive_Setup.Max_Burst_Length = Data_Swap.word;
							   break;
            
				//PIO Mode
				case	102:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
				            break;
				case	103:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   Drive_Setup.PIO_Mode = Data_Swap.word;
							   break;


            //Current Cylinders	
				case	108:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	109:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Current_Cylinders = Data_Swap.word;
							   break;
				

            //Current Heads	
				case	110:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	111:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Current_Heads = Data_Swap.word;
							   break;

            //Current Sectors	
				case	112:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   break;
				case	113:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   Drive_Setup.Current_Sectors = Data_Swap.word;
							   break;

            //Current Capacity
				case	114	:
							Drive_Setup.Current_Capacity[3] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	115	:
							Drive_Setup.Current_Capacity[2] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	116	:
							Drive_Setup.Current_Capacity[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	117	:
							Drive_Setup.Current_Capacity[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;              

            //Max LBA
				case	120	:
							Drive_Setup.LBA[3] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	121	:
							Drive_Setup.LBA[2] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	122	:
							Drive_Setup.LBA[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;
				case	123	:
							Drive_Setup.LBA[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							break;              
              
				
            //MDMA Transfer Mode
				case	126:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   break;
				case	127:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   Drive_Setup.MDMA_Mode = Data_Swap.word;
							   break;
	
				//Advanced PIO Mode
				case	128:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   break;
				case	129:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   Drive_Setup.Advanced_PIO = Data_Swap.word;
							   break;


	
				//UDMA Mode
				case	176:
							   Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   break;
				case	177:
							   Data_Swap.byte[0] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;
							   Drive_Setup.UDMA_Mode = Data_Swap.word;
							   break;

				default  :
						      Data_Swap.byte[1] = D14_Cntrl_Reg.D14_DATA_TASKFILE_LSB;		
							   break;
								
				}
         }
}

























⌨️ 快捷键说明

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