sb16: start adding sb16 driver

This commit is contained in:
2026-05-09 14:51:54 +03:00
parent ab2da499da
commit 59b775457d
4 changed files with 103 additions and 3 deletions
+5 -2
View File
@@ -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)
+10
View File
@@ -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
+83
View File
@@ -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
}
+5 -1
View File
@@ -18,6 +18,8 @@
#include "../include/apic.h"
#include "../include/keyboard.h"
#include "../include/sb16.h"
#include <stdint.h>
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)
{