sb16: start adding sb16 driver
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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