44
55### 硬件连接
66
7- ![ es8323] ( ./es8323.png )
7+ ![ es8323] ( ./pngs/ es8323.png )
88
99SPK_CTL连接GPIO7_B7
1010
11- ![ spk_ctl] ( ./spk_ctl.png )
11+ ![ spk_ctl] ( ./pngs/ spk_ctl.png )
1212
1313HP_CTL连接GPIO7_A4
1414
15- ![ hp_ctl] ( ./hp_ctl.png )
15+ ![ hp_ctl] ( ./pngs/ hp_ctl.png )
1616
1717HP_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 )
0 commit comments