📄 initiator_mode_sen.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 + -