diff options
| author | Miguel <m.i@gmx.at> | 2018-09-26 23:58:14 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-26 23:58:14 +0200 |
| commit | b86f48da7fc46934d576698bb4f16be9b2a7eaf9 (patch) | |
| tree | ea42a72faeb406c303025b0c981a76e533a8b110 /driver | |
| parent | 915791f6acedbb35db73216156c1baa790e384d9 (diff) | |
some bugfixes
Diffstat (limited to 'driver')
| -rw-r--r-- | driver/e1000.c | 15 | ||||
| -rw-r--r-- | driver/e1000.h | 1 | ||||
| -rw-r--r-- | driver/keyboard.c | 12 | ||||
| -rw-r--r-- | driver/mouse.c | 19 | ||||
| -rw-r--r-- | driver/timer.c | 10 |
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() |
