1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2018-05-25 RT-Thread the first version
9 */
10
11 #include <rtthread.h>
12 #include <rthw.h>
13 #include "drv_pl041.h"
14 #include "drv_ac97.h"
15
ac97_reset(void)16 void ac97_reset(void)
17 {
18 aaci_ac97_write(AC97_RESET, 0xFFFF);
19 }
20
ac97_set_vol(int vol)21 rt_err_t ac97_set_vol(int vol)
22 {
23 rt_uint16_t tmp = vol | (vol << 8);
24
25 if (vol < 0 || vol > 0x3f)
26 {
27 return -RT_ERROR;
28 }
29
30 aaci_ac97_write(AC97_MASTER, tmp);
31 aaci_ac97_write(AC97_HEADPHONE, tmp);
32 aaci_ac97_write(AC97_MASTER_MONO, tmp);
33 aaci_ac97_write(AC97_PCM, tmp);
34
35 return RT_EOK;
36 }
37
ac97_get_vol(void)38 int ac97_get_vol(void)
39 {
40 rt_uint16_t v;
41
42 v = aaci_ac97_read(AC97_MASTER);
43 if (v == (~0x0))
44 {
45 v = 0;
46 }
47 return 0x3F & v;
48 }
49
ac97_set_rate(int rate)50 rt_err_t ac97_set_rate(int rate)
51 {
52 if (rate < 0)
53 {
54 return -RT_ERROR;
55 }
56 aaci_ac97_write(AC97_PCM_FRONT_DAC_RATE, rate);
57 return 0;
58 }
59
ac97_get_rate(void)60 int ac97_get_rate(void)
61 {
62 rt_uint16_t v;
63
64 v = aaci_ac97_read(AC97_PCM_FRONT_DAC_RATE);
65 if (v == (~0x0))
66 {
67 v = 0;
68 }
69 return v;
70 }
71
72 #if 0
73 #define AC97_DUMP(_v) rt_kprintf("%32s:addr:0x%08x data:0x%08x\n", #_v, (_v), (aaci_ac97_read(_v)))
74 int _ac97_reg_dump(int argc, char **argv)
75 {
76 AC97_DUMP(AC97_RESET);
77 AC97_DUMP(AC97_MASTER);
78 AC97_DUMP(AC97_HEADPHONE);
79 AC97_DUMP(AC97_MASTER_MONO);
80 AC97_DUMP(AC97_MASTER_TONE);
81 AC97_DUMP(AC97_PC_BEEP);
82 AC97_DUMP(AC97_PHONE);
83 AC97_DUMP(AC97_MIC);
84 AC97_DUMP(AC97_LINE);
85 AC97_DUMP(AC97_CD);
86 AC97_DUMP(AC97_VIDEO);
87 AC97_DUMP(AC97_AUX);
88 AC97_DUMP(AC97_PCM);
89 AC97_DUMP(AC97_REC_SEL);
90 AC97_DUMP(AC97_REC_GAIN);
91 AC97_DUMP(AC97_REC_GAIN_MIC);
92 AC97_DUMP(AC97_GENERAL_PURPOSE);
93 AC97_DUMP(AC97_3D_CONTROL);
94 AC97_DUMP(AC97_INT_PAGING);
95 AC97_DUMP(AC97_POWERDOWN);
96 AC97_DUMP(AC97_PCM_FRONT_DAC_RATE);
97 AC97_DUMP(AC97_PCM_SURR_DAC_RATE);
98 AC97_DUMP(AC97_PCM_LFE_DAC_RATE);
99 AC97_DUMP(AC97_PCM_LR_ADC_RATE);
100 AC97_DUMP(AC97_PCM_MIC_ADC_RATE);
101 AC97_DUMP(AC97_DAC_SLOT_MAP);
102 AC97_DUMP(AC97_ADC_SLOT_MAP);
103 return 0;
104 }
105 MSH_CMD_EXPORT_ALIAS(_ac97_reg_dump, ac97_dump, ac97 dump reg);
106
107 #endif
108