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

📄 initiator_mode_sen.c

📁 基于FAS466的SCSI控制器的启动器模式的C源代码。
💻 C
字号:
#define	GLB extern

#include <stdio.h>
#include <conio.h>
#include <sys\types.h>
#include <sys\timeb.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>

#include "fas466defs.h"
#include "fas466regs.h"
#include "fas466globalvars.h"



void Initiator_Mode_sen()
{

// set up some vars to handle the loop below
        unsigned long req_sen_i = 0x0;
        unsigned char req_sen_x = 0x0;
		unsigned long temp1, temp2; 
		unsigned short	tempval;
		unsigned long status = 0;

        printf("  Mode Sense issued \n"); 

	RegWrite(SC_FIFO , 0xC0) ;  // msg1

    RegWrite(SC_FIFO , 0x1A) ;  // cdb1
	RegWrite(SC_FIFO , 0x0) ;  // cdb2
	RegWrite(SC_FIFO , 0x0) ;  // cdb3
	RegWrite(SC_FIFO , 0x0) ;  // cdb4
    RegWrite(SC_FIFO , 0xFF) ;  // cdb5
	RegWrite(SC_FIFO , 0x0) ;  // cdb6

	printf("      Issue SelWAtn Command (1 messages)\n");
        RegWrite(SC_Command , SC_CMD_Select1_With_ATN_Seq );;
		ExpCmdCmptStat = SC_Function_Complete;
	if ( RegRead(SC_Selection_Configuration1) == 0 )// 
		{
			Cmd_Complete466();
			// receive back the first 8 bytes of the request sense data
		do {
        RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;	
		Cmd_Complete466();
        printf("  FIFO Data %X ",RegRead( SC_FIFO ) ); 
        req_sen_i = req_sen_i + 1;
			} while (req_sen_i < 7);
	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete | SC_Bus_Service;		
		Cmd_Complete466();
	    printf("  FIFO Data %X ",RegRead( SC_FIFO ) ); 
		}
	else
	{ 
		Cmd_Complete466();
		printf("\n  DMA command.....");
	//	printf("\n  SC_Error_Interrupt_Status =%X ",RegRead(SC_Error_Interrupt_Status));
		printf("\n  SC_FIFO_Count = %X ",RegRead(SC_FIFO_Count));
        RegWrite(SC_Command , SC_CMD_Xfer_Information_DMA);
		ExpCmdCmptStat = SC_Bus_Service;	
		Cmd_Complete466();
		printf("\n SC_FIFO  = ");
		while (RegRead(SC_FIFO_Count) != 0)
			{
			printf(" %X ,",RegRead(SC_FIFO));
			}
	}

	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;	
		Cmd_Complete466();
        printf("\n Message = %x ", RegRead(SC_FIFO));
	    RegWrite(SC_Command , SC_CMD_Message_Accepted);
		ExpCmdCmptStat = SC_Function_Complete;	
	    Cmd_Complete466();


	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;	
		Cmd_Complete466();
        printf("\n Message = %x ", RegRead(SC_FIFO));
        RegWrite(SC_Command , SC_CMD_Message_Accepted);
		ExpCmdCmptStat = SC_Function_Complete | SC_SCSI_Disconnect;	
	    Cmd_Complete466();

        printf("\n DISCONECTED ");

	    RegWrite(SC_Command , SC_CMD_Enable_Selection_Reslection);

// ******************************  Reselection here **************
       
		printf("\n Waiting for Reselection... ");
		do {  
       status = RegRead(SC_Command_Interrupt_Status); //
       if (status != 0 )   printf("\n status = %x ", status);
		}
		while (status == SC_No_Bus_Initiated_Event);
    
    if (status == 2) //  	 ; Reselection
	{
		printf("\n Reselected by Target ID = %x ", RegRead(SC_FIFO));  //display 'Target ID', 
		printf("\n Message = %x ", RegRead(SC_FIFO));  //display 'Target ID', 
        
	    RegWrite(SC_Command , SC_CMD_Message_Accepted);
		ExpCmdCmptStat = SC_Function_Complete | SC_Bus_Service;	
	    Cmd_Complete466();
		printf("\n  SC_FIFO_Count =%X ",RegRead(SC_FIFO_Count));
		

	}
//******************************  End Reselection  **************/

		if ( RegRead(SC_Selection_Configuration1) == 0 )// 
		{
		RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;		
		Cmd_Complete466();
        printf("\n FIFO ===			 %x ", RegRead(SC_FIFO));

	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete | SC_Bus_Service;		
		Cmd_Complete466();
        printf("\n FIFO ===			 %x ", RegRead(SC_FIFO));
		}
		else
		{   
			printf("\n DMA command ");
			temp1 = 0x50; // Mail box
			while (RegRead(SC_FIFO_Count) != 0)
			{
			RegWrite (temp1, RegRead(SC_FIFO));
			printf("  SC_FIFO  =====## %X ",RegRead(temp1));
			temp1 = temp1 + 1; // increase MB address

// Don't drain FIFO here.. Copy it , add pads to make 2 bytes boundary, and drain it later..
			}
		RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete | SC_Bus_Service;		
		Cmd_Complete466();
	    RegWrite(SC_Command , 1);  // required to clear FIFO

		}

	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;	
		Cmd_Complete466();
        printf("\n Message = %x ", RegRead(SC_FIFO));
	    RegWrite(SC_Command , SC_CMD_Message_Accepted);
		ExpCmdCmptStat = SC_Function_Complete;	
	    Cmd_Complete466();


	    RegWrite(SC_Command , SC_CMD_Xfer_Information_Non_DMA);
		ExpCmdCmptStat = SC_Function_Complete;	
		Cmd_Complete466();
        printf("\n Message = %x ", RegRead(SC_FIFO));
        RegWrite(SC_Command , SC_CMD_Message_Accepted);
		ExpCmdCmptStat = SC_Function_Complete | SC_SCSI_Disconnect;	
	    Cmd_Complete466();

        printf("\n DISCONECTED ");
//      Fill FIFO from MB and Drain FIFO here ///////////////
		do {
			RegWrite (SC_FIFO, RegRead (temp2));
			temp2 = temp2 +1;
		}
		while (temp2 < temp1);
		
		while (RegRead(SC_FIFO_Count)%2 != 0)
		{
			RegWrite (SC_FIFO, 0); 
		}

	printf("\n  SC_FIFO_Count  after pads %X ",RegRead(SC_FIFO_Count));

	IsaWrite((unsigned short) RAM_ADDR_LO, (unsigned short) (RegRead(SC_FIFO_Count) /2));
	IsaWrite((unsigned short) RAM_ADDR_HI, (unsigned short) 0);
	tempval = IsaRead((unsigned short) EVAL_CONFIG);
	IsaWrite((unsigned short) EVAL_CONFIG, (unsigned short) (tempval | Load_Counter));
	IsaWrite((unsigned short) EVAL_CONFIG, tempval);
    IsaWrite((unsigned short) EVAL_CONFIG, (unsigned short) (tempval & ~Send_Data));
        RegWrite(SC_Command , 0x81);
		ExpCmdCmptStat = SC_Function_Complete;	
	    Cmd_Complete466();
	printf("\n  SC_FIFO_Count  drained %X ",RegRead(SC_FIFO_Count));



} // Initiator_Mode_req_sen

⌨️ 快捷键说明

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