Buildroot를 사용하여 NXP LPC3250 마이크로 컨트롤러 용 임베디드 Linux (2.6.39.2) 시스템을 빌드하고 있습니다.
현재 ALSA / ASoC를 시작하고 실행하려고하지만 모듈을 함께 작동시키는 데 문제가 있습니다. (생각합니다!)
몇 가지 중요한 배경 :
테스트 중인 보드 는 Embedded Artists 3250 V2 개발 보드 입니다. V2는 LCD 화면이 없지만 I2S 오디오 코덱 인 NXP UDA1380을 포함 한다는 점에서 V1과 다릅니다. EA3250 V1에 대한 보드 지원 은 LPCLinux 버전의 커널에 포함되어 있습니다. 동일한 UDA1380 코덱 칩을 포함하는 Phytec 3250 이라는 다른 개발 보드도 있습니다. LPCLinux 배포판은 오디오 코덱 칩과 함께 Phytec 보드도 지원합니다. 내가 아는 바에 따르면 Phytec 3250 보드에는 I2C 주소 0x18 에 UDA1380 코덱이 있습니다. EA3250 V2 보드에서 오디오 코덱은 I2C 주소 0x1a에 있습니다.(칩의 전원이 켜졌 음을 확인했으며 I2C-tools 패키지를 사용하여 통신 할 수 있습니다. i2cdetect에 응답하고 i2cget을 사용하여 칩에서 레지스터를 올바르게 읽을 수 있습니다.)
소스 수정 :
코덱 칩의 주소를 변경하기 위해 Phytec 3250 드라이버 파일을 편집해야했습니다. lpc3xxx-uda1380.c 의이 섹션을 편집했습니다 .
static struct snd_soc_dai_link phy3250_uda1380_dai[] = {
{
.name = "uda1380",
.stream_name = "UDA1380 Duplex",
#if defined(CONFIG_SND_LPC32XX_USEI2S1)
.cpu_dai_name = "lpc3xxx-i2s1",
#else
.cpu_dai_name = "lpc3xxx-i2s0",
#endif
.codec_dai_name = "uda1380-hifi",
.init = phy3250_uda1380_init,
.platform_name = "lpc3xxx-audio.0",
//EDIT// .codec_name = "uda1380-codec.0-0018", //EDIT//
.codec_name = "uda1380-codec.0-001a",
.ops = &phy3250_uda1380_ops,
},
};
이 변경을 한 후에 시스템을 다시 구축하고 모든 것이 정상적으로 컴파일되었습니다. 시스템으로 부팅 한 후 표준 코어 모듈 외에도 다음과 같은 모듈이 있습니다 /lib/modules/2.6.39.2/kernel/sound
.
./soc/codecs: snd-soc-uda1380.ko <-- ASoC codec driver
./soc/lpc3xxx: snd-soc-lpc3xxx-i2s.ko <-- ASoC DAI
snd-soc-lpc3xxx-uda1380.ko <-- ASoC machine driver
snd-soc-lpc3xxx.ko <-- ASoC platform driver
이제이 모든 것들을 실제로 어떻게 묶을까요?
모듈을 삽입하는 것만으로 modprobe
는 실제로 장치를 ALSA / ASoC에 제공하지 않습니다. 사운드 카드를 감지 할 수 없습니다. 이것은 이제 uda1380-codec
주소 0x1a 에서 새 장치 를 만들어 드라이버에 바인딩 해야한다는 것을 의미합니까 ? 나는 다음과 같은 일을 시도했다 :
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
수신 :
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
그런 다음 드라이버를 장치에 바인딩하려고 시도
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
하고 수신 :
sh: write error: No such device
내가 시도하는 모든 것에 대해이 오류가 발생합니다! 장치를 올바르게 만들지 못한다는 느낌이 들며 올바른 드라이버에 장치를 바인딩하는 방법을 잘 모르겠습니다.
노 타벤 :
나는 지난 밤에 이것을 가지고 놀았고 어떻게 든 ASoC를 깨우고 적어도 카드를 조사 할 수있었습니다. 나는 다른 바인딩으로 놀고있었습니다. 내 단계를 기억하는 것이 늦었고 어려웠지만 적어도 다음과 같은 오류가 발생할 수있었습니다.
uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22
이 오류를 다시 만들 수 없습니다!
편집하다:
수정 된 코드가 컴파일되고 있음을 확인 했으므로 이제 드라이버가 올바른 주소와 통신해야합니다. 모듈을 수동으로로드 한 후 출력 lsmod
은 다음과 같습니다.
Module Size Used by Not tainted
snd_soc_lpc3xxx_uda1380 2087 0
snd_soc_lpc3xxx 3089 0
snd_soc_lpc3xxx_i2s 4089 1
snd_soc_uda1380 10865 0
snd_soc_core 51549 4 snd_soc_lpc3xxx_uda1380,snd_soc_lpc3xxx,snd_soc_lpc3xxx_i2s,snd_soc_uda1380
snd_pcm 52098 2 snd_soc_lpc3xxx,snd_soc_core
snd_timer 15590 1 snd_pcm
snd_page_alloc 3021 1 snd_pcm
snd 37286 3 snd_soc_core,snd_pcm,snd_timer
이것이 올바르게 보입니까?
그리고 내 장치 테이블 :
# Audio stuff
/dev/audio c 666 0 29 14 4 - - -
#/dev/audio1 c 666 0 29 14 20 - - -
/dev/dsp c 666 0 29 14 3 - - -
#/dev/dsp1 c 666 0 29 14 19 - - -
#/dev/sndstat c 666 0 29 14 6 - - -
/dev/mixer c 666 0 29 14 0 - - -
/dev/snd d 755 0 29 - - - - -
/dev/snd/controlC0 c 666 0 29 116 0 - - -
/dev/snd/pcmC0D0c c 666 0 29 116 24 - - -
/dev/snd/pcmC0D0p c 666 0 29 116 16 - - -
/dev/snd/seq c 666 0 29 116 1 - - -
/dev/snd/timer c 666 0 29 116 33 - - -
alsa-devel
하고 아무도 대답하지 않았다. (내가 알 수있는 것은 메일 목록이 싫어서 읽는 것이 최악이다.) 이제 내 우편함은 ALSA 쓰레기로 가득 차 있으며 여전히 도움이 없다. 여기에 나는 다시 혼자 간다.
alsa-devel
목록 을 요청해야 합니다 (2.6.39는 엄청나게 오래되었고 보드 공급 업체가 지원을 담당하고 있음을 알려줍니다).