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/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/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/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
|
# Define the compiler and assembler
|
||||||
#CC = i686-elf-gcc -D__is_katauos
|
#CC = i686-elf-gcc -D__is_katauos
|
||||||
@@ -83,7 +83,7 @@ test-cdrom:
|
|||||||
qemu-system-i386 -cdrom boot.iso -m 4096M -d int
|
qemu-system-i386 -cdrom boot.iso -m 4096M -d int
|
||||||
|
|
||||||
cdrom:
|
cdrom:
|
||||||
qemu-system-i386 -cdrom boot.iso -m 32M
|
qemu-system-i386 -cdrom boot.iso -m 32M -device sb16
|
||||||
|
|
||||||
cdrom-debug:
|
cdrom-debug:
|
||||||
qemu-system-i386 -s -S -cdrom boot.iso -m 32M -monitor stdio
|
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
|
bin/apic.o: src/kernel/apic.c
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
|
bin/sb16.o: src/drivers/sb16.c
|
||||||
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf bin/
|
rm -rf bin/
|
||||||
rm -f $(OUTPUT)
|
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/apic.h"
|
||||||
#include "../include/keyboard.h"
|
#include "../include/keyboard.h"
|
||||||
|
|
||||||
|
#include "../include/sb16.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void kmain(unsigned int magic, unsigned int info)
|
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);
|
follow_path("/katau/ksh.", &file, &dir);
|
||||||
|
|
||||||
exec_from_file(&file, &dir);
|
sb16_init();
|
||||||
|
|
||||||
|
//exec_from_file(&file, &dir);
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user