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

📄 example1.c

📁 ATADRVR是DOS下的磁盘驱动程序,采用PIO传输 ,PCI DMA传输,ATA包,等非常全面代码示例... 内部有C与Asm描述. 编译环境:Borland C/C++ 4.52 与 Bo
💻 C
📖 第 1 页 / 共 2 页
字号:
   reg_buffer_size = BUFFER_SIZE;

   // set the ATADRVR command timeout (in seconds)
   tmr_time_out = 20;

   //---------- ATADRVR initialization

   // 1) must tell the driver what the I/O port addresses.
   //    note that the driver also supports all the PCMCIA
   //    PC Card modes (I/O and memory).
   pio_set_iobase_addr( cmdBase, ctrlBase, bmcrBase );
   printf( "Using I/O base addresses %04X and %04X.\n", cmdBase, ctrlBase );

   // 2) find out what devices are present -- this is the step
   // many driver writers ignore.  You really can't just do
   // resets and commands without first knowing what is out there.
   // Even if you don't care the driver does care.
   numDev = reg_config();
   printf( "Found %d devices, dev 0 is %s, dev 1 is %s.\n",
                  numDev,
                  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 ATA Identify command in LBA28 mode
   ClearTrace();
   printf( "ATA Identify, LBA28, polling...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_IDENTIFY_DEVICE,
               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] );
      pause();
   }

   // do a seek command in LBA28 mode to LBA=5025
   ClearTrace();
   printf( "Seek, LBA28, polling...\n" );
   rc = reg_non_data_lba28( dev, CMD_SEEK, 0, 0, 5025L );
   if ( rc )
      ShowAll();
   else
      pause();

   // do an ATA Read Sectors command in LBA28 mode
   // lets read 3 sectors starting at LBA=5
   ClearTrace();
   printf( "ATA Read Sectors, LBA28, polling...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_READ_SECTORS,
               0, 3,
               5L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               3L, 0
               );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

#if INCL_LBA48

   // do an ATA Read Sectors command in LBA48 mode
   // lets read 3 sectors starting at LBA=5
   ClearTrace();
   printf( "ATA Read Sectors, LBA48, polling...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba48(
               dev, CMD_READ_SECTORS_EXT,
               0, 3,
               0L, 5L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               3L, 0
               );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

#endif

   //---------- 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 ATA Identify command in LBA28 mode
   ClearTrace();
   printf( "ATA Identify, LBA28, interrupt...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_IDENTIFY_DEVICE,
               0, 0,
               0L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               1L, 0
               );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

   // do a seek command in LBA28 mode to LBA=5025
   ClearTrace();
   printf( "Seek, LBA28, interrupt...\n" );
   rc = reg_non_data_lba28( dev, CMD_SEEK, 0, 0, 5025L );
   if ( rc )
      ShowAll();
   else
      pause();

   // do an ATA Read Sectors command in LBA28 mode
   // lets read 3 sectors starting at LBA=5
   ClearTrace();
   printf( "ATA Read Sectors, LBA28, interrupt...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba28(
               dev, CMD_READ_SECTORS,
               0, 3,
               5L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               3L, 0
               );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

#if INCL_LBA48

   // do an ATA Read Sectors command in LBA48 mode
   // lets read 3 sectors starting at LBA=5
   ClearTrace();
   printf( "ATA Read Sectors, LBA48, interrupt...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = reg_pio_data_in_lba48(
               dev, CMD_READ_SECTORS_EXT,
               0, 3,
               0L, 5L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               3L, 0
               );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

#endif

#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 ATA Read DMA command in LBA28 mode
   // lets read 3 sectors starting at LBA=5
   ClearTrace();
   printf( "ATA Read DMA, LBA28, interrupt...\n" );
   memset( buffer, 0, sizeof( buffer ) );
   rc = dma_pci_lba28(
               dev, CMD_READ_DMA,
               0, 3,
               5L,
               FP_SEG( bufferPtr ), FP_OFF( bufferPtr ),
               3L );
   if ( rc )
      ShowAll();
   else
   {
      // 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] );
      pause();
   }

#endif

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

   return 0;
}

// end example1.c

⌨️ 快捷键说明

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