From 818d61794e7a3d4503acc9e922c134dfd1407476 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 22 Jul 2017 22:18:23 +0200 Subject: started to code RTL8139 network driver, for now setting io_base and IRQ --- doc/LINKS.TODO | 1 + src/drivers/net/rtl8139.c | 39 +++++++++++++++++++++++++++++++++++++-- src/drivers/net/rtl8139.h | 9 ++++++++- src/drivers/video/vga.c | 2 ++ 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 ); -- cgit v1.2.3-54-g00ecf