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

📄 adviotrc.c

📁 pc机上经由pci连接的ata和atapi设备驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
      //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 + -