summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-22 22:18:23 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-22 22:18:23 +0200
commit818d61794e7a3d4503acc9e922c134dfd1407476 (patch)
treecc94b6ff8bf73eb090530b4b1cf11d4323034d93
parent70d880905c37cfde7f4ddfe46c5cab582dd36ab7 (diff)
downloadabaos-818d61794e7a3d4503acc9e922c134dfd1407476.tar.gz
abaos-818d61794e7a3d4503acc9e922c134dfd1407476.tar.bz2
started to code RTL8139 network driver, for now setting io_base and IRQ
-rw-r--r--doc/LINKS.TODO1
-rw-r--r--src/drivers/net/rtl8139.c39
-rw-r--r--src/drivers/net/rtl8139.h9
-rw-r--r--src/drivers/video/vga.c2
4 files changed, 48 insertions, 3 deletions
diff --git a/doc/LINKS.TODO b/doc/LINKS.TODO
index 3fe1944..557e598 100644
--- a/doc/LINKS.TODO
+++ b/doc/LINKS.TODO
@@ -112,3 +112,4 @@ http://wiki.osdev.org/Detecting_Memory_(x86)
Networking:
http://wiki.osdev.org/RTL8139
+http://lowlevel.eu/wiki/RTL8139
diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c
index 4ae61e3..f895ff8 100644
--- a/src/drivers/net/rtl8139.c
+++ b/src/drivers/net/rtl8139.c
@@ -3,7 +3,16 @@
#include "string.h"
#include "stdio.h"
-#undef DEBUG
+#define DEBUG
+
+/*
+Offset (from IO base) Size Name
+0x08 8 MAR0-7
+0x30 4 RBSTART
+0x37 1 CMD
+0x3C 2 IMR
+0x3E 2 ISR
+*/
static rtl8139_vtable_t const rtl8139_vtable = {
{
@@ -14,12 +23,27 @@ static rtl8139_vtable_t const rtl8139_vtable = {
}
};
-void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context )
+#define REG_MAC0 0
+#define REG_MAC4 4
+
+void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context )
{
memset( rtl8139, 0, sizeof( rtl8139_t ) );
network_init( (network_t *)rtl8139, interrupt, context );
+ puts( "Initializing driver for Realtek 8139 network card.." );
+#ifdef DEBUG
+ printf( "using I/O base 0x%X\n", descriptor->port_base );
+ printf( "using interrupt %d\n", descriptor->interrupt );
+#endif
+
+ port32_init( &rtl8139->MAC0_port, descriptor->port_base + REG_MAC0 );
+ port16_init( &rtl8139->MAC4_port, descriptor->port_base + REG_MAC4 );
+
+ interrupt_handler_init( &rtl8139->interrupt_handler, IRQ_BASE + descriptor->interrupt, interrupt, rtl8139_handle_interrupt, rtl8139 );
+ interrupts_register_interrupt_handler( rtl8139->interrupt_handler );
+
((driver_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable;
}
@@ -42,6 +66,17 @@ void rtl8139_deinit( void *obj )
// nothing to do
}
+uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
+{
+ rtl8139_t *rtl8139 = (rtl8139_t *)handler->driver;
+
+#ifdef DEBUG
+ printf( "RTL INTERRUPT\n" );
+#endif
+
+ return esp;
+}
+
void rtl8139_print_info( void *obj )
{
puts( "Realtek 8139 network card driver" );
diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h
index a255d65..ce59cb1 100644
--- a/src/drivers/net/rtl8139.h
+++ b/src/drivers/net/rtl8139.h
@@ -2,19 +2,26 @@
#define RTL8139_H
#include "network.h"
+#include "pci.h"
+#include "port.h"
typedef struct {
network_t base;
+ port32_t MAC0_port;
+ port16_t MAC4_port;
+ interrupt_handler_t interrupt_handler;
} rtl8139_t;
typedef struct {
network_vtable_t base;
} rtl8139_vtable_t;
-void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context );
+void rtl8139_init( rtl8139_t *rtl8139, pci_device_descriptor_t *descriptor, interrupt_t *interrupt, void *context );
void rtl8139_activate( void *obj );
void rtl8139_deactivate( void *obj );
void rtl8139_deinit( void *obj );
void rtl8139_print_info( void *obj );
+uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp );
+
#endif // RTL8139_H
diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c
index 456e539..670df02 100644
--- a/src/drivers/video/vga.c
+++ b/src/drivers/video/vga.c
@@ -101,6 +101,8 @@ static vga_mode_t modes[] = {
void vga_init( vga_t *vga, interrupt_t *interrupt, void *context )
{
memset( vga, 0, sizeof( vga_t ) );
+
+ puts( "Initializing driver for generic VGA video card.." );
video_init( (video_t *)vga, interrupt, context );