summaryrefslogtreecommitdiff
path: root/kernel/floppy.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-09-04 00:46:44 +0200
committerMichal Idziorek <m.i@gmx.at>2014-09-04 00:46:44 +0200
commit29758cec073a963e985d209cf3820c1efc730cef (patch)
treebef1933528a13a7772375f5c74f6628b29e6b756 /kernel/floppy.c
parente7648669694806b366824c0dc0c8b80c8d167d35 (diff)
Fixed "floppy" driver (for emulators)
Diffstat (limited to 'kernel/floppy.c')
-rw-r--r--kernel/floppy.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/kernel/floppy.c b/kernel/floppy.c
index 50bd8d0..bbe88df 100644
--- a/kernel/floppy.c
+++ b/kernel/floppy.c
@@ -31,29 +31,32 @@ void flpydsk_send_command (uint8_t cmd);
void flpydsk_wait_irq ();
void flpydsk_check_int (uint32_t* st0, uint32_t* cyl);
-static volatile int _CurrentDrive;
-static volatile uint8_t _FloppyDiskIRQ;
+static volatile int _CurrentDrive=0;
+static volatile uint8_t _FloppyDiskIRQ = 0;
// temporary dma hack
//! initialize DMA to use phys addr 1k-64k
void flpydsk_initialize_dma () {
x86_outb (0x0a,0x06); //mask dma channel 2
+
x86_outb (0xd8,0xff); //reset master flip-flop
//changed to 0x000 (Address)
- x86_outb (0x04, 0x0); //low
- x86_outb (0x04, 0xb0); //high
+ x86_outb (0x04, 0x00); //low
+ x86_outb (0x04, 0x05); //high
+ x86_outb (0x81,0x00); //page reg
x86_outb (0xd8, 0xff); //reset master flip-flop
// x86_outb (0x05, 0xff); //count to 0x23ff (number of bytes in a 3.5" floppy disk track)
// x86_outb (0x05, 0x23);
// hey, lets do just ONE sector instead (0x200)
- x86_outb (0x05, 0xff);
- x86_outb (0x05, 0x01);
+ x86_outb (0x05, 0xff); //low
+ x86_outb (0x05, 0x01); //high
x86_outb (0x80, 0); //external page register = 0
+
x86_outb (0x0a, 0x02); //unmask dma channel 2
log("dma",FOOLOS_LOG_INFO,"initialized");
}
@@ -61,7 +64,9 @@ void flpydsk_initialize_dma () {
//! prepare the DMA for read transfer
void flpydsk_dma_read () {
x86_outb (0x0a, 0x06); //mask dma channel 2
+
x86_outb (0x0b, 0x56); //single transfer, address increment, autoinit, read, channel 2
+
x86_outb (0x0a, 0x02); //unmask dma channel 2
log("dma",FOOLOS_LOG_INFO,"configured for reading");
}
@@ -168,7 +173,7 @@ 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(20);
+ sleep(50);
}
void flpydsk_motor_off()
{
@@ -313,6 +318,7 @@ void int_floppy()
void flpydsk_wait_irq()
{
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"waiting for irq6");
+ sleep(25);
while ( _FloppyDiskIRQ == 0);
_FloppyDiskIRQ = 0;
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"irq6 received");
@@ -416,8 +422,8 @@ void flpydsk_read_sector_imp (uint8_t head, uint8_t track, uint8_t sector) {
int flpydsk_seek ( uint32_t cyl, uint32_t head )
{
- cyl=1;
- head=1;
+ //cyl=1;
+ //head=1;
uint32_t st0, cyl0;
@@ -532,20 +538,19 @@ void floppy_init()
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"driver init");
+
flpydsk_reset ();
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test read (sector: 0)");
- flpydsk_read_sector(0);
+ flpydsk_read_sector(64);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"finished reading");
- uint16_t *dma=0xb000;
-
- int i;
- for(i=0;i<10;i++)
- {
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"test read 0x%04x ",dma[i]);
- }
-
+ char *dma=0x0500;
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test read: %s",dma);
+
+ flpydsk_reset ();
+
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"test write (sector: 100)");
flpydsk_write_sector(100);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"finished writing");