📄 adviotrc.c
字号:
//123456789012345678901234567890123456789012345678901234567890123456789012
//DEV n, LBAnn, RESET ; nn nn xxH xxH
sprintf( trcDmpBuf,
"DEV %d, LBA28, RESET ",
( ep->dh1 & 0x10 ) ? 1 : 0 );
strcat( trcDmpBuf, esStr );
}
else
if ( ep->flg == TRC_FLAG_ATA )
{
// TRC_TYPE_ADMAI -> DEV n, LBAnn, DR xxH sc lba ; nn nn xxH xxH
// TRC_TYPE_ADMAO -> DEV n, LBAnn, DW xxH sc lba ; nn nn xxH xxH
// TRC_TYPE_AND -> DEV n, LBAnn, ND xxH xxH sc lba ; nn nn xxH xxH
// TRC_TYPE_APDI -> DEV n, LBAnn, PDI xxH xxH sc lba mc ; nn nn xxH xxH
// TRC_TYPE_APDO -> DEV n, LBAnn, PDO xxH xxH sc lba mc ; nn nn xxH xxH
// format the LBAxx/CHS and starting LBA/CHS
if ( ep->lbaSize == 48 )
{
strcpy( atStr, "LBA48," );
sprintf( saStr, " %12ld", ep->lbaLow1 );
}
else
if ( ep->lbaSize == 28 )
{
strcpy( atStr, "LBA28," );
sprintf( saStr, " %12ld", ep->lbaLow1 );
}
else
{
strcpy( atStr, "CHS, " );
sprintf( saStr, " %5u %2u %3u",
ep->cyl,
ep->head,
ep->sect );
}
// format the MC
if ( ( ep->cmd == CMD_READ_MULTIPLE )
|| ( ep->cmd == CMD_READ_MULTIPLE_EXT )
|| ( ep->cmd == CMD_WRITE_MULTIPLE )
|| ( ep->cmd == CMD_WRITE_MULTIPLE_EXT )
)
sprintf( mcStr, " %3d", ep->mc );
else
strcpy( mcStr, " " );
//0 1 2 3 4 5 6 7
//123456789012345678901234567890123456789012345678901234567890123456789012
//DEV n, LBAnn, ttttt xxH xxxxH nnnnn nnnnnnnnn nnn ; nn nn xxH xxH
//DEV n, CHS, ttttt xxH xxxxH nnnnn ccccc hh sss nnn ; nn nn xxH xxH
sprintf( trcDmpBuf,
"DEV %d, %s %s %02XH %4XH %5u",
( ep->dh1 & 0x10 ) ? 1 : 0,
atStr,
chtTypeName[ep->ct],
ep->cmd,
ep->fr1,
ep->ns );
strcat( trcDmpBuf, saStr );
strcat( trcDmpBuf, mcStr );
strcat( trcDmpBuf, esStr );
}
else
if ( ep->flg == TRC_FLAG_ATAPI )
{
// TRC_TYPE_PDMAI -> not used by ATACT
// TRC_TYPE_PDMAO -> not used by ATACT
// TRC_TYPE_PND -> DEV n, PN bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
// TRC_TYPE_PPDI -> DEV n, PR bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
// TRC_TYPE_PPDO -> DEV n, PW bcl cdb0 cdb1 ... cdbn ; nn nn xxH xxH
if ( ep->cdbSize == 12 )
{
//DEV n, t n x x x x x x x x x x x x ; nn nn xxH xxH
sprintf( trcDmpBuf,
"DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d",
( ep->dh1 & 0x10 ) ? 1 : 0,
chtTypeName[ep->ct],
ep->cyl,
ep->cdbBuf[0], ep->cdbBuf[1],
ep->cdbBuf[2], ep->cdbBuf[3],
ep->cdbBuf[4], ep->cdbBuf[5],
ep->cdbBuf[6], ep->cdbBuf[7],
ep->cdbBuf[8], ep->cdbBuf[9],
ep->cdbBuf[10], ep->cdbBuf[11] );
strcat( trcDmpBuf, esStr );
}
else
{
//DEV n, tt n x x x x x x x x x x x x x x x x ; nn nn xxH xxH
sprintf( trcDmpBuf,
"DEV %d, %3.3s %u %02XH %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
( ep->dh1 & 0x10 ) ? 1 : 0,
chtTypeName[ep->ct],
ep->cyl,
ep->cdbBuf[0], ep->cdbBuf[1],
ep->cdbBuf[2], ep->cdbBuf[3],
ep->cdbBuf[4], ep->cdbBuf[5],
ep->cdbBuf[6], ep->cdbBuf[7],
ep->cdbBuf[8], ep->cdbBuf[9],
ep->cdbBuf[10], ep->cdbBuf[11],
ep->cdbBuf[12], ep->cdbBuf[13],
ep->cdbBuf[14], ep->cdbBuf[15] );
strcat( trcDmpBuf, esStr );
}
}
chtDmpNdx ++ ;
if ( chtDmpNdx >= ADP->chtSize )
chtDmpNdx = 0;
return trcDmpBuf;
}
//**********************************************************
// Low Level Trace
//**********************************************************
static struct
{
unsigned char typeId; // trace entry type
unsigned char * typeNm; // trace entry name
} type_nm[]
=
{
//<opr> <--register---> <data - note>
TRC_LLT_INB , "INB " ,
TRC_LLT_OUTB , "OUTB " ,
TRC_LLT_INW , "INW " ,
TRC_LLT_OUTW , "OUTW " ,
TRC_LLT_INSB , "INSB " ,
TRC_LLT_OUTSB , "OUTSB " ,
TRC_LLT_INSW , "INSW " ,
TRC_LLT_OUTSW , "OUTSW " ,
TRC_LLT_INSD , "INSD " ,
TRC_LLT_OUTSD , "OUTSD " ,
TRC_LLT_S_CFG , "===== Start Dev Cnfg ",
TRC_LLT_S_RST , "===== Start Reset ",
TRC_LLT_S_ND , "===== Start ND cmd ",
TRC_LLT_S_PDI , "===== Start PDI cmd ",
TRC_LLT_S_PDO , "===== Start PDO cmd ",
TRC_LLT_S_PI , "===== Start PI cmd ",
TRC_LLT_S_RWD , "===== Start R/W DMA ",
TRC_LLT_S_PID , "===== Start PI DMA ",
TRC_LLT_WINT , "..... Wait for INTRQ ",
TRC_LLT_INTRQ , "..... I N T R Q ",
TRC_LLT_PNBSY , "..... Poll for BSY=0 ",
TRC_LLT_PRDY , "..... Poll for DRDY=1 ",
TRC_LLT_TOUT , "..... T I M E O U T ",
TRC_LLT_ERROR , "..... E R R O R ",
TRC_LLT_DELAY1 , "..... DELAY ~100ms ",
TRC_LLT_DELAY2 , "..... DELAY 0-55ms ",
TRC_LLT_E_CFG , "===== End Dev Cnfg ",
TRC_LLT_E_RST , "===== End Reset ",
TRC_LLT_E_ND , "===== End ND cmd ",
TRC_LLT_E_PDI , "===== End PDI cmd ",
TRC_LLT_E_PDO , "===== End PDO cmd ",
TRC_LLT_E_PI , "===== End PI cmd ",
TRC_LLT_E_RWD , "===== End R/W DMA ",
TRC_LLT_E_PID , "===== End PI DMA ",
TRC_LLT_DEBUG , "..... DEBUG ",
TRC_LLT_P_CMD , "..... ATAPI Cmd Code ",
TRC_LLT_R_BM_CR , "..... Rd BM Cmd Reg ",
TRC_LLT_R_BM_SR , "..... Rd BM Stat Reg ",
TRC_LLT_W_BM_CR , "..... Wr BM Cmd Reg ",
TRC_LLT_W_BM_SR , "..... Wr BM Stat Reg ",
0 , "????? " ,
} ;
static unsigned char * reg_nm[] // register names for trace
=
{
//<opr> <--register---> <data - note>
"Data " , // 0 data reg
"Error/Feature " , // 1 error & feature
"SectorCount " , // 2 sector count
"SectorNumber " , // 3 sector number
"CylinderLow " , // 4 cylinder low
"CylinderHigh " , // 5 cylinder high
"DeviceHead " , // 6 device head
"Status/Cmd " , // 7 primary status & command
"AltStat/DevCtrl " , // 8 alternate status & device control
"DevAddr " , // 9 device address
} ;
//*********************************************************
static int lltDmpLine;
static int lltDmpNdx = 0;
//*********************************************************
// place an entry into the low level trace buffer
void trc_llt( unsigned char addr,
unsigned char data,
unsigned char type )
{
struct LLT far * ep;
if ( ( addr == ADP->lltMre.addr )
&&
( data == ADP->lltMre.data )
&&
( type == ADP->lltMre.type )
)
{
ADP->lltMre.rep = ( ADP->lltMre.rep > 254 ) ?
255 : ADP->lltMre.rep + 1;
return;
}
ep = ADP->lltBuf + ADP->lltCur;
ep->addr = ADP->lltMre.addr;
ep->data = ADP->lltMre.data;
ep->type = ADP->lltMre.type;
ep->rep = ADP->lltMre.rep;
ADP->lltCur ++ ;
if ( ADP->lltCur >= ADP->lltSize )
ADP->lltCur = 0;
ep = ADP->lltBuf + ADP->lltCur;
ep->addr = ADP->lltMre.addr = addr;
ep->data = ADP->lltMre.data = data;
ep->type = ADP->lltMre.type = type;
ep->rep = ADP->lltMre.rep = 0;
}
//**************************************************************
// initialize low level trace buffer
void trc_llt_dump0( void )
{
int ndx;
struct LLT far * ep;
for ( ndx = 0; ndx < ADP->lltSize; ndx ++ )
{
ep = ADP->lltBuf + ndx;
ep->type = TRC_LLT_NONE;
}
ADP->lltCur = 0;
}
//**************************************************************
// start a dump of the low level trace buffer
void trc_llt_dump1( void )
{
trc_llt( 0, 0, TRC_LLT_NONE );
lltDmpLine = 0;
lltDmpNdx = ADP->lltCur + 1;
if ( lltDmpNdx >= ADP->lltSize )
lltDmpNdx = 0;
}
//**************************************************************
// return one line of the low level trace,
// returns NULL at end.
unsigned char * trc_llt_dump2( void )
{
int ndx;
struct LLT far * ep;
if ( lltDmpLine == 1 ) // 1st line is heading
{
//0 1 2 3
//123456789012345678901234567890123456
strcpy( trcDmpBuf, "<opr> <--register---> <data - note>" );
lltDmpLine = 2;
return trcDmpBuf;
}
// search for oldest entry
while ( 1 )
{
if ( lltDmpNdx == ADP->lltCur )
return NULL;
ep = ADP->lltBuf + lltDmpNdx;
if ( ep->type != TRC_LLT_NONE )
break;
lltDmpNdx ++ ;
if ( lltDmpNdx >= ADP->lltSize )
lltDmpNdx = 0;
}
// return one trace table entry...
ndx = 0;
while ( type_nm[ndx].typeId )
{
if ( ep->type == type_nm[ndx].typeId )
break;
ndx ++ ;
}
strcpy( trcDmpBuf, type_nm[ ndx ].typeNm );
if ( ep->type <= TRC_LLT_OUTSD )
{
strcat( trcDmpBuf, reg_nm[ ep->addr ] );
if ( ep->addr == CB_DATA )
strcpy( prtBuf, "-- " );
else
sprintf( prtBuf, "%02X ", ep->data );
strcat( trcDmpBuf, prtBuf );
if ( ( ep->addr == CB_DC )
&& ( ep->type == TRC_LLT_OUTB )
)
{
if ( ep->data & CB_DC_SRST )
{
strcat( trcDmpBuf, "START COMMAND: " );
strcat( trcDmpBuf, trc_get_cmd_name( CMD_SRST ) );
strcat( trcDmpBuf, ", " );
}
strcat( trcDmpBuf, ( ep->data & CB_DC_HOB )
? "HOB=1" : "HOB=0" );
strcat( trcDmpBuf, ( ep->data & CB_DC_NIEN )
? " nIEN=1" : " nIEN=0" );
}
if ( ( ep->addr == CB_CMD )
&& ( ep->type == TRC_LLT_OUTB )
)
{
strcat( trcDmpBuf, "START COMMAND: " );
strcat( trcDmpBuf, trc_get_cmd_name( ep->data ) );
}
if ( ( ep->addr == CB_DH )
&& ( ep->type == TRC_LLT_OUTB )
)
{
strcat( trcDmpBuf, ( ep->data & 0x10 )
? "DEV=1" : "DEV=0" );
strcat( trcDmpBuf, ( ep->data & 0x40 )
? " LBA=1" : " LBA=0" );
}
if ( ( ( ep->addr == CB_STAT )
|| ( ep->addr == CB_ASTAT )
)
&& ( ep->type == TRC_LLT_INB )
)
strcat( trcDmpBuf, trc_get_st_bit_name( ep->data ) );
if ( ( ep->addr == CB_ERR )
&& ( ep->type == TRC_LLT_INB )
)
strcat( trcDmpBuf, trc_get_er_bit_name( ep->data ) );
}
else
if ( ep->type >= TRC_LLT_DEBUG )
{
sprintf( prtBuf, "%02X ", ep->data );
strcat( trcDmpBuf, prtBuf );
}
else
if ( ep->type == TRC_LLT_ERROR )
strcat( trcDmpBuf, trc_get_err_name( ep->data ) );
if ( ep->rep )
{
if ( ep->rep == 255 )
strcpy( prtBuf, "repeated 255 or more times " );
else
sprintf( prtBuf, "repeated %u more times ", ep->rep );
strcat( trcDmpBuf, prtBuf );
}
lltDmpNdx ++ ;
if ( lltDmpNdx >= ADP->lltSize )
lltDmpNdx = 0;
return trcDmpBuf;
}
// end adviotrc.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -