diff --git a/Makefile b/Makefile index f50e6c4..2c25358 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ OBJS = bin/boot.o bin/kernel.o bin/idt.o bin/isr.o bin/screen.o \ bin/keyboard.o bin/paging.o bin/page_alloc.o bin/page_tables.o \ bin/fat.o bin/task.o bin/switch.o bin/sys_exit.o bin/gdt.o bin/isr-asm.o \ bin/kheap.o bin/liballoc.o bin/exec_from_file.o bin/syscalls.o bin/atapi.o \ - bin/lib9660.o bin/vfs.o bin/apic.o + bin/lib9660.o bin/vfs.o bin/apic.o bin/sb16.o # Define the compiler and assembler #CC = i686-elf-gcc -D__is_katauos @@ -83,7 +83,7 @@ test-cdrom: qemu-system-i386 -cdrom boot.iso -m 4096M -d int cdrom: - qemu-system-i386 -cdrom boot.iso -m 32M + qemu-system-i386 -cdrom boot.iso -m 32M -device sb16 cdrom-debug: qemu-system-i386 -s -S -cdrom boot.iso -m 32M -monitor stdio @@ -193,6 +193,9 @@ bin/vfs.o: src/fs/vfs.c bin/apic.o: src/kernel/apic.c $(CC) $(CFLAGS) -c $< -o $@ +bin/sb16.o: src/drivers/sb16.c + $(CC) $(CFLAGS) -c $< -o $@ + clean: rm -rf bin/ rm -f $(OUTPUT) diff --git a/include/sb16.h b/include/sb16.h new file mode 100644 index 0000000..a6778a4 --- /dev/null +++ b/include/sb16.h @@ -0,0 +1,10 @@ +#ifndef SB16_H +#define SB16_H + +int sb16_dsp_reset(); +int sb16_get_irq(); +void* sb16_allocate_buf(); +void sb16_get_version(int* major, int* minor); +void sb16_init(); + +#endif \ No newline at end of file diff --git a/src/drivers/sb16.c b/src/drivers/sb16.c new file mode 100644 index 0000000..57368da --- /dev/null +++ b/src/drivers/sb16.c @@ -0,0 +1,83 @@ +#include "../include/utils.h" +#include "../include/paging.h" +#include "../include/liballoc.h" + +#define DSP_RESET 0x226 +#define DSP_READ 0x22A +#define DSP_WRITE 0x22C +#define MIXER 0x224 +#define MIXER_DATA 0x225 + +int sb16_dsp_reset() +{ + outb(DSP_RESET, 1); + + //dirty hack to wait 3 microseconds + for(int i = 0; i < 3*100; i++) + { + inb(0x1FC); + } + + outb(DSP_RESET, 0); + + return inb(DSP_READ); +} + +int sb16_get_irq() +{ + outb(MIXER, 0x80); + + int irq_code = inb(MIXER_DATA); + int irq = 0; + + switch(irq_code) + { + case 0x01: + irq = 2; + break; + case 0x02: + irq = 5; + break; + case 0x04: + irq = 7; + break; + case 0x08: + irq = 10; + break; + } + + return irq; +} + +void* sb16_allocate_buf() +{ + const size_t size = 64*1024;//64 KB + + void* buffer = malloc(size); + + return get_physaddr(buffer); +} + +void sb16_get_version(int* major, int* minor) +{ + outb(DSP_WRITE, 0xE1);//0xE1 is get version + + *major = inb(DSP_READ); + *minor = inb(DSP_READ); +} + +void sb16_init() +{ + int status = sb16_dsp_reset(); + printf("sb16 status: 0x%X\n", status); + int sb16_irq = sb16_get_irq(); + printf("sb16 irq: 0x%X\n", sb16_irq); + void* sb16_buffer = sb16_allocate_buf(); + printf("sb16 buffer: 0x%X\n", sb16_buffer); + + int major, minor = 0; + sb16_get_version(&major, &minor); + printf("sb16 version: %X.%X\n", major, minor); + + outb(DSP_WRITE, 0xD1);//enable speaker +} \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index cd845c5..2b92a59 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -18,6 +18,8 @@ #include "../include/apic.h" #include "../include/keyboard.h" +#include "../include/sb16.h" + #include void kmain(unsigned int magic, unsigned int info) @@ -139,7 +141,9 @@ void kmain(unsigned int magic, unsigned int info) follow_path("/katau/ksh.", &file, &dir); - exec_from_file(&file, &dir); + sb16_init(); + + //exec_from_file(&file, &dir); while(1) {