summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-15 17:38:09 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-15 17:38:09 +0200
commit76b381c5d30f32c3018a134d96f8a5c3ad677cfa (patch)
treebc151c2f2a8e07e0b08f4827ff24202088c20c0b
parent5631e68852081bb4e4eaa6e3bb3a53a4d024dff2 (diff)
downloadabaos-76b381c5d30f32c3018a134d96f8a5c3ad677cfa.tar.gz
abaos-76b381c5d30f32c3018a134d96f8a5c3ad677cfa.tar.bz2
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
-rw-r--r--src/Makefile14
-rw-r--r--src/drivers/driver.c9
-rw-r--r--src/drivers/driver.h4
-rw-r--r--src/drivers/hdi/ps2/keyboard.c1
-rw-r--r--src/drivers/hdi/ps2/mouse.c1
-rw-r--r--src/drivers/net/rtl8139.c47
-rw-r--r--src/drivers/net/rtl8139.h20
-rw-r--r--src/drivers/video/vga.c1
-rw-r--r--src/hardware/pci.c19
9 files changed, 105 insertions, 11 deletions
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;
}