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