기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

TCC 8930 칩을 사용하는 보드에 ALC5622 코덱을 사용하고 있습니다.


안드로이드와 사운드 연결은 다 되어 소리 출력과 마이크 입력이 되기는 하는데요.

Sound Recoder로 녹음을 시작하면 8초 후에 마이크 입력이 끊어 집니다.


커널 로그에서는 route에 연결한 출력쪽 콜백함수가 호출 되었다고 나오면서 I2C 포트 출력을 하는것이 확인 됩니다.


[  626.340000] == alsa-debug-alc5622 == [mic_event] <= Sound Recoder 녹음 시작
[  629.380000] == alc5622-debug == [alc5623_mute]
[  629.380000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3
[  634.410000] == alsa-debug-alc5622 == [linejack_event] <= 마이크 입력이 끊어지는 부분
[  634.410000] == alsa-debug-alc5622 == [speaker_event]
[  634.420000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3
[  634.440000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3
[  634.460000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3
[  634.480000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3
[  634.500000] i2c i2c-0: master_xfer[0] W, addr=0x1a, len=3


안드로이드 쪽에서 뭔가 이벤트를 발생시키는것 같은데 어디를 봐야 할지 도저히 찾을수가 없네요.

혹시 도움을 좀 받을 수 있을지요..


고도리

2014.04.03 09:36:00
*.200.239.210

audio hal이 워낙 다양하게 구성되어 있어서 정확하게 답하기는 힘든 상황이긴 한데...


1. 소리는 녹음이 되나요?

2. sampling rate와 channel은?


hal구성과 driver의 구성에 따라서도 다른 증상이 나올 수 있습니다만,

근래, realtek audio의 경우 driver가 mic 동작이 이상한 경우가 많습니다.


예를 들어 제가 사용했던 alc5631의 경우 위와 유사한 증상이 있었습니다.

특정 시점이 지나면 녹음이 되지 않았습니다.


realtek의 alsa soc의 DAPM 방식을 많이 도입하면서 특정케이스에서

내부 block을 꺼 버리는 증상이 있습니다.


즉, mic를 꺼 버리는.......ㅠ.ㅠ

GloomyDay

2014.04.03 12:37:58
*.143.101.196

일단 녹음은 잘 되더군요...8초동안만요..

샘플링 레이트와 채널은 확인해보지 않았네요..

I2C 데이터를 확인해 보니 스피커 이벤트가 발생하는 시점에서 Main I2S Enable 레지스터와 마이크 쪽 레지스터를 0으로 설정하는 만행을 저지르는데 어디쯤에서 보내는지 범위가 안잡힙니다.

코덱쪽 함수는 호출 되면 무조건 메세지를 출력하도록 해놨는데 전혀 보이지 않고 안드로이드의 audio_hw.c 는 너무 많이 출력되서 구분이 안가더군요..

고도리

2014.04.04 10:13:56
*.111.12.170

말씀하시는 것으로 봐서는 위에서 제가 말씀드린 5631 에서 발생하는 문제와 거의 동일할 듯 하네요.


만행을 저지르는게 DAPM widget control시 이루어지는 듯 하네요.

이거 잡기 그지같이 힘듭니다....ㅠ.ㅠ


저희는 driver 소스를 있는대로 다 받아다가 테스트해서 잡았습니다.

5631 드라이버 소스가 대여섯가지는 되는 듯 하네요.


참고로, 5631의 경우는 realtek에서 주는 guide문서대로 동작되지 않았습니다.

다른 칩도 그럴 가능성이 있을겁니다.


최후의 방법으로는 dapm을 전혀 안쓰는 드라이버 코드로 작업하는 것인데

난이도가 워낙 커서 비추입니다.

(저는 가끔 하긴 합니다....팝업노이즈 잡을때는)

GloomyDay

2014.04.04 19:37:20
*.45.184.2

그렇군요...레지스터로는 아무리 장난을쳐봐도 안되더군요...

고도리

2014.04.04 20:04:51
*.200.239.210

근래 realtek의 audio codec이 아마도 wolfson style의 제어를 따라가면서

driver들의 동작이 애매하게 됩니다.


제가 근래 realtek 것을 쓰다가 양산용으로 2개 밀어넣었다가 2주 동안 식음을 전폐(?)

할 정도로 스트레스 받았습니다.


mic 때문에요. 덕분에 제 밑의 audio 담당자도 3주 정도 멘붕이 왔고요.

어찌어찌 해결은 했는데, 동작이 정말 이상합니다.


android에서 alc5631q를 작업하면서 mic관련 부분 중 이상한 증상은 다음과 같습니다.


1. mic만 동작이 안된다. 즉, play를 하면서 mic를 동작하면 일부 되는 경우가 있습니다.

이것도 특정상황은 되는데, gloomyday 님과 같은 증상이 나옵니다.


2. mic만 only 동작되도록 코딩을 해서 작업하면 play & record가 동시에 되지 않는다.


제가 nxp4330 board에 akm을 쓴 이유가 이런 상황을 함 겪고 나서입니다.


그리고, 더 웃긴 것은 한세대 이전의 codec인 alc5625는 괜찮다는 것이죠.

쾌도난마

2014.04.04 22:14:37
*.62.202.29

로그상 29와 34초가 5초 차이가 나면서 코덱을 종료시키는데

29초에서 pcm이 close 된걸로 추측 됩니다.

이걸 확실히 하기 위해 soc-core.c 에서

pmdown_time 변수를 10000 으로 변경해보세요

맞다면 그 이후에 왜 닫히는지 찾아보죠 ㅎㅎㅎ


쾌도난마

2014.04.04 22:46:58
*.62.202.29

그리고 몇가지 조언을 좀 더 해드리면

alsa xrun debug 를 활용하도록 준비하시고


기본 기능 테스트는 console을 이용하여 ( tinyalsa 추천 )

테스트 해 보세요 ( android 에서도 가능 )

그래야 커널 문젠지 안드로이드 문제인지 분간 할 수 있을 것 같습니다.


대신 콘솔로 하면 5622의 path 컨트롤을 좀 할 수 있어야 하구요(tinymix)

datasheet 한번 살펴 봤는데 블록도 보면 그렇게 복잡하지는 않네요..

할수 있을겁니다!! 화이팅


마지막으로.. TCC 면 기술지원 받으시면 되지 않나요? ㅎㅎㅎ


GloomyDay

2014.04.05 02:58:54
*.45.184.2

말씀처럼 pmdown_time을 10000으로 변경하니 시간은 늘어 나는군요.

콘솔 테스트의 경우 tinycap으로 녹음 하고 tinyplay로 재생 하여본 결과 안드로이드의 apth,가 설정되지 않으면 녹음자체가 안되더군요.

일단 안드로이드에서 버튼 클릭음을 내고나서 tinycap으로 녹음을 하면 녹음은 되지만 pcm이 close 되면서 동일하게 입력이 없어집니다.

만약 안드로이드에서 아무 동작을 하지 않은 상태로 녹음을 시도하면 그냥 마이크 입력을 처리하지 못하는군요.

고도리

2014.04.05 03:36:33
*.200.239.210

제가 말씀드린 증상이 위 증상입니다....


완조니 돌아 버립니다....쩝

GloomyDay

2014.04.05 04:07:09
*.45.184.2

일단 상황만 보고 생각해 보자면 사운드 관련 이벤트가 안드로이드에서 발생해야 ALSA가 동작하는것처럼 보이네요...

쾌도난마

2014.04.05 03:58:49
*.62.202.29

짧은 버튼 클릭음 말고 긴시간 되는음악 플레이를 해보고 녹음 해보실 생각은 안해보셨나요? ㅎ


일단 안드로이드 도움 없이 운용 될 수 있도록 path 를 찾으셔야 합니다.


1. 일단 tinymix 입력해서 나오는 문자열

2. ls /d/asoc/YourSoundCardName"/"Codec device Name"/dapm 

3. ls /d/asoc/"YourSoundCardName"/dapm


해서 나오는 문자열을 좀 보여주실수 있나요?


쾌도난마

2014.04.05 04:06:56
*.62.202.29

아... 왜 8초가 녹음되는지 이제여 알겠네요

ㅋㅋㅋ

안드로이드 버튼 클릭 하면서 playback path가 켜집니다.

근데! 안드로이는 pop 제거를 위해 3초 zero padding data를 playback으로 내 보냅니다

(music stop을 눌러도 3초 동은 코덱으로 0으로 된 pcm을 내보낸다는 것)

이때 녹음이 시작 하고 3초가 녹음이 됩니다.

그럼 5초는? 위에 설명 드렸다 싶이 playback pcm 이 close 되면, 5초 후에 ( 위에 제가 10초로 수정하라고 한것 )

codec을 끕니다.


이래서 8초가 녹음이 되는군요.. ㅎㅎㅎ


일단 path 문제가 제일 커 보이는데


Codec 이 Master 모드 입니까? AP가 Master 입니까?

MCLK의 공급원은 어디서 나오죠? AP로 부터? 외부 클럭을 달아서?


GloomyDay

2014.04.05 04:18:45
*.45.184.2

코덱은 slave로 동작을 하구요 mclk는 AP에서 공급 받습니다.


아..정말 혼자서 하다 보면 생각못하는게 많아 지는군요.

왜 긴 음악을 플레이 해놓고 녹음할 생각을 못했는지 모르겠습니다..

보여달라고 하신 문자열들입니다.

1.

Number of controls: 57
ctl    type    num    name                                     value
0    BOOL    1    Main I2S Enable                          On
1    INT    2    Speaker Playback Volume                  25 25
2    BOOL    2    Speaker Playback Switch                  On On
3    INT    2    Line Playback Volume                     31 31
4    BOOL    2    Line Playback Switch                     On On
5    INT    2    Auxout Playback Volume                   25 25
6    BOOL    2    Auxout Playback Switch                   On On
7    BOOL    1    Auxout Amp Switch                        Off
8    INT    2    PCM Playback Volume                      25 25
9    INT    2    AuxI Capture Volume                      31 31
10    INT    2    LineIn Capture Volume                    31 31
11    BOOL    1    Mic1 Bias                                On
12    INT    1    Mic1 Capture Volume                      25
13    INT    1    Mic2 Capture Volume                      0
14    INT    2    Rec Capture Volume                       25 25
15    INT    1    Mic 1 Boost Volume                       1
16    INT    1    Mic 2 Boost Volume                       0
17    INT    1    Digital Boost Volume                     0
18    ENUM    1    AB-D Amp Mux                             AB Amp
19    BOOL    1    Right Capture Mix Mic1 Capture Switch    On
20    BOOL    1    Right Capture Mix Mic2 Capture Switch    Off
21    BOOL    1    Right Capture Mix LineInR Capture Switch On
22    BOOL    1    Right Capture Mix Right AuxI Capture Switch On
23    BOOL    1    Right Capture Mix HPMixerR Capture Switch On
24    BOOL    1    Right Capture Mix SPKMixer Capture Switch On
25    BOOL    1    Right Capture Mix MonoMixer Capture Switch On
26    BOOL    1    Left Capture Mix Mic1 Capture Switch     On
27    BOOL    1    Left Capture Mix Mic2 Capture Switch     Off
28    BOOL    1    Left Capture Mix LineInL Capture Switch  On
29    BOOL    1    Left Capture Mix Left AuxI Capture Switch On
30    BOOL    1    Left Capture Mix HPMixerL Capture Switch On
31    BOOL    1    Left Capture Mix SPKMixer Capture Switch On
32    BOOL    1    Left Capture Mix MonoMixer Capture Switch On
33    BOOL    1    Speaker Mix LI2SPK Playback Switch       Off
34    BOOL    1    Speaker Mix AUXI2SPK Playback Switch     Off
35    BOOL    1    Speaker Mix MIC12SPK Playback Switch     Off
36    BOOL    1    Speaker Mix MIC22SPK Playback Switch     Off
37    BOOL    1    Speaker Mix DAC2SPK Playback Switch      On
38    BOOL    1    Mono Mix ADC2MONO_L Playback Switch      On
39    BOOL    1    Mono Mix ADC2MONO_R Playback Switch      On
40    BOOL    1    Mono Mix LI2MONO Playback Switch         On
41    BOOL    1    Mono Mix AUXI2MONO Playback Switch       On
42    BOOL    1    Mono Mix MIC12MONO Playback Switch       On
43    BOOL    1    Mono Mix MIC22MONO Playback Switch       On
44    BOOL    1    Mono Mix DAC2MONO Playback Switch        On
45    BOOL    1    HPL Mix ADC2HP_L Playback Switch         On
46    BOOL    1    HPR Mix ADC2HP_R Playback Switch         On
47    BOOL    1    HP Mix LI2HP Playback Switch             On
48    BOOL    1    HP Mix AUXI2HP Playback Switch           On
49    BOOL    1    HP Mix MIC12HP Playback Switch           On
50    BOOL    1    HP Mix MIC22HP Playback Switch           On
51    BOOL    1    HP Mix DAC2HP Playback Switch            On
52    ENUM    1    SpeakerOut N Mux                         LN/-R
53    ENUM    1    Right Headphone Mux                      Vmid
54    ENUM    1    Left Headphone Mux                       Vmid
55    ENUM    1    SpeakerOut Mux                           Speaker Mix
56    ENUM    1    AuxOut Mux                               Speaker Mix


2.

AB Amp
AB-D Amp Mux
AUXINL
AUXINR
AUXOUTL
AUXOUTR
AuxI Mix
AuxOut Mux
D Amp
HP Mix
HPL
HPL Mix
HPOut Mix
HPR
HPR Mix
I2S Mix
LINEINL
LINEINR
Left ADC
Left AuxI
Left AuxOut
Left Capture Mix
Left DAC
Left Headphone
Left Headphone Mux
Left LineIn
Line Mix
Lineout
MIC1
MIC1 PGA
MIC1 Pre Amp
MIC2
MIC2 PGA
MIC2 Pre Amp
Mic
Mic Bias1
Mono Mix
Right ADC
Right AuxI
Right AuxOut
Right Capture Mix
Right DAC
Right Headphone
Right Headphone Mux
Right LineIn
SPKOUT
SPKOUTN
Speaker
Speaker Mix
SpeakerOut
SpeakerOut Mux
SpeakerOut N Mux
Vmid
bias_level


3.

bias_level

쾌도난마

2014.04.05 04:38:32
*.62.202.29

MIC1 -> MIC1 Pre Amp -> (Mic1 Capture Switch) -> Left Capture Mix -> Left ADC
MIC1 -> MIC1 Pre Amp -> (Mic1 Capture Switch) -> Right Capture Mix -> Right ADC

경로가 이렇게 나오는데  ( tinymix 설정은 잘 됐습니다. Switch 1개 밖에 없네요 )
위에 2번 경로 에서 위에 괄호 빼고
cat "MIC1"
cat "MIC1 Pre Amp"
cat "Left Capture Mix"
cat "Right Capture Mix"
cat "Left ADC"
cat "Right ADC"

1. 녹음 될때 결과와
2. 안될때 결과를 한번 보여주세요

GloomyDay

2014.04.05 05:12:29
*.45.184.2

일단 대기 상태와 녹음상태 마이크 끊어진 상태로 확인을 해봤는데요.

마이크가 끊어질때 상태는 분명 On인데 몇개가 in이 2개 줄어 듭니다.


대기상태
MIC1: Off  in 2 out 0
 in  "static" "Mic"
 in  "static" "Mic"
 out "static" "MIC1 Pre Amp"

MIC1 Pre Amp: Off  in 2 out 0 - R62(0x3e) bit 1
 in  "static" "MIC1"
 out "static" "MIC1 PGA"
 out "Mic1 Capture Switch" "Right Capture Mix"
 out "Mic1 Capture Switch" "Left Capture Mix"

Left Capture Mix: Off  in 11 out 0 - R60(0x3c) bit 1
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerL Capture Switch" "HPL Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Left AuxI Capture Switch" "AUXINL"
 in  "LineInL Capture Switch" "LINEINL"
 out "static" "Left ADC"
 out "ADC2MONO_L Playback Switch" "Mono Mix"
 out "ADC2HP_L Playback Switch" "HPL Mix"

Right Capture Mix: Off  in 11 out 0 - R60(0x3c) bit 0
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerR Capture Switch" "HPR Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Right AuxI Capture Switch" "AUXINR"
 in  "LineInR Capture Switch" "LINEINR"
 out "static" "Right ADC"
 out "ADC2MONO_R Playback Switch" "Mono Mix"
 out "ADC2HP_R Playback Switch" "HPR Mix"

Left ADC: Off  in 11 out 0 - R60(0x3c) bit 7
 stream Left HiFi Capture inactive
 in  "static" "Left Capture Mix"

Right ADC: Off  in 11 out 0 - R60(0x3c) bit 6
 stream Right HiFi Capture inactive
 in  "static" "Right Capture Mix"


녹음
MIC1: On  in 2 out 2
 in  "static" "Mic"
 in  "static" "Mic"
 out "static" "MIC1 Pre Amp"

MIC1 Pre Amp: On  in 2 out 2 - R62(0x3e) bit 1
 in  "static" "MIC1"
 out "static" "MIC1 PGA"
 out "Mic1 Capture Switch" "Right Capture Mix"
 out "Mic1 Capture Switch" "Left Capture Mix"

Left Capture Mix: On  in 13 out 2 - R60(0x3c) bit 1
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerL Capture Switch" "HPL Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Left AuxI Capture Switch" "AUXINL"
 in  "LineInL Capture Switch" "LINEINL"
 out "static" "Left ADC"
 out "ADC2MONO_L Playback Switch" "Mono Mix"
 out "ADC2HP_L Playback Switch" "HPL Mix"

Right Capture Mix: On  in 13 out 2 - R60(0x3c) bit 0
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerR Capture Switch" "HPR Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Right AuxI Capture Switch" "AUXINR"
 in  "LineInR Capture Switch" "LINEINR"
 out "static" "Right ADC"
 out "ADC2MONO_R Playback Switch" "Mono Mix"
 out "ADC2HP_R Playback Switch" "HPR Mix"

Left ADC: On  in 13 out 1 - R60(0x3c) bit 7
 stream Left HiFi Capture active
 in  "static" "Left Capture Mix"

Right ADC: On  in 13 out 1 - R60(0x3c) bit 6
 stream Right HiFi Capture active
 in  "static" "Right Capture Mix"


안될 때
MIC1: On  in 2 out 2
 in  "static" "Mic"
 in  "static" "Mic"
 out "static" "MIC1 Pre Amp"

MIC1 Pre Amp: On  in 2 out 2 - R62(0x3e) bit 1
 in  "static" "MIC1"
 out "static" "MIC1 PGA"
 out "Mic1 Capture Switch" "Right Capture Mix"
 out "Mic1 Capture Switch" "Left Capture Mix"

Left Capture Mix: On  in 11 out 2 - R60(0x3c) bit 1
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerL Capture Switch" "HPL Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Left AuxI Capture Switch" "AUXINL"
 in  "LineInL Capture Switch" "LINEINL"
 out "static" "Left ADC"
 out "ADC2MONO_L Playback Switch" "Mono Mix"
 out "ADC2HP_L Playback Switch" "HPL Mix"

Right Capture Mix: On  in 11 out 2 - R60(0x3c) bit 0
 in  "MonoMixer Capture Switch" "Mono Mix"
 in  "SPKMixer Capture Switch" "Speaker Mix"
 in  "HPMixerR Capture Switch" "HPR Mix"
 in  "Mic1 Capture Switch" "MIC1 Pre Amp"
 in  "Right AuxI Capture Switch" "AUXINR"
 in  "LineInR Capture Switch" "LINEINR"
 out "static" "Right ADC"
 out "ADC2MONO_R Playback Switch" "Mono Mix"
 out "ADC2HP_R Playback Switch" "HPR Mix"

Left ADC: On  in 11 out 1 - R60(0x3c) bit 7
 stream Left HiFi Capture active
 in  "static" "Left Capture Mix"

Right ADC: On  in 11 out 1 - R60(0x3c) bit 6
 stream Right HiFi Capture active
 in  "static" "Right Capture Mix"

고도리

2014.04.05 01:43:57
*.200.239.210

대부분 커널 문제인 경우가 많습니다.


근래, realtek코덱 비슷한 고생을 계속 하고 있습니다.

이상한 증상도 많이 발견되고요.


path control을 해 봐도, 문제는 dapm이 동작되면서 amp와 mic관련 widget들이

켜지고 꺼지는 순서에 상관이 있었습니다.


path control하는 순서가 mic에 모든 dependency가 있는게 아니라

play쪽과도 관련되어 있는 듯 합니다.

고도리

2014.04.05 01:44:30
*.200.239.210

오죽하면........codec을 바꿔야 겠다는 결론까지...ㅠ.ㅠ

쾌도난마

2014.04.05 05:15:25
*.62.202.29

playback 스트림이 살아 있을 때 마이크 입력이 되는 이유는

ALSA DAPM 상 MIC 부터 HP 나 SPK 까지 모두 연결이 되어 있기 때문에 

Left ADC power, Left Mixer power 를 키기 때문에 녹음이 가능 합니다.

playback 스트림이 끝나면 더이상 DAPM 상 연결이 모두 끊기기 때문에

power를 down 시켜서 녹음이 안되는 것입니다. 


DAPM 이 IN->OUT 연결 체결 되었을때 녹음이 이상없으므로 codec register를

잘못 설정해 주고 있지는 않은것 같습니다.


커널 버젼 얼마나 사용하시는지는 잘 모르나.. 현재 가장 가능성 있는 부분은


SND_SOC_DAPM_ADC("Left ADC", "Left HiFi Capture", ALC5623_PWR_MANAG_ADD2, 7, 0),

SND_SOC_DAPM_ADC("Right ADC", "Right HiFi Capture", ALC5623_PWR_MANAG_ADD2, 6, 0),

static struct snd_soc_dai_driver alc5623_dai = {

.capture = {

.stream_name = "Capture",

.

}

};


이 부분입니다.


논리적으로 DAPM 이 연결이 안되기 때문에 power 가 안들어가는 것인데 

... 아무튼 건투를 빕니다~


올려 주신걸 보면 이부분은 아니네요 active 상태입니다...


와.... 그럼 답 안나오는데요?;;;;;;...... ㅡ.ㅡ;;;;;



GloomyDay

2014.04.05 05:39:02
*.45.184.2

고도리님 쾌도난마님 감사합니다.

두 분덕에 그래도 어느정도 범위는 줄인것 같습니다.


일단 지금 soc-pcm.c 를 살펴 보고 있는데 soc_pcm_close 함수에서 조금 눈에 띄는 부분이 있어 확인 중입니다.

혹시나 이 부분이 맞다면 다시 삽질할 거리가 생기겠네요...^^

쾌도난마

2014.04.05 05:50:42
*.62.202.29

데이타 쉬트 5page 의 audio path 를 보시고

ls /d/asoc/YourSoundCardName"/"Codec device Name"/dapm 

전체 덤프를 뜨셔서 한번 비교해 보세요.


제 느낌은 아무래도 codec driver를 작성한 사람이(Arnaud Patard <[email protected]>)

DAPM map 을 구성하면서 capture에 필요한 power(?) 를 빼먹었고

playback을 하면 capture에 필요한 power가 들어가서 녹음이 되고 playback이 끝나면 power가 꺼져서

그런듯 싶습니다. 그러니깐 

playback 할때 켜지는 power reg bit 가 capture 할때도 필요한 power reg bit 인데

dapm 상 play 할 때만 켜지도록 구성 되어 있다는 느낌.


그 reg bit를 찾은 뒤에 dapm 을 조금 손보셔서 capture dapm 시퀀스에도 추가를 해야 한다...

라는 제 생각 입니다.


(안될 때 올려 주신거 보면 현재 capture dapm 구성으로 reg나 bit 가 모두 on 되어 있습니다)

금요일 밤에 수고 많은십니다. 수고하세요!

GloomyDay

2014.04.05 07:14:58
*.45.184.2

일단 capture와 playback의 DAMP를 비교해보면 capture쪽에 I2C Mix가 빠져 있습니다.

데이터 시트에 보면 이부분이 Main_i2s_en(3Ah[15])인데 이걸 마이크와 연결 하면 playback이 전혀 동작 하지 않게 되네요.


이 부분이 관건인것 같은데..아무래도 쉽게 답이 나오지 않을것 같네요.

쾌도난마

2014.04.05 08:12:36
*.99.60.84

0x3A, 15bit, Main I2S 가 맞는거 같네요

(실제 안될때 0x3a ,15bit 를 강제로 1로 변경 해 보시면 바로 확인 하실수 있음)

일단 수정을 다음과 같이 한번 해 보시죠

---------------------------------------------------------------------------------

-SND_SOC_DAPM_MIXER("I2S Mix", ALC5623_PWR_MANAG_ADD1, 15, 0, NULL, 0),

+SND_SOC_DAPM_MIXER("I2S Mix", SND_SOC_NOPM, 0, 0, NULL, 0),


+static int open_count;


+int alc5623_pcm_startup(struct snd_pcm_substream substream, struct snd_soc_dai *codec_dai)

+{

+ struct snd_soc_codec *codec = codec_dai->codec;

+ u16 ctl;

+ if (!open_count) {

+ ctl = snd_soc_read(codec, ALC5623_PWR_MANAG_ADD1);

+ ctl |= ALC5623_PWR_ADD1_MAIN_I2S_EN ;

+ snd_soc_write(codec, ALC5623_PWR_MANAG_ADD1, ctl);

+ }

+

+ open_count++;

+}


+void alc5623_pcm_shutdown(struct snd_pcm_substream substream, struct snd_soc_dai *codec_dai)

+{

+ struct snd_soc_codec *codec = codec_dai->codec;

+ u16 ctl;

+ open_count--;

+ if (!open_count) {

+ ctl = snd_soc_read(codec, ALC5623_PWR_MANAG_ADD1);

+ ctl &= ~ALC5623_PWR_ADD1_MAIN_I2S_EN;

+ snd_soc_write(codec, ALC5623_PWR_MANAG_ADD1, ctl);

+ }

+

+}



static const struct snd_soc_dai_ops alc5623_dai_ops = {

+ .startup = alc5623_pcm_startup,

+ .shutdown = alc5623_pcm_shutdown,

                .hw_params = alc5623_pcm_hw_params,

                .digital_mute = alc5623_mute,

                .set_fmt = alc5623_set_dai_fmt,

                .set_sysclk = alc5623_set_dai_sysclk,

                .set_pll = alc5623_set_dai_pll,

};

---------------------------------------------------------------------------------

I2S enable 0x3a 15bit 를 dapm 에서 빼고

open close 시 on , off 합니다.

대신 open count 로 관리하여 

0이 될때만 i2s disable

1이상일때는 open 시 건들지 않음.... 

재일 중요한게 0x3a,15bit 를 dapm 으로 관리 안되게 뺴는 겁니다.

notepad 에서 끄적여서 

테스트및 컴파일은 못했어요 ㅎㅎㅎ 에러 나면 적당히 수정하셔서... 한번 해보세요

GloomyDay

2014.04.05 08:29:15
*.45.184.2

더미를 만들어서 처리를 하는 방법이네요....

확실히 제가 생각한 회피 방법보다 안전해 보이네요...

당장 테스트 해봐야 겠습니다.

GloomyDay

2014.04.05 09:18:32
*.45.184.2

아무래도.....레지를 순서대로 켜는것도 중요한가 봅니다.

쾌도난마님께서 작성하신 코드에 조금 수정해서 돌려보니 마이크가 아예 켜지지를 않는군요.


코드 수정은 "struct snd_soc_codec *codec = codec_dai->codec;"이 되지 않아

    struct snd_soc_pcm_runtime *rtd = substream->private_data;
    struct snd_soc_codec *codec = rtd->codec;
이렇게 변경 하였습니다.


일단 Capture가 활성화 되어있으면 회피 하도록 코드를 수정해서 테스트를 해봐야겠네요.


static void soc_dapm_stream_event(struct snd_soc_dapm_context *dapm,
    const char *stream, int event)
{
    struct snd_soc_dapm_widget *w;
+   int currentEvent = event; 

+   if(strstr(stream, "Playback") && currentEvent == SND_SOC_DAPM_STREAM_STOP)                                                                                                              
+   {
+       list_for_each_entry(w, &dapm->card->widgets, list)                                                                                                                                  
+       {
+            if (!w->sname || w->dapm != dapm)
+                continue;     
+            if(strstr(w->sname, "Capture") && w->active == 1)                                                                                                                               
+            {
+                currentEvent = SND_SOC_DAPM_STREAM_RESUME;                                                                                                                                      
+            }
+       }
+   }
     
    list_for_each_entry(w, &dapm->card->widgets, list)                                                                                                                                      
    {
        if (!w->sname || w->dapm != dapm)  
            continue;         
        dev_dbg(w->dapm->dev, "widget %s\n %s stream %s event %d\n",
            w->name, w->sname, stream, event);
        if (strstr(w->sname, stream)) {    
-           switch(event) {   
+           switch(currentEvent) {         
            case SND_SOC_DAPM_STREAM_START:    
                w->active = 1;
                break;        
            case SND_SOC_DAPM_STREAM_STOP:     
                w->active = 0;
                break;        
            case SND_SOC_DAPM_STREAM_SUSPEND:
            case SND_SOC_DAPM_STREAM_RESUME:
            case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
            case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
                break;        
            }
        }
    }

    dapm_power_widgets(dapm, event);                                                                                                                                                        
}


늦은시간까지 신경써 주셔서 감사합니다.

주말 잘 보내세요!

쾌도난마

2014.04.05 09:48:00
*.99.60.84

ALSA SoC 프레임웍 소스는 이왕이면 건드리지 않으시는게... 좋은 것 같네요..;;


다시 처음으로 돌아가서 한번 확인해 보세요.

11    BOOL    1    Mic1 Bias                                On

12    INT    1    Mic1 Capture Volume                      25

15    INT    1    Mic 1 Boost Volume                       1

19    BOOL    1    Right Capture Mix Mic1 Capture Switch    On

26    BOOL    1    Left Capture Mix Mic1 Capture Switch     On

위 상태에서


1. tinycap 을 통해 녹음 시도 ( -> 당연 녹음 안됨 )

2. 이때 0x3a , 15bit on 시켜서 녹음 되는지 체크.


위에 1,2번이 아니면 다시 찾으셔야 될 것 같은데요?


아시겠지만

/d/asoc/YourSoundCardName"/"Codec device Name"/ 

어딘가에서 codec reg를 직접 제어 할 수 있습니다.



List of Articles
번호 제목 글쓴이 날짜 조회 수sort
» 안드로이드 마이크 입력이 끊어집니다. [25] GloomyDay 2014-04-03 2976
6187 [ODROID] MediaPlayer RTSP 테스트 중입니다. [1] 규야 2010-03-12 2968
6186 SDRAM 설계변경 [2] 조정근 2008-09-19 2960
6185 Android 단말에서 Rndis Host Driver를 사용할 수 있나요? acedon 2013-05-10 2946
6184 Android nand에 포팅시 kernel panic에 대한 질문입니다. [3] 최종환 2009-03-21 2942
6183 S3C2440 보드에 삼성 CCD 카메라 포팅 질문입니다..[완료] [11] 김창연 2006-09-27 2940
6182 6410 jffs2 사용시 erase block의 의미가 무엇인지요? [3] 윤인성 2009-03-04 2939
6181 [arndale][origen] 커널 2.6이 돌아가는 리눅스 [3] monad 2013-05-02 2931
6180 LX800에 사용할만한 3.5인치 LCD가 [5] 황민순 2008-09-17 2922
6179 S3C6410의 USB 2.0 OTG 질문입니다. [4] 여정휘 2009-02-14 2913
6178 ODROID-T의 App. Heap Memory 부족 문제. [6] 최가이버 2010-07-07 2911
6177 핼프미 VGA칩 TDA8771질문좀 부디 [2] 노상혁 2007-10-31 2905
6176 [완료] xp설치중 usb 주변기기사용불가한가요? [5] 황철진 2007-05-11 2905
6175 [질문]AESOP-LX800 용 네비게이션 선택? [2] 윤덕배 2007-05-25 2902
6174 [u-boot] 1.1.6 에서의 NAND 부트 관련 [2] 황인용 2009-04-11 2899
6173 S3C6410 MLC NAND 질문입니다. [3] 우한규 2009-05-27 2894
6172 [완료] USB DMB 모듈 추천좀 해주세요 [2] 한영민 2007-05-11 2891
6171 7인치 LCD 관련 문의 및 도움 요청 [3] 차준호 2008-05-22 2886
6170 mknod 메이저 마이너 번호에 대해서 궁금한게 있는데요 [1] biokk 2014-02-17 2881
6169 [질문] LAN카드와 해상도 질문드립니다. [2] 김증일 2007-05-09 2880

사용자 로그인