Initial revision
[reactos.git] / reactos / drivers / dd / sound / dsp.c
1 /************************************
2 * unsigned char read_dsp(void)
3 *
4 * Reads the DSP chip
5 * Arguments: none
6 * Returns: Byte read
7 ************************************/
8 unsigned char read_dsp(unsigned short base)
9 {
10 while((inb(base+0x0e)&0x80)==0); //Wait until there is something to read
11 return inb(base+0x0a);
12 }
13
14 /************************************'
15 * sb_status detect_dsp(void);
16 *
17 * Detects if a SB16 is installed
18 * Arguments: None
19 * Returns: Success or failure
20 ************************************/
21 sb_status detect_dsp(SB16* sb16)
22 {
23 for(base=0x200;base<0x280;base+=0x10) //Tries to reset all DSP addresses there is
24 if(reset_dsp(base)==SB_TRUE)
25 {
26 sb16->base=base;
27 return SB_TRUE;
28 }
29 return SB_FALSE;
30 }
31
32 /**************************************
33 * sb_status reset_dsp(unsigned short base_address);
34 *
35 * Tries to reset a DSP chip
36 * Arguments: base address
37 * Returns: Success of failure
38 **************************************/
39 sb_status reset_dsp(unsigned short base_address)
40 {
41 int delay;
42
43 outb(base_address+DSP_RESET_PORT,1);
44 for(delay=0;delay<0xffff;delay++);
45
46 outb(base_address+DSP_RESET_PORT,0);
47 for(delay=0;delay<0xffff;delay++);
48
49 if((inb(base_address+DSP_READ_STATUS_PORT)&0x80)==0) return SB_FALSE;
50
51 if(inb(base_address+DSP_READ_DATA_PORT)!=0xAA) return SB_FALSE;
52
53 return SB_TRUE;
54 }
55
56 void write_dsp(unsigned short base,unsigned char data)
57 {
58 while ((inb(base+DSP_WRITE_PORT) & 0x80) != 0);
59 outb(base+DSP_WRITE_PORT, data);
60 }
61