diff options
| -rw-r--r-- | bochsrc | 2 | ||||
| -rw-r--r-- | kernel/floppy.c | 41 | ||||
| -rw-r--r-- | kernel/kernel.c | 7 |
3 files changed, 28 insertions, 22 deletions
@@ -131,7 +131,7 @@ romimage: file=/home/miguel/opt/bochs-2.6.6/bios/BIOS-bochs-latest # 2.2.6 2.1Ghz Athlon XP with Linux 2.6/g++ 3.4 12 to 15 Mips # 2.0.1 1.6Ghz Intel P4 with Win2000/g++ 3.3 5 to 7 Mips #======================================================================= -cpu: count=1, ips=10000000 #, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def" +cpu: count=2, ips=10000000 #, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def" #======================================================================= # CPUID: 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 // |
