Example #1
0
static int devfd_transfer(bool is_read, uint8_t is_raw)
{
    int ct = 0;
    int tries;
    int blocks = udata.u_nblock;
    uint16_t lba = udata.u_block;

    // kprintf("[%s %d @ %x : %d:%x]\n", is_read ? "read" : "write",
    //     blocks, lba, is_raw, udata.u_dptr);
    // if (!is_read)
    //     return blocks << BLKSHIFT;

    if (is_raw && d_blkoff(BLKSHIFT))
        return -1;

    fd_select(0);
    fd765_is_user = is_raw;
    fd765_buffer = udata.u_dptr;

    while (blocks != 0)
    {
        for (tries = 0; tries < 3; tries ++)
        {
            nudge_timer();
            if (tries != 0)
                fd_recalibrate();
            fd_seek(lba);

            fd765_sectors = 10 - fd765_sector;
            if (fd765_sectors > blocks)
                fd765_sectors = blocks;

            if (is_read)
                fd765_do_read();
            else
                fd765_do_write();

            /* Did it work ? */
            if ((fd765_status[0] & 0xc0) == 0)
                break;
        }
        if (tries == 3)
        {
            kprintf("fd%d: I/O error %d:%d\n", is_read, lba);
            udata.u_error = EIO;
            break;
        }
        lba += fd765_sectors;
        blocks -= fd765_sectors;
        ct += fd765_sectors;
    }

    return ct << BLKSHIFT;
}
Example #2
0
int main(){ 
        printf("Start\n"); 
        char *d; 
        struct floppy_raw_cmd *cmd; 
         
        int fd; 
        fd = open("/dev/fd0",O_RDWR | O_NDELAY); 
        fd_recalibrate(fd); 
        close(fd); 
        printf("End\n"); 
        return 0; 
}
Example #3
0
/* Set up the controller for a given block, seek, and wait for spinup. */
static void fd_seek(uint16_t lba)
{
    uint8_t track2 = lba / 9;
    uint8_t newtrack = track2 >> 1;

    fd765_sector = (lba % 9) + 1;
    fd765_head = track2 & 1;

    if (newtrack != fd765_track)
    {
        for (;;)
        {
            fd765_track = newtrack;
            nudge_timer();
            fd765_do_seek();
            if ((fd765_status[0] & 0xf8) == 0x20)
                break;

            fd_recalibrate();
        }
    }
}