summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-26 23:58:14 +0200
committerMiguel <m.i@gmx.at>2018-09-26 23:58:14 +0200
commitb86f48da7fc46934d576698bb4f16be9b2a7eaf9 (patch)
treeea42a72faeb406c303025b0c981a76e533a8b110 /driver
parent915791f6acedbb35db73216156c1baa790e384d9 (diff)
some bugfixes
Diffstat (limited to 'driver')
-rw-r--r--driver/e1000.c15
-rw-r--r--driver/e1000.h1
-rw-r--r--driver/keyboard.c12
-rw-r--r--driver/mouse.c19
-rw-r--r--driver/timer.c10
5 files changed, 49 insertions, 8 deletions
diff --git a/driver/e1000.c b/driver/e1000.c
index 2f50df4..5d0cbe6 100644
--- a/driver/e1000.c
+++ b/driver/e1000.c
@@ -3,11 +3,12 @@
//https://github.com/torvalds/linux/blob/master/drivers/net/ethernet/intel/e1000/e1000_hw.c
//https://github.com/qemu/qemu/blob/master/hw/net/e1000.c
//registers etc. verified from pdf at https://pdos.csail.mit.edu/6.828/2006/readings/hardware/8254x_GBe_SDM.pdf
+#include "e1000.h"
+#include "interrupts.h"
#include <stdint.h>
#include "log.h"
-#include "e1000.h"
#include "kmalloc.h"
#include "netdev.h"
#include "arp.h"
@@ -427,8 +428,8 @@ void e1000_handleReceive()
old_cur = rx_cur;
rx_cur = (rx_cur + 1) % E1000_NUM_RX_DESC;
writeCommand(REG_RDT, old_cur );
- klog("RDT %d",readCommand(REG_RDT));
- klog("RDH %d",readCommand(REG_RDH));
+// klog("RDT %d",readCommand(REG_RDT));
+// klog("RDH %d",readCommand(REG_RDH));
}
}
@@ -443,8 +444,8 @@ int e1000_sendPacket(const void * p_data, uint16_t p_len)
uint8_t old_cur = tx_cur;
tx_cur = (tx_cur + 1) % E1000_NUM_TX_DESC;
writeCommand(REG_TDT, tx_cur);
- klog("TDT %d",readCommand(REG_TDT));
- klog("TDH %d",readCommand(REG_TDH));
+// klog("TDT %d",readCommand(REG_TDT));
+// klog("TDH %d",readCommand(REG_TDH));
while(!(tx_descs[old_cur]->status & 0xff)); // TODO: seriously wait here!?!?!?
return 0;
}
@@ -512,6 +513,7 @@ struct netdev e1000_init(uint32_t base)
for(int i = 0; i < 0x80; i++)writeCommand(REG_MTA + i*4, 0);
//e1000_linkup();
+ interrupt_register(INTERRUPT_E1000,&e1000_interrupt);
enableInterrupt();
@@ -523,7 +525,7 @@ struct netdev e1000_init(uint32_t base)
return dev;
}
-void e1000_irq (int irq)
+uint32_t e1000_interrupt (uint32_t esp)
{
// if ( p_interruptContext->getInteruptNumber() == pciConfigHeader->getIntLine()+IRQ0)
// {
@@ -555,4 +557,5 @@ void e1000_irq (int irq)
*/
if(status & 0x80)e1000_handleReceive();
//...
+ return esp;
}
diff --git a/driver/e1000.h b/driver/e1000.h
index 27a052e..7eee572 100644
--- a/driver/e1000.h
+++ b/driver/e1000.h
@@ -5,3 +5,4 @@ int e1000_sendPacket(const void * p_data, uint16_t p_len);
void e1000_irq (int irq);
void e1000_linkup();
void e1000_linkdown();
+uint32_t e1000_interrupt (uint32_t esp);
diff --git a/driver/keyboard.c b/driver/keyboard.c
index b9a1dad..f667396 100644
--- a/driver/keyboard.c
+++ b/driver/keyboard.c
@@ -4,11 +4,14 @@
#include "log.h"
#include "e1000.h"
#include "kmalloc.h"
+#include "interrupts.h"
#include <stdbool.h>
#include "inet.h"
+ringbuffer kb_in;
+
static bool ctrl_l=false;
static bool shift_l=false;
static bool shift_r=false;
@@ -31,8 +34,17 @@ static void put(uint8_t c)
syscall_generic(SYSCALL_WRITE,kb_stream, (char *)&c , 1, 0);
}
+uint32_t keyboard_interrupt(uint32_t esp)
+{
+
+ ringbuffer_put(&kb_in,x86_inb(0x60));
+ return esp;
+}
+
void keyboard_init(uint32_t s)
{
+ kb_in=ringbuffer_init(1);// 4096 bytes ringbuffer;
+ interrupt_register(INTERRUPT_KEYBOARD,&keyboard_interrupt);
kb_stream=s;
}
diff --git a/driver/mouse.c b/driver/mouse.c
index 7ec5e68..cebafed 100644
--- a/driver/mouse.c
+++ b/driver/mouse.c
@@ -1,6 +1,9 @@
+#include "mouse.h"
+
+#include "ringbuffer.h"
+#include "interrupts.h"
#include "kernel/kernel.h"
#include "log.h"
-#include "mouse.h"
#include "driver/vesa.h"
//http://forum.osdev.org/viewtopic.php?t=10247
@@ -17,6 +20,8 @@ volatile int16_t mouse_x;
volatile int16_t mouse_y;
static volatile uint8_t mouse_a;
+static ringbuffer mouse_in;
+
uint8_t mouse_read();
void mouse_wait(uint8_t a_type) //unsigned char
@@ -67,8 +72,20 @@ int8_t mouse_get_y()
return mouse_y;
}
+uint32_t mouse_interrupt(uint32_t esp)
+{
+ uint8_t b=x86_inb(0x60);
+ ringbuffer_put(&mouse_in,b);
+ //klog("%d",b);
+ return esp;
+}
+
void mouse_init()
{
+
+ interrupt_register(INTERRUPT_MOUSE,&mouse_interrupt);
+ mouse_in=ringbuffer_init(1);// 4096 bytes ringbuffer;
+
mouse_x=mouse_y=0;
mouse_cycle=0;
diff --git a/driver/timer.c b/driver/timer.c
index 30a30c6..4b8f050 100644
--- a/driver/timer.c
+++ b/driver/timer.c
@@ -1,6 +1,7 @@
+#include "timer.h"
+#include "interrupts.h"
#include "kernel.h"
#include "log.h"
-#include "timer.h"
#include "asm_x86.h"
#include "asm_pit.h"
@@ -148,6 +149,11 @@ static uint64_t get_rtc_time()
return epoch_seconds;
}
+uint32_t timer_interrupt(uint32_t esp)
+{
+ asm_pit_tick();
+ return esp;
+}
// PIT
uint64_t timer_init()
@@ -156,7 +162,9 @@ uint64_t timer_init()
task_system_clock_start=epoch_time*25; // since pit ticks 25times a second
asm_pit_rate_40ms(); //tick at 25hz
fixme("pit rate does only seem to work occasionally.. 1/25 seconds???" );
+ interrupt_register(INTERRUPT_PIT_TIMER,&timer_interrupt);
return epoch_time;
+
}
uint64_t timer_get_ms()