From 949836a663eb652702fee79fd44b9c3f6863f920 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 20 Jul 2017 10:24:27 +0200 Subject: added a virtual network driver interface, made the dummy RTL8139 driver a specialization of it (nothing is functional there yet) --- src/Makefile | 10 +++++++--- src/drivers/driver.c | 6 ++++-- src/drivers/net/network.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/drivers/net/network.h | 20 ++++++++++++++++++++ src/drivers/net/rtl8139.c | 2 +- src/drivers/net/rtl8139.h | 6 +++--- 6 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/drivers/net/network.c create mode 100644 src/drivers/net/network.h (limited to 'src') diff --git a/src/Makefile b/src/Makefile index 1696e6c..9ee5ba7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -36,7 +36,7 @@ kernel.bin: kernel.elf kernel.sym: kernel.elf $(OBJCOPY) --only-keep-debug kernel.elf kernel.sym -kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o kernel/memorymanagement.o kernel/tasks.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/mouse.o drivers/hdi/keyboard.o drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2mouse.o drivers/video/vga.o drivers/video/vga_font.o drivers/net/rtl8139.o gui/widget.o gui/composite_widget.o gui/window.o gui/desktop.o gui/text_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o +kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o kernel/vgatext.o kernel/serial.o kernel/memorymanagement.o kernel/tasks.o hardware/port.o hardware/port_asm.o hardware/interrupts.o hardware/interrupts_asm.o hardware/pci.o drivers/driver.o drivers/hdi/mouse.o drivers/hdi/keyboard.o drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2mouse.o drivers/video/vga.o drivers/video/vga_font.o drivers/net/network.o drivers/net/rtl8139.o gui/widget.o gui/composite_widget.o gui/window.o gui/desktop.o gui/text_widget.o libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o $(LD) -o kernel.elf -N -n -Ttext 0x8800 -e kernel_entry --oformat elf32-i386 \ kernel/entry.o \ kernel/kernel.o kernel/kernel_asm.o \ @@ -45,8 +45,9 @@ kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o hardware/port.o hardware/port_asm.o \ hardware/interrupts.o hardware/interrupts_asm.o \ hardware/pci.o \ - drivers/driver.o drivers/hdi/mouse.o \ - drivers/hdi/keyboard.o \ + drivers/driver.o \ + drivers/hdi/mouse.o drivers/hdi/keyboard.o \ + drivers/net/network.o \ drivers/hdi/ps2/ps2keyboard.o drivers/hdi/ps2/ps2mouse.o \ drivers/video/vga.o drivers/video/vga_font.o \ drivers/net/rtl8139.o \ @@ -114,6 +115,9 @@ drivers/hdi/ps2/ps2mouse.o: drivers/hdi/ps2/ps2mouse.c drivers/hdi/ps2/ps2mouse. drivers/video/vga.o: drivers/video/vga.c drivers/video/vga.h $(CC) $(CFLAGS) -c -o drivers/video/vga.o drivers/video/vga.c +drivers/network/network.o: drivers/network/network.c drivers/network/network.h + $(CC) $(CFLAGS) -c -o drivers/network/network.o drivers/network/network.c + drivers/network/rtl8139.o: drivers/network/rtl8139.c drivers/network/rtl8139.h $(CC) $(CFLAGS) -c -o drivers/network/rtl8139.o drivers/network/rtl8139.c diff --git a/src/drivers/driver.c b/src/drivers/driver.c index 829262e..0bd8059 100644 --- a/src/drivers/driver.c +++ b/src/drivers/driver.c @@ -2,7 +2,6 @@ #include "kernel.h" #include "string.h" -#include "stdio.h" #include "stdlib.h" static driver_vtable_t const driver_vtable = { @@ -25,19 +24,22 @@ void driver_init( driver_t *driver, driver_type_t type, interrupt_t *interrupt, void driver_activate( void *obj ) { + kernel_panic( "Activating a generic driver should not be called directly." ); } void driver_deactivate( void *obj ) { + kernel_panic( "Deactivating a generic driver should not be called directly." ); } void driver_deinit( void *obj ) { + // nothing to be done } void driver_print_info( void *obj ) { - puts( "Unknown driver" ); + kernel_panic( "Printing info of a generic driver should not be called directly." ); } void driver_manager_init( driver_manager_t *manager ) diff --git a/src/drivers/net/network.c b/src/drivers/net/network.c new file mode 100644 index 0000000..c60148f --- /dev/null +++ b/src/drivers/net/network.c @@ -0,0 +1,43 @@ +#include "network.h" + +#include "string.h" +#include "kernel.h" + +#undef DEBUG + +static network_vtable_t const network_vtable = { + { + network_activate, + network_deactivate, + network_deinit, + network_print_info + } +}; + +void network_init( network_t *network, interrupt_t *interrupt, void *context ) +{ + memset( network, 0, sizeof( network_t ) ); + + driver_init( (driver_t *)network, DRIVER_TYPE_NETWORK, interrupt, context ); + + ((driver_t *)network)->vtable = (driver_vtable_t *)&network_vtable; +} + +void network_activate( void *obj ) +{ + kernel_panic( "Activating generic netowrk driver should not be called directly." ); +} + +void network_deactivate( void *obj ) +{ + kernel_panic( "Deactivating generic netowrk driver should not be called directly." ); +} + +void network_deinit( void *obj ) +{ + kernel_panic( "Printing info of generic network driver should not be called directly." ); +} + +void network_print_info( void *obj ) +{ +} diff --git a/src/drivers/net/network.h b/src/drivers/net/network.h new file mode 100644 index 0000000..524bb05 --- /dev/null +++ b/src/drivers/net/network.h @@ -0,0 +1,20 @@ +#ifndef NETWORK_H +#define NETWORK_H + +#include "driver.h" + +typedef struct { + driver_t base; +} network_t; + +typedef struct { + driver_vtable_t base; +} network_vtable_t; + +void network_init( network_t *network, interrupt_t *interrupt, void *context ); +void network_activate( void *obj ); +void network_deactivate( void *obj ); +void network_deinit( void *obj ); +void network_print_info( void *obj ); + +#endif // NETWORK_H diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index a325823..4ae61e3 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -18,7 +18,7 @@ void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context ) { memset( rtl8139, 0, sizeof( rtl8139_t ) ); - driver_init( (driver_t *)rtl8139, DRIVER_TYPE_NETWORK, interrupt, context ); + network_init( (network_t *)rtl8139, interrupt, context ); ((driver_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable; } diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h index 1bb899c..a255d65 100644 --- a/src/drivers/net/rtl8139.h +++ b/src/drivers/net/rtl8139.h @@ -1,14 +1,14 @@ #ifndef RTL8139_H #define RTL8139_H -#include "driver.h" +#include "network.h" typedef struct { - driver_t base; + network_t base; } rtl8139_t; typedef struct { - driver_vtable_t base; + network_vtable_t base; } rtl8139_vtable_t; void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context ); -- cgit v1.2.3-54-g00ecf