ALSA / ASoC: Làm cách nào để tải chính xác thiết bị / trình điều khiển?


10

Tôi đang sử dụng Buildroot để xây dựng một hệ thống nhúng Linux (2.6.39.2) cho vi điều khiển NXP LPC3250.

Ngay bây giờ, tôi đang cố gắng để ALSA / ASoC hoạt động, nhưng tôi gặp một số vấn đề với việc làm cho các mô-đun hoạt động cùng nhau. (Tôi nghĩ!)

Một số nền tảng quan trọng:

Bảng tôi đang thử nghiệm là bảng phát triển Embedded Artists 3250 V2 . V2 khác với V1 ở chỗ nó không có màn hình LCD, nhưng bao gồm codec âm thanh I2S: NXP UDA1380. Hỗ trợ bảng cho EA3250 V1 được bao gồm trong phiên bản LPCLinux của kernel. Ngoài ra còn có một bảng phát triển khác, được gọi là Phytec 3250 , chứa cùng chip codec UDA1380. Bản phân phối LPCLinux cũng có hỗ trợ cho bảng Phytec, cùng với chip codec âm thanh. Từ những gì tôi đã nhận thấy, bảng Phytec 3250 có codec UDA1380 trên địa chỉ I2C 0x18 . Trên bảng EA3250 V2 của tôi, codec âm thanh được đặt tại địa chỉ I2C 0x1a .(Tôi đã xác minh chip được cấp nguồn và tôi có thể giao tiếp với nó bằng cách sử dụng gói công cụ I2C. Nó đáp ứng với i2cdetect và tôi có thể đọc các thanh ghi từ chip bằng i2cget.)

Sửa đổi nguồn:

Tôi cần chỉnh sửa các tệp trình điều khiển Phytec 3250 để thay đổi địa chỉ của chip codec. Tôi đã chỉnh sửa phần này của 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,
          },
  };

Sau khi tôi thực hiện thay đổi này, tôi đã tiếp tục và xây dựng hệ thống một lần nữa và mọi thứ được biên dịch OK. Sau khi khởi động vào hệ thống, tôi có các mô-đun sau (ngoài các mô-đun lõi tiêu chuẩn) trong /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

Bây giờ, làm thế nào để tôi thực sự liên kết tất cả những thứ này lại với nhau?

Chỉ cần chèn các mô-đun modprobemà không thực sự cung cấp thiết bị cho ALSA / ASoC. Tôi không thể phát hiện soundcard. Điều này có nghĩa là bây giờ tôi phải tạo một thiết bị mới được gọi uda1380-codectại địa chỉ 0x1a và liên kết nó với trình điều khiển? Tôi đã thử làm như sau:
echo uda1380-codec 0x01a > /sys/bus/i2c/devices/i2c-0/new_device
và nhận được:
i2c i2c-0: new_device: Instantiated device uda1380-codec at 0x1a
Sau đó, tôi cố gắng ràng buộc trình điều khiển với thiết bị:
echo 0x1a > /sys/bus/i2c/drivers/uda1380-codec/bind
và nhận được:
sh: write error: No such device

Tôi nhận được lỗi này cho mọi thứ tôi thử! Tôi có cảm giác tôi không tạo ra thiết bị một cách chính xác, và sau đó tôi không chắc làm thế nào để liên kết nó với trình điều khiển chính xác.

Ghi chú:

Tôi đã chơi với điều này tối qua và bằng cách nào đó có thể khiến ASoC thức dậy và ít nhất là thăm dò thẻ. Tôi đã chơi với các ràng buộc khác nhau, tôi đoán. Thật là muộn và khó nhớ các bước của tôi, nhưng ít nhất tôi đã có thể gặp phải lỗi sau:

uda1380-codec 0-001a: asoc: failed to probe CODEC uda1380-codec.0-001a: -22
asoc: failed to instantiate card LPC32XX: -22

Tôi đã không thể tạo lại lỗi này!

Biên tập:

Tôi đã xác nhận mã sửa đổi của mình đang được biên dịch, vì vậy trình điều khiển nên nói chuyện với địa chỉ chính xác ngay bây giờ. Sau khi tải thủ công các mô-đun, đầu ra của lsmodlà:

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

Điều này có đúng không?

Và bảng thiết bị của tôi:

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

Bạn nên đọc tài liệu ASoC, sau đó hỏi trong alsa-develdanh sách (nơi bạn sẽ được thông báo rằng 2.6,39 đã lỗi thời khủng khiếp và nhà cung cấp hội đồng quản trị có trách nhiệm hỗ trợ).
CL.

@CL. Cảm ơn, nhà cung cấp bảng mạch không hỗ trợ codec UDA1380 với LPCLinux (tôi đã liên hệ với họ) , đó là lý do tại sao tôi đang cố gắng tự hack nó.
dext0rb

Tôi đăng lên alsa-develvà không ai trả lời. (Điều đó tôi có thể nói - Tôi ghét danh sách thư, chúng là thứ tồi tệ nhất để đọc qua.) Bây giờ hộp thư của tôi chứa đầy ALSA tào lao và tôi vẫn không có sự giúp đỡ. Tôi lại đi, một mình ...
dext0rb

Câu trả lời:


3

Cần chỉnh sửa tập tin của hội đồng xác định các thiết bị nền tảng. Tôi cần sửa đổi arch/arm/mach-lpc32xx/ea3250.c:

Thêm điều này:

/*
 * 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,
};

Chỉnh sửa phần này để bao gồm codec:

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

Bây giờ tôi có tất cả các thiết bị:

# 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

Tôi không thể aplayphát hiện bất cứ điều gì mặc dù, nhưng có lẽ đó là một vấn đề khác.

EDIT: Vâng, đó là một vấn đề khác. Số ở phía trước các thiết bị được hiển thị cat devicesphải khớp với số thiết bị nhỏ trong các mục thiết bị / dev / snd của bạn. Mọi thứ có vẻ tốt trên ALSA kết thúc ngay bây giờ, nhưng tôi không có dữ liệu I2S đến từ LPC3250 ...

EDIT2: GIẢI QUYẾT ĐƯỢC GIẢI QUYẾT. Nếu bạn không có dữ liệu / đồng hồ I2S, hãy đảm bảo rằng thanh ghi mux đầu ra được cấu hình đúng để kết nối các chân đầu ra với thiết bị ngoại vi I2S !!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.