Exemple #1
0
void ide_write_command( uint8_t val ) {
    ide_clear_interrupt();
    idereg.command = val;
    switch( val ) {
    case IDE_CMD_NOP: /* Effectively an "abort" */
        idereg.state = IDE_STATE_IDLE;
        idereg.status = 0x51;
        idereg.error = 0x04;
        idereg.data_offset = -1;
        ide_raise_interrupt();
        return;
    case IDE_CMD_RESET_DEVICE:
        ide_reset();
        break;
    case IDE_CMD_PACKET:
        ide_start_command_packet_write();
        break;
    case IDE_CMD_SET_FEATURE:
        switch( idereg.feature ) {
        case IDE_FEAT_SET_TRANSFER_MODE:
            switch( idereg.count & 0xF8 ) {
            case IDE_XFER_PIO:
                DEBUG( "Set PIO default mode: %d", idereg.count&0x07 );
                break;
            case IDE_XFER_PIO_FLOW:
                DEBUG( "Set PIO Flow-control mode: %d", idereg.count&0x07 );
                break;
            case IDE_XFER_MULTI_DMA:
                DEBUG( "Set Multiword DMA mode: %d", idereg.count&0x07 );
                break;
            case IDE_XFER_ULTRA_DMA:
                DEBUG( "Set Ultra DMA mode: %d", idereg.count&0x07 );
                break;
            default:
                DEBUG( "Setting unknown transfer mode: %02X", idereg.count );
                break;
            }
            break;
            default:
                DEBUG( "IDE: unimplemented feature: %02X", idereg.feature );
        }
        idereg.status = 0x50;
        idereg.error = 0x00;
        idereg.lba1 = 0x00;
        idereg.lba2 = 0x00;
        ide_raise_interrupt();
        break;
        default:
            DEBUG( "IDE: Unimplemented command: %02X", val );
    }
}
Exemple #2
0
static void ide_detect_devices(UWORD ifnum)
{
    volatile struct IDE *interface = ide_interface + ifnum;
    struct IFINFO *info = ifinfo + ifnum;
    UBYTE status;
    UWORD signature;
    int i;

    MAYBE_UNUSED(interface);

    IDE_WRITE_CONTROL(IDE_CONTROL_nIEN);    /* no interrupts please */

    /* initial check for devices */
    for (i = 0; i < 2; i++) {
        IDE_WRITE_HEAD(IDE_DEVICE(i));
        DELAY_400NS;
        IDE_WRITE_SECTOR_NUMBER_SECTOR_COUNT(0xaa,0x55);
        IDE_WRITE_SECTOR_NUMBER_SECTOR_COUNT(0x55,0xaa);
        IDE_WRITE_SECTOR_NUMBER_SECTOR_COUNT(0xaa,0x55);
        if (IDE_READ_SECTOR_NUMBER_SECTOR_COUNT() == 0xaa55) {
            info->dev[i].type = DEVTYPE_UNKNOWN;
            KDEBUG(("IDE i/f %d device %d detected\n",ifnum,i));
        } else
            info->dev[i].type = DEVTYPE_NONE;
        info->dev[i].options = 0;
        info->dev[i].spi = 0;   /* changed if using READ/WRITE MULTIPLE */
    }

    /* recheck after soft reset, also detect ata/atapi */
    IDE_WRITE_HEAD(IDE_DEVICE(0));
    DELAY_400NS;
    ide_reset(ifnum);

    for (i = 0; i < 2; i++) {
        IDE_WRITE_HEAD(IDE_DEVICE(i));
        DELAY_400NS;
        if (IDE_READ_SECTOR_NUMBER_SECTOR_COUNT() == 0x0101) {
            status = IDE_READ_STATUS();
            signature = IDE_READ_CYLINDER_HIGH_CYLINDER_LOW();
            info->dev[i].type = ide_decode_type(status,signature);
        }
    }

    for (i = 0; i < 2; i++)
        KDEBUG(("IDE i/f %d device %d is type %d\n",ifnum,i,info->dev[i].type));
}
Exemple #3
0
static void ide_init( void )
{
    ide_reset();
}