From 29758cec073a963e985d209cf3820c1efc730cef Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Thu, 4 Sep 2014 00:46:44 +0200 Subject: Fixed "floppy" driver (for emulators) --- kernel/floppy.c | 41 +++++++++++++++++++++++------------------ kernel/kernel.c | 7 ++++--- 2 files changed, 27 insertions(+), 21 deletions(-) (limited to 'kernel') 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"); diff --git a/kernel/kernel.c b/kernel/kernel.c index 85c3da1..a6322f0 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -139,7 +139,6 @@ void kernel_main(uint32_t initial_stack, int mp) // now we can enable interrupts back again x86_int_enable(); - // // Memory Init // @@ -160,7 +159,7 @@ void kernel_main(uint32_t initial_stack, int mp) panic(FOOLOS_MODULE_NAME,"ACPI and MP search failed! I do not want to continue!"); // Start the other Processors (also before paging !) - // smp_start_aps(&procdata); + smp_start_aps(&procdata); ///////////////////// @@ -177,7 +176,8 @@ void kernel_main(uint32_t initial_stack, int mp) // Its driver will be hopefully implemented one day ;) // - //pci_init(); + pci_init(); + // // Initialize Floppy Disk @@ -195,6 +195,7 @@ void kernel_main(uint32_t initial_stack, int mp) shell_init(); + // // Initialize Multitasking // -- cgit v1.2.3