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
+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)
{