summaryrefslogtreecommitdiff
path: root/kernel/floppy.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/floppy.c')
-rw-r--r--kernel/floppy.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/kernel/floppy.c b/kernel/floppy.c
index bbe88df..5f34c56 100644
--- a/kernel/floppy.c
+++ b/kernel/floppy.c
@@ -32,7 +32,7 @@ void flpydsk_wait_irq ();
void flpydsk_check_int (uint32_t* st0, uint32_t* cyl);
static volatile int _CurrentDrive=0;
-static volatile uint8_t _FloppyDiskIRQ = 0;
+static volatile uint8_t _FloppyDiskIRQ;
// temporary dma hack
//! initialize DMA to use phys addr 1k-64k
@@ -173,13 +173,13 @@ void flpydsk_motor_on()
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"starting motor...");
//x86_outb (FLPYDSK_DOR, FLPYDSK_DOR_MASK_DRIVE0_MOTOR | FLPYDSK_DOR_MASK_RESET);
x86_outb (FLPYDSK_DOR, 0x1c);
- sleep(50);
+ sleep(10); // wait ~ 1/3 second
}
+
void flpydsk_motor_off()
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"stopping motor...");
x86_outb (FLPYDSK_DOR, 0x0c);
- //x86_outb (FLPYDSK_DOR,FLPYDSK_DOR_MASK_RESET);
}
int flpydsk_calibrate (uint32_t drive) {
@@ -310,17 +310,24 @@ void flpydsk_reset()
void int_floppy()
{
-
_FloppyDiskIRQ=1;
-
}
void flpydsk_wait_irq()
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"waiting for irq6");
- sleep(25);
- while ( _FloppyDiskIRQ == 0);
+
+ while (1)
+ {
+ sleep(2);
+ x86_int_disable();
+ if(_FloppyDiskIRQ==1)break;
+ x86_int_enable();
+
+ }
_FloppyDiskIRQ = 0;
+ x86_int_enable();
+
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"irq6 received");
}
@@ -536,17 +543,22 @@ void floppy_init()
_CurrentDrive=0;
_FloppyDiskIRQ = 0;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"driver init");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"driver init (wathchdog: 0x%08X)",&_FloppyDiskIRQ);
flpydsk_reset ();
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test read (sector: 0)");
- flpydsk_read_sector(64);
+ char *dma=0x0500;
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test reading");
+
+ flpydsk_read_sector(65);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"finished reading");
- char *dma=0x0500;
+ flpydsk_reset ();
+ flpydsk_read_sector(64);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"finished reading");
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test read: %s",dma);
flpydsk_reset ();