sb16: start adding sb16 driver
This commit is contained in:
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user