Skip to content

Commit 61d294a

Browse files
committed
codec : es8316 dapm
1 parent 1332381 commit 61d294a

File tree

19 files changed

+268
-53
lines changed

19 files changed

+268
-53
lines changed

debug/codec/I2S_INT.png

-91.9 KB
Binary file not shown.

debug/codec/I2S_MAP.png

-40.6 KB
Binary file not shown.

debug/codec/README.md

Lines changed: 265 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44

55
### 硬件连接
66

7-
![es8323](./es8323.png)
7+
![es8323](./pngs/es8323.png)
88

99
SPK_CTL连接GPIO7_B7
1010

11-
![spk_ctl](./spk_ctl.png)
11+
![spk_ctl](./pngs/spk_ctl.png)
1212

1313
HP_CTL连接GPIO7_A4
1414

15-
![hp_ctl](./hp_ctl.png)
15+
![hp_ctl](./pngs/hp_ctl.png)
1616

1717
HP_DET连接GPIO0_B5
1818

19-
![hp_det](./hp_det.png)
19+
![hp_det](./pngs/hp_det.png)
2020

2121
### DeviceTree Describe
2222

@@ -68,21 +68,276 @@ HP_DET连接GPIO0_B5
6868

6969
### 从datasheet里Address Mapping可以找到I2S控制器被映射到的位置
7070

71-
![I2S MAP](./I2S_MAP.png)
71+
![I2S MAP](./pngs/I2S_MAP.png)
7272

7373
### 中断号(SPI[85])
7474

75-
![I2S INT](./I2S_INT.png)
75+
![I2S INT](./pngs/I2S_INT.png)
7676

7777
### DMA编号(tx[0], rx[1])
7878

79-
![I2S DMA](./I2S_DMA.png)
79+
![I2S DMA](./pngs/I2S_DMA.png)
8080

8181
### I2S寄存器信息,32bit,步进4
8282

83-
![I2S REG](./I2S_REG.png)
83+
![I2S REG](./pngs/I2S_REG.png)
8484

85-
## Usage
85+
## Codec驱动(es8316.c)
86+
87+
### 硬件连接(同ES8323)
88+
89+
### DeviceTree Describe
90+
91+
&i2c2 {
92+
es8316: es8316@10 {
93+
compatible = "es8316";
94+
reg = <0x10>;
95+
spk-con-gpio = <&gpio7 GPIO_B7 GPIO_ACTIVE_HIGH>;
96+
hp-con-gpio = <&gpio0 GPIO_B5 GPIO_ACTIVE_HIGH>;
97+
hp-det-gpio = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
98+
};
99+
};
100+
101+
## Machine驱动(rk_es8316.c rockchip平台)
102+
103+
### DeviceTree Describe
104+
105+
/ {
106+
rockchip-es8316 {
107+
compatible = "rockchip-es8316";
108+
dais {
109+
dai0 {
110+
audio-codec = <&es8316>;
111+
audio-controller = <&i2s>;
112+
format = "i2s";
113+
};
114+
};
115+
};
116+
};
117+
118+
## Platform驱动(rk_i2s.c rockchip平台, 同ES8323)
119+
120+
## ALSA DAPM
121+
122+
[参考文章:ALSA声卡驱动中的DAPM详解](http://blog.csdn.net/droidphone)
123+
124+
### kcontrol
125+
126+
一个kcontrol代表着一个mixer(混音器),或是一个mux(多路开关),或是一个音量控制器等
127+
128+
定义一个kcontrol主要就是定义一个snd_kcontrol_new结构
129+
130+
struct snd_kcontrol_new {
131+
...
132+
snd_kcontrol_get_t *get;
133+
snd_kcontrol_put_t *put;
134+
...
135+
unsigned long private_value;
136+
};
137+
138+
get回调函数用于获取该控件当前的状态值
139+
140+
put回调函数则用于设置控件的状态值
141+
142+
private_value字段则根据不同的控件类型有不同的意义,比如对于普通的控件,private_value字段可以用来定义该控件所对应的寄存器的地址以及对应的控制位在寄存器中的位置信息
143+
144+
- Mixer控件
145+
146+
Mixer控件用于音频通道的路由控制,由多个输入和一个输出组成,多个输入可以自由地混合在一起,形成混合后的输出
147+
148+
![mixer](./pngs/mixer.png)
149+
150+
- Mux控件
151+
152+
mux控件与mixer控件类似,也是多个输入端和一个输出端的组合控件,与mixer控件不同的是,mux控件的多个输入端同时只能有一个被选中
153+
154+
- SOC_SINGLE(DAC Stereo Enhancement)
155+
156+
这种控件只有一个控制量,比如一个开关,Codec中某个频率,FIFO大小等
157+
158+
寄存器描述如下
159+
160+
![reg32](./pngs/reg32.png)
161+
162+
用寄存器0x32偏移量0,最大值7,描述DAC stereo
163+
164+
SOC_SINGLE("DAC Stereo Enhancement", ES8316_DAC_SET3_REG32, 0, 7, 0),
165+
166+
- SOC_SINGLE_TLV(Mic Boost)
167+
168+
SOC_SINGLE_TLV是SOC_SINGLE的一种扩展,主要用于定义那些有增益控制的控件,例如音量控制器,EQ均衡器等
169+
170+
寄存器描述如下
171+
172+
![reg24](./pngs/reg24.png)
173+
174+
对应dB数是0.01dB*1200 = 12dB
175+
176+
static const DECLARE_TLV_DB_SCALE(mic_bst_tlv, 0, 1200, 0);
177+
SOC_SINGLE_TLV("MIC Boost", ES8316_ADC_D2SEPGA_REG24, 0, 1, 0, mic_bst_tlv),
178+
179+
- Headphone Mixer Mux
180+
181+
硬件框图如下
182+
183+
![headphone mux](./pngs/hp_mux.png)
184+
185+
寄存器描述如下
186+
187+
![reg13](./pngs/reg13.png)
188+
189+
文字描述
190+
191+
static const char *const es8316_hpmux_texts[] = {
192+
"lin1-rin1",
193+
"lin2-rin2",
194+
"lin-rin with Boost",
195+
"lin-rin with Boost and PGA"
196+
};
197+
198+
取值范围
199+
200+
static const unsigned int es8316_hpmux_values[] = {0, 1, 2, 3};
201+
202+
用REG13寄存器偏移4位起来控制左通道,最大值7,取值见values数组
203+
204+
static const struct soc_enum es8316_left_hpmux_enum =
205+
SOC_VALUE_ENUM_SINGLE(ES8316_HPMIX_SEL_REG13, 4, 7,
206+
ARRAY_SIZE(es8316_hpmux_texts),
207+
es8316_hpmux_texts,
208+
es8316_hpmux_values);
209+
210+
添加到kcontrol
211+
212+
static const struct snd_kcontrol_new es8316_left_hpmux_controls =
213+
SOC_DAPM_VALUE_ENUM("Route", es8316_left_hpmux_enum);
214+
215+
用REG13寄存器偏移0位起来控制右通道,最大值7,取值见values数组
216+
217+
static const struct soc_enum es8316_right_hpmux_enum =
218+
SOC_VALUE_ENUM_SINGLE(ES8316_HPMIX_SEL_REG13, 0, 7,
219+
ARRAY_SIZE(es8316_hpmux_texts),
220+
es8316_hpmux_texts,
221+
es8316_hpmux_values);
222+
223+
添加到kcontrol
224+
225+
static const struct snd_kcontrol_new es8316_right_hpmux_controls =
226+
SOC_DAPM_VALUE_ENUM("Route", es8316_right_hpmux_enum);
227+
228+
将kcontrol添加到dapm widget中,用tinymix可以看到对应的名字
229+
230+
SND_SOC_DAPM_MUX("Left Hp mux", SND_SOC_NOPM, 0, 0,
231+
&es8316_left_hpmux_controls),
232+
SND_SOC_DAPM_MUX("Right Hp mux", SND_SOC_NOPM, 0, 0,
233+
&es8316_right_hpmux_controls),
234+
235+
- Analog Input MUX
236+
237+
硬件框图
238+
239+
![blcok](./pngs/analog_input.png)
240+
241+
寄存器描述
242+
243+
![reg22](./pngs/reg22.png)
244+
245+
名字
246+
247+
static const char * const es8316_analog_in_txt[] = {
248+
"lin1-rin1",
249+
"lin2-rin2",
250+
"lin1-rin1 with 20db Boost",
251+
"lin2-rin2 with 20db Boost"
252+
};
253+
254+
取值范围
255+
256+
static const unsigned int es8316_analog_in_values[] = {
257+
0,/*1,*/
258+
1,
259+
2,
260+
3
261+
};
262+
263+
用寄存器0x22第4位起控制,最大值3,取值范围见values数组
264+
265+
static const struct soc_enum es8316_analog_input_enum =
266+
SOC_VALUE_ENUM_SINGLE(ES8316_ADC_PDN_LINSEL_REG22, 4, 3,
267+
ARRAY_SIZE(es8316_analog_in_txt),
268+
es8316_analog_in_txt,
269+
es8316_analog_in_values);
270+
271+
添加到kcontrol
272+
273+
static const struct snd_kcontrol_new es8316_analog_in_mux_controls =
274+
SOC_DAPM_ENUM("Route", es8316_analog_input_enum);
275+
276+
将kcontrol添加到dapm widget中,用tinymix可以看到对应的名字
277+
278+
SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
279+
&es8316_analog_in_mux_controls),
280+
281+
### Widget
282+
283+
所谓widget,其实可以理解为是kcontrol的进一步升级和封装,它同样是指音频系统中的某个部件,比如mixer,mux,输入输出引脚,电源供应器等,用结构体snd_soc_dapm_widget来描述
284+
285+
### Widget之间的连接关系(route)
286+
287+
一个路径的连接至少包含以下几个元素
288+
起始端widget,跳线path,到达端widget,在DAPM中,用snd_soc_dapm_route结构来描述这样一个连接关系
289+
290+
struct snd_soc_dapm_route {
291+
const char *sink;
292+
const char *control;
293+
const char *source;
294+
295+
/* Note: currently only supported for links where source is a supply */
296+
int (*connected)(struct snd_soc_dapm_widget *source,
297+
struct snd_soc_dapm_widget *sink);
298+
};
299+
300+
sink指向到达端widget的名字字符串
301+
302+
source指向起始端widget的名字字符串
303+
304+
control指向负责控制该连接所对应的kcontrol名字字符串
305+
306+
connected回调则定义了自定义连接检查回调函数
307+
308+
该结构的意义是:source通过一个kcontrol,和sink连接在一起,现在是否处于连接状态,请调用connected回调函数检查
309+
310+
有如下route
311+
312+
static const struct snd_soc_dapm_route es8316_dapm_routes[] = {
313+
...
314+
{"Digital Mic Mux", "dmic disable", "Mono ADC"},
315+
{"Digital Mic Mux", "dmic data at high level", "DMIC"},
316+
{"Digital Mic Mux", "dmic data at low level", "DMIC"},
317+
...
318+
};
319+
320+
从代码中可以知道"Digital Mic Mux"有下面3个输入管脚
321+
322+
"dmic disable"
323+
"dmic data at high level"
324+
"dmic data at low level"
325+
326+
"Mono ADC"连接到"dmic disable"
327+
328+
"DMIC"连接到"dmic data at high level"
329+
330+
"DMIC"连接到"dmic data at low level"
331+
332+
### kcontrol 和 DAPM kcontrol
333+
334+
SOC_DAPM_SINGLE对应与普通控件的SOC_SINGLE
335+
336+
SOC_DAPM_SINGLE_TLV对应SOC_SINGLE_TLV等
337+
338+
相比普通的kcontrol控件,dapm的kcontrol控件只是把info,get,put回调函数换掉了
339+
340+
## 如何使用(以ES8323为例)
86341

87342
将es8323.dtsi包含到主dts中
88343

@@ -123,7 +378,7 @@ HP_DET连接GPIO0_B5
123378
/sys/kernel/debug/asoc/
124379
/sys/class/sound/
125380

126-
## Test
381+
## 测试方法
127382

128383
录音
129384

@@ -146,41 +401,6 @@ HP_DET连接GPIO0_B5
146401
tinymix <ctrl id> <value>
147402

148403

149-
## Codec驱动(es8316.c)
150-
151-
### 硬件连接(同ES8323)
152-
153-
### DeviceTree Describe
154-
155-
&i2c2 {
156-
es8316: es8316@10 {
157-
compatible = "es8316";
158-
reg = <0x10>;
159-
spk-con-gpio = <&gpio7 GPIO_B7 GPIO_ACTIVE_HIGH>;
160-
hp-con-gpio = <&gpio0 GPIO_B5 GPIO_ACTIVE_HIGH>;
161-
hp-det-gpio = <&gpio7 GPIO_A4 GPIO_ACTIVE_HIGH>;
162-
};
163-
};
164-
165-
## Machine驱动(rk_es8316.c rockchip平台)
166-
167-
### DeviceTree Describe
168-
169-
/ {
170-
rockchip-es8316 {
171-
compatible = "rockchip-es8316";
172-
dais {
173-
dai0 {
174-
audio-codec = <&es8316>;
175-
audio-controller = <&i2s>;
176-
format = "i2s";
177-
};
178-
};
179-
};
180-
};
181-
182-
## Platform驱动(rk_i2s.c rockchip平台, 同ES8323)
183-
184404
## 耳机检测
185405

186406
[参考文章Android4.×耳机插拔检测](http://blog.csdn.net/fengying765/article/details/38301483)

debug/codec/es8316.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static int es8316_volatile(struct snd_soc_codec *codec, unsigned int reg)
9191
else
9292
return 0;
9393
}
94-
/* codec private data */
94+
9595
struct es8316_chip {
9696
/* alway include these two member */
9797
struct device *dev;
@@ -1240,8 +1240,6 @@ static struct snd_soc_codec_driver soc_codec_dev_es8316 = {
12401240
.num_dapm_routes = ARRAY_SIZE(es8316_dapm_routes),
12411241
};
12421242

1243-
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
1244-
12451243
static void es8316_i2c_shutdown(struct i2c_client *client)
12461244
{
12471245
struct snd_soc_codec *codec;
@@ -1407,22 +1405,19 @@ static struct i2c_driver es8316_i2c_driver = {
14071405
.class = I2C_CLASS_HWMON,
14081406
.address_list = normal_i2c,
14091407
};
1410-
#endif
14111408

14121409
static int es8316_init(void)
14131410
{
14141411
return i2c_add_driver(&es8316_i2c_driver);
14151412
}
1413+
module_init(es8316_init);
14161414

14171415
static void es8316_exit(void)
14181416
{
14191417
return i2c_del_driver(&es8316_i2c_driver);
14201418
}
1421-
1422-
1423-
module_init(es8316_init);
14241419
module_exit(es8316_exit);
14251420

14261421
MODULE_DESCRIPTION("ASoC es8316 driver");
1427-
MODULE_AUTHOR("Will <will@everset-semi.com>");
1422+
MODULE_AUTHOR("M_O_Bz@163.com");
14281423
MODULE_LICENSE("GPL");
File renamed without changes.

debug/codec/pngs/I2S_INT.png

22.2 KB
Loading

debug/codec/pngs/I2S_MAP.png

20.4 KB
Loading
File renamed without changes.

debug/codec/pngs/analog_input.png

24.1 KB
Loading
File renamed without changes.

0 commit comments

Comments
 (0)