Skip to content

Commit eae11f5

Browse files
The sb16 audio driver has been added for OpenKernel. (There are some bugs.)
1 parent 1ca4689 commit eae11f5

2 files changed

Lines changed: 113 additions & 0 deletions

File tree

Drivers/Sound/sb16/sb16.c

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#include "sb16.h"
2+
#include <OpenKernel/SystemLib/SystemIO/io.h>
3+
4+
static sb16_t sb16;
5+
#define BUFFER_SIZE 8000
6+
uint8_t audio_buffer[BUFFER_SIZE];
7+
8+
void sb16_write_dsp(uint8_t value) {
9+
sb16_wait_ready();
10+
outb(DSP_WRITE, value);
11+
}
12+
13+
uint8_t sb16_read_dsp() {
14+
return inb(DSP_READ);
15+
}
16+
17+
int sb16_wait_ready() {
18+
int timeout = 100000;
19+
while (inb(DSP_STATUS) & 0x80) {
20+
if (--timeout <= 0) {
21+
return -1;
22+
}
23+
}
24+
return 0;
25+
}
26+
27+
int sb16_reset() {
28+
outb(DSP_RESET, 1);
29+
for (volatile int i = 0; i < 10000; i++);
30+
outb(DSP_RESET, 0);
31+
for (int i = 0; i < 100000; i++) {
32+
if (inb(DSP_READ) == 0xAA) {
33+
return 0;
34+
}
35+
}
36+
return -1;
37+
}
38+
39+
void sb16_set_sample_rate(uint32_t hz) {
40+
sb16_wait_ready();
41+
sb16_write_dsp(0x40);
42+
sb16_write_dsp((hz >> 8) & 0xFF);
43+
sb16_write_dsp(hz & 0xFF);
44+
sb16.sample_rate = hz;
45+
}
46+
47+
void sb16_play_buffer(uint8_t *data, uint32_t size) {
48+
sb16_write_dsp(0x14);
49+
uint32_t length = size - 1;
50+
sb16_write_dsp(length & 0xFF);
51+
sb16_write_dsp((length >> 8) & 0xFF);
52+
53+
for (uint32_t i = 0; i < size; i++) {
54+
sb16_wait_ready();
55+
outb(DSP_WRITE, data[i]);
56+
}
57+
}
58+
59+
void sb16_stop() {
60+
sb16_write_dsp(0xD0);
61+
}
62+
63+
void sb16_init() {
64+
sb16.initialized = 0;
65+
if (sb16_reset() != 0) {
66+
return;
67+
}
68+
sb16_set_sample_rate(44100);
69+
sb16.initialized = 1;
70+
}
71+
72+
void sb16_gen_flat_sound(uint8_t level) {
73+
for (int i = 0; i < BUFFER_SIZE; i++) {
74+
audio_buffer[i] = level;
75+
}
76+
}
77+
78+
void sb16_test() {
79+
sb16_gen_flat_sound(200);
80+
sb16_play_buffer(audio_buffer, BUFFER_SIZE);
81+
}

Drivers/Sound/sb16/sb16.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef SB16_H
2+
#define SB16_H
3+
4+
#include <OpenKernel/SystemLib/Std/types.h>
5+
6+
#define SB16_BASE 0x220
7+
8+
#define DSP_RESET (SB16_BASE + 0x6)
9+
#define DSP_READ (SB16_BASE + 0xA)
10+
#define DSP_WRITE (SB16_BASE + 0xC)
11+
#define DSP_STATUS (SB16_BASE + 0xE)
12+
13+
typedef struct {
14+
uint32_t sample_rate;
15+
uint8_t initialized;
16+
} sb16_t;
17+
18+
extern uint8_t audio_buffer[8000];
19+
20+
void sb16_init();
21+
int sb16_reset();
22+
void sb16_set_sample_rate(uint32_t hz);
23+
void sb16_play_buffer(uint8_t *data, uint32_t size);
24+
void sb16_stop();
25+
26+
void sb16_write_dsp(uint8_t value);
27+
uint8_t sb16_read_dsp();
28+
int sb16_wait_ready();
29+
void sb16_gen_flat_sound(uint8_t level);
30+
void sb16_test();
31+
32+
#endif

0 commit comments

Comments
 (0)