From 3e9f594c7e06017b5d919d79530c39a58de8a3c7 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 20 Jul 2017 21:36:31 +0200 Subject: started to abstract video drivers --- src/Makefile | 8 ++++++-- src/drivers/driver.h | 2 +- src/drivers/net/network.c | 7 ++++--- src/drivers/video/vga.c | 2 +- src/drivers/video/video.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/drivers/video/video.h | 20 ++++++++++++++++++++ src/kernel/kernel.c | 2 +- 7 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 src/drivers/video/video.c create mode 100644 src/drivers/video/video.h diff --git a/src/Makefile b/src/Makefile index 9ee5ba7..0f26944 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/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 +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/video.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 \ @@ -47,9 +47,10 @@ kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o hardware/pci.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/video.o \ drivers/video/vga.o drivers/video/vga_font.o \ + drivers/net/network.o \ drivers/net/rtl8139.o \ libc/string.o libc/stdlib.o libc/stdio.o libc/setjmp.o \ gui/widget.o gui/composite_widget.o gui/window.o \ @@ -112,6 +113,9 @@ drivers/hdi/ps2/ps2keyboard.o: drivers/hdi/ps2/ps2keyboard.c drivers/hdi/ps2/ps2 drivers/hdi/ps2/ps2mouse.o: drivers/hdi/ps2/ps2mouse.c drivers/hdi/ps2/ps2mouse.h $(CC) $(CFLAGS) -c -o drivers/hdi/ps2/ps2mouse.o drivers/hdi/ps2/ps2mouse.c +drivers/video/video.o: drivers/video/video.c drivers/video/video.h + $(CC) $(CFLAGS) -c -o drivers/video/video.o drivers/video/video.c + drivers/video/vga.o: drivers/video/vga.c drivers/video/vga.h $(CC) $(CFLAGS) -c -o drivers/video/vga.o drivers/video/vga.c diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 4d5689e..f39103d 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -13,7 +13,7 @@ typedef struct { typedef enum { DRIVER_TYPE_KEYBOARD, DRIVER_TYPE_MOUSE, - DRIVER_TYPE_GRAPHICS, + DRIVER_TYPE_VIDEO, DRIVER_TYPE_NETWORK } driver_type_t; diff --git a/src/drivers/net/network.c b/src/drivers/net/network.c index c60148f..2de245b 100644 --- a/src/drivers/net/network.c +++ b/src/drivers/net/network.c @@ -25,19 +25,20 @@ void network_init( network_t *network, interrupt_t *interrupt, void *context ) void network_activate( void *obj ) { - kernel_panic( "Activating generic netowrk driver should not be called directly." ); + kernel_panic( "Activating generic network driver should not be called directly." ); } void network_deactivate( void *obj ) { - kernel_panic( "Deactivating generic netowrk driver should not be called directly." ); + kernel_panic( "Deactivating generic network driver should not be called directly." ); } void network_deinit( void *obj ) { - kernel_panic( "Printing info of generic network driver should not be called directly." ); + // nothing to be done } void network_print_info( void *obj ) { + kernel_panic( "Printing info of generic network driver should not be called directly." ); } diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index b6a07a8..094a117 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -22,7 +22,7 @@ void vga_init( vga_t *vga, interrupt_t *interrupt, void *context ) { memset( vga, 0, sizeof( vga_t ) ); - driver_init( (driver_t *)vga, DRIVER_TYPE_GRAPHICS, interrupt, context ); + driver_init( (driver_t *)vga, DRIVER_TYPE_VIDEO, interrupt, context ); port8_init( &vga->misc_port, 0x3C2 ); port8_init( &vga->crtc_index_port, 0x3D4 ); diff --git a/src/drivers/video/video.c b/src/drivers/video/video.c new file mode 100644 index 0000000..eb12272 --- /dev/null +++ b/src/drivers/video/video.c @@ -0,0 +1,44 @@ +#include "video.h" + +#include "string.h" +#include "kernel.h" + +#undef DEBUG + +static video_vtable_t const video_vtable = { + { + video_activate, + video_deactivate, + video_deinit, + video_print_info + } +}; + +void video_init( video_t *video, interrupt_t *interrupt, void *context ) +{ + memset( video, 0, sizeof( video_t ) ); + + driver_init( (driver_t *)video, DRIVER_TYPE_VIDEO, interrupt, context ); + + ((driver_t *)video)->vtable = (driver_vtable_t *)&video_vtable; +} + +void video_activate( void *obj ) +{ + kernel_panic( "Activating generic video driver should not be called directly." ); +} + +void video_deactivate( void *obj ) +{ + kernel_panic( "Deactivating generic video driver should not be called directly." ); +} + +void video_deinit( void *obj ) +{ + // nothing to be done +} + +void video_print_info( void *obj ) +{ + kernel_panic( "Printing info of generic video driver should not be called directly." ); +} diff --git a/src/drivers/video/video.h b/src/drivers/video/video.h new file mode 100644 index 0000000..713aa4f --- /dev/null +++ b/src/drivers/video/video.h @@ -0,0 +1,20 @@ +#ifndef VIDEO_H +#define VIDEO_H + +#include "driver.h" + +typedef struct { + driver_t base; +} video_t; + +typedef struct { + driver_vtable_t base; +} video_vtable_t; + +void video_init( video_t *video, interrupt_t *interrupt, void *context ); +void video_activate( void *obj ); +void video_deactivate( void *obj ); +void video_deinit( void *obj ); +void video_print_info( void *obj ); + +#endif // VIDEO_H diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 91d9988..4f68f18 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -148,7 +148,7 @@ void kernel_main( void ) // TODO: merge with the text mode vga_text_t object // TODO: introduce a graphics driver type, don't cast diretly here // TODO: also, what to do if there is more than one driver? - global_context.vga = (vga_t *)driver_manager_find_driver( &global_context.driver_manager, DRIVER_TYPE_GRAPHICS ); + global_context.vga = (vga_t *)driver_manager_find_driver( &global_context.driver_manager, DRIVER_TYPE_VIDEO ); puts( "Activating drivers" ); driver_manager_activate_all( &global_context.driver_manager ); -- cgit v1.2.3-54-g00ecf