summaryrefslogtreecommitdiff
path: root/kernel
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
parente7648669694806b366824c0dc0c8b80c8d167d35 (diff)
Fixed "floppy" driver (for emulators)
Diffstat (limited to 'kernel')
-rw-r--r--kernel/floppy.c41
-rw-r--r--kernel/kernel.c7
2 files changed, 27 insertions, 21 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");
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
//