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; }
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; }
/* 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(); } } }