summaryrefslogtreecommitdiff
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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;
}