diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-09-04 00:46:44 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-09-04 00:46:44 +0200 |
| commit | 29758cec073a963e985d209cf3820c1efc730cef (patch) | |
| tree | bef1933528a13a7772375f5c74f6628b29e6b756 /kernel/floppy.c | |
| parent | e7648669694806b366824c0dc0c8b80c8d167d35 (diff) | |
Fixed "floppy" driver (for emulators)
Diffstat (limited to 'kernel/floppy.c')
| -rw-r--r-- | kernel/floppy.c | 41 |
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"); |
