📄 example1.c
字号:
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 + -