ALSA / ASoC : 장치 / 드라이버를 올바르게로드하는 방법?


10

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      -       -       -

ASoC 문서를 읽고 alsa-devel목록 을 요청해야 합니다 (2.6.39는 엄청나게 오래되었고 보드 공급 업체가 지원을 담당하고 있음을 알려줍니다).
CL.

@CL. 고마워, 보드 공급 업체는 LPCLinux와 UDA1380 코덱을 지원하지 않습니다 (이미 연락했습니다) . 그래서 직접 해킹하려고합니다.
dext0rb

나는 게시 alsa-devel하고 아무도 대답하지 않았다. (내가 알 수있는 것은 메일 목록이 싫어서 읽는 것이 최악이다.) 이제 내 우편함은 ALSA 쓰레기로 가득 차 있으며 여전히 도움이 없다. 여기에 나는 다시 혼자 간다.
dext0rb

답변:


3

플랫폼 장치를 정의하는 보드 파일을 편집해야합니다. 나는 수정해야했다 arch/arm/mach-lpc32xx/ea3250.c:

이거 추가 해봐:

/*
 * Platform Data for UDA1380 Audiocodec.
 * As there are no GPIOs for codec power & reset pins,
 * dummy GPIO numbers are used.
 */
static struct uda1380_platform_data uda1380_info = {
    .gpio_power = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,10),
    .gpio_reset = LPC32XX_GPIO(LPC32XX_GPO_P3_GRP,2),
    .dac_clk    = UDA1380_DAC_CLK_WSPLL,
};

코덱을 포함하도록 이것을 편집하십시오.

static struct i2c_board_info __initdata ea3250_i2c_board_info [] = {
        {   I2C_BOARD_INFO("uda1380", 0x1a),
            .platform_data = &uda1380_info,
        }, 
#if defined (CONFIG_LEDS_PCA9532)
        {
            I2C_BOARD_INFO("pca9532", I2C_PCA9532_ADDR),
            .platform_data = &ea3250_leds,
        },
#endif
#if defined (CONFIG_FB_ARMCLCD)
        {
            /* 8Kb Configuration EEPROM on display board */
            I2C_BOARD_INFO("ea_i2c_disp_cfg", LCDB_CONFIG_EEPROM_I2C_ADDR),
        },
        {
            I2C_BOARD_INFO("ea_i2c_video", LCDB_PCA9532_I2C_ADDR),
        },
#endif
#if defined (CONFIG_EEPROM_AT24)
        {
            I2C_BOARD_INFO("24c256", I2C_24LC256_ADDR),
        },
#endif
    };
#endif

이제 모든 장치가 있습니다.

# cat cards
 0 [LPC32XX        ]:  - LPC32XX
                      LPC32XX
# cat devices
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0]   : control
 33:        : timer

# cat pcm
00-00: UDA1380 Duplex uda1380-hifi-0 :  : playback 1 : capture 1

내가 얻을 수 aplay아직 불구하고 아무것도 감지 할 수 있지만, 아마도 그것은 다른 문제입니다.

편집 : 예, 그것은 다른 문제였습니다. 표시되는 장치 앞의 cat devices숫자는 / dev / snd 장치 항목의 부 장치 번호와 일치해야합니다. ALSA 끝에서는 모든 것이 좋아 보이지만 LPC3250에서 나오는 I2S 데이터는 없습니다 ...

EDIT2 : 해결 된 해결 된 해결. I2S 데이터 / 클럭이없는 경우 출력 mux 레지스터가 출력 핀을 I2S 주변 장치에 연결하도록 올바르게 구성되어 있는지 확인하십시오 !!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.