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

📄 example2.c

📁 C++实现的atapi源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                  devTypeStr[ reg_config_info[0] ],
                  devTypeStr[ reg_config_info[1] ] );
   if ( numDev < 1 )
      ShowAll();
   pause();

   //---------- Try some commands in "polling" mode

   printf( "Polling mode...\n" );

   // do an ATA soft reset (SRST) and return the command block
   // regs for device 0 in struct reg_cmd_info
   ClearTrace();
   printf( "Soft Reset...\n" );
   rc = reg_reset( 0, dev );
   if ( rc )
      ShowAll();

   // do an ATAPI Identify command in LBA mode
   ClearTrace();
   printf( "ATAPI Identify, polling...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_IDENTIFY_DEVICE_PACKET,
               0, 0,
               0L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               1L, 0 );
   if ( rc )
      ShowAll();
   else
   {
      // you get to add the code here to display all the ID data
      // display the first 16 bytes read
      printf( "   data read %02X%02X%02X%02X %02X%02X%02X%02X "
                           "%02X%02X%02X%02X %02X%02X%02X%02X\n",
               buffer[ 0], buffer[ 1], buffer[ 2], buffer[ 3],
               buffer[ 4], buffer[ 5], buffer[ 6], buffer[ 7],
               buffer[ 8], buffer[ 9], buffer[10], buffer[11],
               buffer[12], buffer[13], buffer[14], buffer[15] );
   }

   // do three ATAPI Request Sense command and display some of the data
   ClearTrace();
   for ( ndx = 0; ndx < 3; ndx ++ )
   {
      printf( "ATAPI Request Sense, polling...\n" );
      memset( cdb, 0, sizeof( cdb ) );
      cdb[0] = 0x03;    // RS command code
      cdb[4] = 32;      // allocation length
      memset( buffer, 0, sizeof( buffer ) );
      rc = reg_packet(
                       dev,
                       12, FP_SEG( cdbPtr ), FP_OFF( cdbPtr ),
                       0,
                       4096, FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
                       0L    // lba for tracing
                     );
      if ( rc )
         ShowAll();
      else
      {
         // here I'll give you some help -- lets look at the RS data
         // first a problem with ATAPI device: how much data was
         // really transferred?  You can never really be sure...
         if ( reg_cmd_info.totalBytesXfer != ( 8U + buffer[7] ) )
            printf( "Number of bytes transferred (%ld) does not match \n"
                    "8 + byte 7 in the RS data received (%u) ! \n",
                    reg_cmd_info.totalBytesXfer,
                    8U + buffer[7] );
         // display some of the RS data
         printf( "Error code=%02X, Sense Key=%02X, ASC=%02X, ASCQ=%02X\n",
                 buffer[0], buffer[2] & 0x0f, buffer[12], buffer[13] );
      }
      pause();
   }

   // do an ATAPI Read TOC command and display the TOC data
   ClearTrace();
   printf( "ATAPI CD-ROM Read TOC, polling...\n" );
   memset( cdb, 0, sizeof( cdb ) );
   cdb[0] = 0x43;    // command code
   cdb[1] = 0x02;    // MSF flag
   cdb[7] = 0x10;    // allocation length
   cdb[8] = 0x00;    //    of 4096
   cdb[9] = 0x80;    // TOC format
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_packet(
                    dev,
                    12, FP_SEG( cdbPtr ), FP_OFF( cdbPtr ),
                    0,
                    4096, FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
                    0L    // lba for tracing
                  );
   if ( rc )
      ShowAll();
   else
   {
      // and here too I'll give you some help looking at the TOC data
      // again, check the number of bytes transferred (notice
      // how every SCSI like command is different here)
      if ( reg_cmd_info.totalBytesXfer
           !=
           ( 2U + ( buffer[0] * 256U ) + buffer[1] )
         )
         printf( "Number of bytes transferred (%ld) does not match \n"
                 "2 + bytes 0-1 in the TOC data received (%u) ! \n",
                 reg_cmd_info.totalBytesXfer,
                 2U + ( buffer[0] * 256U ) + buffer[1] );
      // display the TOC data
      printf( "First Session=%02X, Last Session=%02X\n",
               buffer[2], buffer[3] );
      printf( "TOC entries (11 bytes each)... \n" );
      rc = ( ( buffer[0] * 256U ) + buffer[1] - 2U ) / 11;
      ndx = 4;
      while ( rc > 0 )
      {
         printf( "   %02X %02X %02X "
                    "%02X %02x %02X "
                    "%02X %02X %02X "
                    "%02X %02x \n",
                     buffer[ndx+0], buffer[ndx+1], buffer[ndx+2],
                     buffer[ndx+3], buffer[ndx+4], buffer[ndx+5],
                     buffer[ndx+6], buffer[ndx+7], buffer[ndx+8],
                     buffer[ndx+9], buffer[ndx+10], buffer[ndx+11]
               );
         rc -- ;
         ndx = ndx + 11;
      }
      pause();
   }

   //---------- Switch to "interrupt" mode (required for PCI DMA)

   // First, you must enable the appropriate irq
   // HOWEVER, if call this function you MUST make
   // sure your program does not terminate without
   // calling int_disable() !!!

   printf( "Using IRQ %d in not shared mode...\n", irqNum );
   rc = int_enable_irq( 0, irqNum, bmcrBase + 2, cmdBase + 7 );
   if ( rc )
   {
      printf( "Unable to set interrupt mode using IRQ %d !\n", irqNum );
      return 1;
   }

   //---------- Try some commands in "interrupt" mode

   // do an ATAPI Identify command in LBA mode
   ClearTrace();
   printf( "ATAPI Identify, interrupt...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_IDENTIFY_DEVICE_PACKET,
               0, 0,
               0L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               1L, 0 );
   if ( rc )
      ShowAll();
   else
   {
      // you get to add the code here to display all the ID data
      // display the first 16 bytes read
      printf( "   data read %02X%02X%02X%02X %02X%02X%02X%02X "
                           "%02X%02X%02X%02X %02X%02X%02X%02X\n",
               buffer[ 0], buffer[ 1], buffer[ 2], buffer[ 3],
               buffer[ 4], buffer[ 5], buffer[ 6], buffer[ 7],
               buffer[ 8], buffer[ 9], buffer[10], buffer[11],
               buffer[12], buffer[13], buffer[14], buffer[15] );
   }

   //---------- Try some commands in "interrupt" mode

   // do an ATAPI Read TOC command and display the TOC data
   ClearTrace();
   printf( "ATAPI CD-ROM Read TOC, interrupt... \n" );
   memset( cdb, 0, sizeof( cdb ) );
   cdb[0] = 0x43;    // command code
   cdb[1] = 0x02;    // MSF flag
   cdb[7] = 0x10;    // allocation length
   cdb[8] = 0x00;    //    of 4096
   cdb[9] = 0x80;    // TOC format
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_packet(
                    dev,
                    12, FP_SEG( cdbPtr ), FP_OFF( cdbPtr ),
                    0,
                    4096, FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
                    0L    // lba for tracing
                  );
   if ( rc )
      ShowAll();
   else
   {
      // and here too I'll give you some help looking at the TOC data
      // again, check the number of bytes transferred (notice
      // how every SCSI like command is different here)
      if ( reg_cmd_info.totalBytesXfer
           !=
           ( 2U + ( buffer[0] * 256U ) + buffer[1] )
         )
         printf( "Number of bytes transferred (%ld) does not match \n"
                 "2 + bytes 0-1 in the TOC data received (%u) ! \n",
                 reg_cmd_info.totalBytesXfer,
                 2U + ( buffer[0] * 256U ) + buffer[1] );
      // display the TOC data
      printf( "First Session=%02X, Last Session=%02X\n",
               buffer[2], buffer[3] );
      printf( "TOC entries (11 bytes each)... \n" );
      rc = ( ( buffer[0] * 256U ) + buffer[1] - 2U ) / 11;
      ndx = 4;
      while ( rc > 0 )
      {
         printf( "   %02X %02X %02X "
                    "%02X %02x %02X "
                    "%02X %02X %02X "
                    "%02X %02x \n",
                     buffer[ndx+0], buffer[ndx+1], buffer[ndx+2],
                     buffer[ndx+3], buffer[ndx+4], buffer[ndx+5],
                     buffer[ndx+6], buffer[ndx+7], buffer[ndx+8],
                     buffer[ndx+9], buffer[ndx+10], buffer[ndx+11]
               );
         rc -- ;
         ndx = ndx + 11;
      }
      pause();
   }

#if INCL_PCI_DMA

   // Now do PCI DMA with interrupts.

   // first, tell the driver where the BMCR is located.

   rc = dma_pci_config( bmcrBase );
   if ( rc )
   {
      printf( "ERROR !  Call to dma_pci_config() failed,\n" );
      printf( "         dma_pci_config() returned %d!\n", rc );
      return 1;
   }

   reg_incompat_flags |= REG_INCOMPAT_DMA_POLL;

   // do an ATAPI Read TOC command and display the TOC data
   // but do it in DMA mode
   ClearTrace();
   printf( "ATAPI CD-ROM Read TOC in DMA, interrupt...\n" );
   memset( cdb, 0, sizeof( cdb ) );
   cdb[0] = 0x43;    // command code
   cdb[1] = 0x02;    // MSF flag
   cdb[7] = 0x10;    // allocation length
   cdb[8] = 0x00;    //    of 4096
   cdb[9] = 0x80;    // TOC format
   memset( buffer, 0, sizeof( buffer ) );
   rc = dma_pci_packet(
                        dev,
                        12, FP_SEG( cdbPtr ), FP_OFF( cdbPtr ),
                        0,
                        4096, FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
                        0L    // lba for tracing
                      );
   if ( rc )
      ShowAll();
   else
   {
      // and here too I'll give you some help looking at the TOC data
      // again, check the number of bytes transferred (notice
      // how every SCSI like command is different here?
      if ( reg_cmd_info.totalBytesXfer
           !=
           ( 2U + ( buffer[0] * 256U ) + buffer[1] )
         )
         printf( "Number of bytes transferred (%ld) does not match \n"
                 "2 + bytes 0-1 in the TOC data received (%u) ! \n",
                 reg_cmd_info.totalBytesXfer,
                 2U + ( buffer[0] * 256U ) + buffer[1] );
      // display the TOC data
      printf( "First Session=%02X, Last Session=%02X\n",
               buffer[2], buffer[3] );
      printf( "TOC entries (11 bytes each)... \n" );
      rc = ( ( buffer[0] * 256U ) + buffer[1] - 2U ) / 11;
      ndx = 4;
      while ( rc > 0 )
      {
         printf( "   %02X %02X %02X "
                    "%02X %02x %02X "
                    "%02X %02X %02X "
                    "%02X %02x \n",
                     buffer[ndx+0], buffer[ndx+1], buffer[ndx+2],
                     buffer[ndx+3], buffer[ndx+4], buffer[ndx+5],
                     buffer[ndx+6], buffer[ndx+7], buffer[ndx+8],
                     buffer[ndx+9], buffer[ndx+10], buffer[ndx+11]
               );
         rc -- ;
         ndx = ndx + 11;
      }
      pause();
   }

#endif

   // disable intrq -- you MUST do this if you
   // called int_enable_irq() !!!
   printf( "Interrupt off...\n" );
   int_disable_irq();

   return 0;
}

// end example2.c

⌨️ 快捷键说明

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