From 76b381c5d30f32c3018a134d96f8a5c3ad677cfa Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 15 Jul 2017 17:38:09 +0200 Subject: added a dummy RTL8139 network driver added register interrupt handler methods to drivers (but I'm pretty unsure about them) setting network in qemu startup and using RTL8139 emulation drivers --- src/Makefile | 14 ++++++++----- src/drivers/driver.c | 9 ++++++++ src/drivers/driver.h | 4 ++++ src/drivers/hdi/ps2/keyboard.c | 1 + src/drivers/hdi/ps2/mouse.c | 1 + src/drivers/net/rtl8139.c | 47 ++++++++++++++++++++++++++++++++++++++++++ src/drivers/net/rtl8139.h | 20 ++++++++++++++++++ src/drivers/video/vga.c | 1 + src/hardware/pci.c | 19 +++++++++++------ 9 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 src/drivers/net/rtl8139.c create mode 100644 src/drivers/net/rtl8139.h (limited to 'src') diff --git a/src/Makefile b/src/Makefile index 3c2849e..75d6948 100644 --- a/src/Makefile +++ b/src/Makefile @@ -35,7 +35,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/ps2/keyboard.o drivers/hdi/ps2/mouse.o drivers/video/vga.o drivers/video/vga_font.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/ps2/keyboard.o drivers/hdi/ps2/mouse.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 $(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,6 +47,7 @@ kernel.elf: kernel/entry.o kernel/kernel.o kernel/kernel_asm.o kernel/console.o drivers/driver.o \ drivers/hdi/ps2/keyboard.o drivers/hdi/ps2/mouse.o \ drivers/video/vga.o drivers/video/vga_font.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 \ gui/desktop.o gui/text_widget.o @@ -105,6 +106,9 @@ drivers/hdi/ps2/mouse.o: drivers/hdi/ps2/mouse.c drivers/hdi/ps2/mouse.h 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/rtl8139.o: drivers/network/rtl8139.c drivers/network/rtl8139.h + $(CC) $(CFLAGS) -c -o drivers/network/rtl8139.o drivers/network/rtl8139.c + libc/string.o: libc/string.c libc/string.h $(CC) $(CFLAGS) -c -o libc/string.o libc/string.c @@ -139,19 +143,19 @@ clean: drivers/*.o drivers/*/*.o drivers/*/*/*.o gui/*.o run-qemu-hd: image.bin - qemu-system-i386 -cpu 486 -net nic,model=ne2k_pci -d guest_errors -m 32 -drive "file=image.bin,if=ide,format=raw" \ + qemu-system-i386 -cpu 486 -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0-d guest_errors -m 32 -drive "file=image.bin,if=ide,format=raw" \ -serial file:serial.log run-qemu-usb: image.bin - qemu-system-i386 -cpu 486 -net nic,model=ne2k_pci -d guest_errors -m 32 -usb -usbdevice disk:/dev/sde \ + qemu-system-i386 -cpu 486 -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0-d guest_errors -m 32 -usb -usbdevice disk:/dev/sde \ -serial file:serial.log run-qemu: image.bin - qemu-system-i386 -cpu 486 -net nic,model=ne2k_pci -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ + qemu-system-i386 -cpu 486 -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0 -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ -serial file:serial.log run-qemu-debug: image.bin - qemu-system-i386 -cpu 486 -net nic,model=ne2k_pci -S -s -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ + qemu-system-i386 -cpu 486 -netdev user,id=net0,net=10.0.0.0/24,host=10.0.0.2,dhcpstart=10.0.0.16 -device rtl8139,netdev=net0 -S -s -d guest_errors -m 32 -drive "file=image.bin,if=floppy,format=raw" \ -serial file:serial.log run-bochs: diff --git a/src/drivers/driver.c b/src/drivers/driver.c index aac2e36..18428dc 100644 --- a/src/drivers/driver.c +++ b/src/drivers/driver.c @@ -5,6 +5,7 @@ #include "stdio.h" static driver_vtable_t const driver_vtable = { + driver_register_interrupt_handler, driver_activate, driver_deactivate, driver_deinit, @@ -18,6 +19,14 @@ void driver_init( driver_t *driver ) driver->vtable = &driver_vtable; } +void driver_register_interrupt_handler( void *obj, interrupt_handler_func_t handler, void *context ) +{ + driver_t *driver = (driver_t *)obj; + + driver->handler = handler; + driver->context = context; +} + void driver_activate( void *obj ) { } diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 0f1a2b4..d538f14 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -4,6 +4,7 @@ #include "interrupts.h" typedef struct { + void (*register_interrupt_handler)( void *obj, interrupt_handler_func_t handler, void *context ); void (*activate)( void *obj ); void (*deactivate)( void *obj ); void (*deinit)( void *obj ); @@ -12,9 +13,12 @@ typedef struct { typedef struct { driver_vtable_t const *vtable; + interrupt_handler_func_t handler; + void *context; } driver_t; void driver_init( driver_t *driver ); +void driver_register_interrupt_handler( void *obj, interrupt_handler_func_t handler, void *context ); void driver_activate( void *obj ); void driver_deactivate( void *obj ); void driver_deinit( void *obj ); diff --git a/src/drivers/hdi/ps2/keyboard.c b/src/drivers/hdi/ps2/keyboard.c index ccae3e7..df4edd7 100644 --- a/src/drivers/hdi/ps2/keyboard.c +++ b/src/drivers/hdi/ps2/keyboard.c @@ -66,6 +66,7 @@ static void read_ack( keyboard_t *keyboard ) static keyboard_vtable_t const keyboard_vtable = { { + driver_register_interrupt_handler, keyboard_activate, keyboard_deactivate, keyboard_deinit, diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c index 1421729..bfda08f 100644 --- a/src/drivers/hdi/ps2/mouse.c +++ b/src/drivers/hdi/ps2/mouse.c @@ -78,6 +78,7 @@ static void set_sample_rate( mouse_t *mouse, uint8_t samples ) static mouse_vtable_t const mouse_vtable = { { + driver_register_interrupt_handler, mouse_activate, mouse_deactivate, mouse_deinit, diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c new file mode 100644 index 0000000..139f228 --- /dev/null +++ b/src/drivers/net/rtl8139.c @@ -0,0 +1,47 @@ +#include "rtl8139.h" + +#include "string.h" +#include "stdio.h" + +#undef DEBUG + +static rtl8139_vtable_t const rtl8139_vtable = { + { + driver_register_interrupt_handler, + rtl8139_activate, + rtl8139_deactivate, + rtl8139_deinit, + rtl8139_print_info + } +}; + +void rtl8139_init( rtl8139_t *rtl8139 ) +{ + memset( rtl8139, 0, sizeof( rtl8139_t ) ); + + ((driver_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable; +} + +void rtl8139_activate( void *obj ) +{ + puts( "Activating driver for Realtek 8139 network card.." ); + + rtl8139_t *rtl8139 = obj; +} + +void rtl8139_deactivate( void *obj ) +{ + puts( "Dectivating driver for Realtek 8139 network card.." ); + + rtl8139_t *rtl8139 = obj; +} + +void rtl8139_deinit( void *obj ) +{ + // nothing to do +} + +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 new file mode 100644 index 0000000..fd3becc --- /dev/null +++ b/src/drivers/net/rtl8139.h @@ -0,0 +1,20 @@ +#ifndef RTL8139_H +#define RTL8139_H + +#include "driver.h" + +typedef struct { + driver_t base; +} rtl8139_t; + +typedef struct { + driver_vtable_t base; +} rtl8139_vtable_t; + +void rtl8139_init( rtl8139_t *rtl8139 ); +void rtl8139_activate( void *obj ); +void rtl8139_deactivate( void *obj ); +void rtl8139_deinit( void *obj ); +void rtl8139_print_info( void *obj ); + +#endif // RTL8139_H diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index fd5bb10..5f9065e 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -11,6 +11,7 @@ static vga_vtable_t const vga_vtable = { { + driver_register_interrupt_handler, vga_activate, vga_deactivate, vga_deinit, diff --git a/src/hardware/pci.c b/src/hardware/pci.c index 6aae01e..6c43448 100644 --- a/src/hardware/pci.c +++ b/src/hardware/pci.c @@ -2,8 +2,10 @@ #include "string.h" #include "stdio.h" +#include "stdlib.h" #include "drivers/video/vga.h" +#include "drivers/net/rtl8139.h" #define NOF_BUSES 8 #define NOF_DEVICES_PER_BUS 32 @@ -99,11 +101,11 @@ void pci_controller_scan_and_register( pci_controller_t *controller, driver_mana if( bar.type == BASE_ADDRESS_REGISTER_TYPE_IO && bar.addr ) { device_descriptor.port_base = (uint32_t)bar.addr; } + } - driver_t *driver = pci_device_get_driver( &device_descriptor, interrupt ); - if( driver ) { - driver_manager_add_driver( driver_manager, driver ); - } + driver_t *driver = pci_device_get_driver( &device_descriptor, interrupt ); + if( driver ) { + driver_manager_add_driver( driver_manager, driver ); } } } @@ -157,11 +159,15 @@ void pci_base_address_register_init( pci_base_address_register_t *base_address_r driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_t *interrupt ) { + driver_t *driver = NULL; + // find a specific device switch( descriptor->vendor_id ) { case 0x10ec: // Realtek Semiconductor switch( descriptor->device_id ) { - case 0x8029: // RTL-8029 + case 0x8139: // RTL8139 + driver = (driver_t *)malloc( sizeof( rtl8139_t ) ); + rtl8139_init( (rtl8139_t *)driver ); break; } break; @@ -190,5 +196,6 @@ driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_ default: // no driver found break; } - return NULL; + + return driver; } -- cgit v1.2.3-54-g00ecf