ALSA / ASoC: उपकरणों / ड्राइवरों को सही ढंग से कैसे लोड करें?


10

मैं NXP LPC3250 माइक्रोकंट्रोलर के लिए एम्बेडेड लिनक्स (2.6.39.2) सिस्टम बनाने के लिए बिल्डरोट का उपयोग कर रहा हूं।

अभी, मैं ALSA / ASoC को चालू करने और चलाने की कोशिश कर रहा हूं, लेकिन मुझे कुछ मुद्दों पर एक साथ काम करने के लिए मॉड्यूल मिल रहे हैं। (मुझे लगता है!)

कुछ महत्वपूर्ण पृष्ठभूमि:

मैं जिस बोर्ड के साथ परीक्षण कर रहा हूं वह एंबेडेड कलाकार 3250 V2 विकास बोर्ड है । V2 V1 से अलग है जिसमें इसमें एलसीडी स्क्रीन नहीं है, लेकिन इसमें I2S ऑडियो कोडेक शामिल है: NXP UDA1380। EA3250 V1 के लिए बोर्ड का समर्थन कर्नेल के LPCLinux संस्करण में शामिल है । एक अलग विकास बोर्ड भी है, जिसे Phytec 3250 कहा जाता है , जिसमें समान UDA1380 कोडेक चिप होती है। LPCLinux वितरण में ऑडियो कोडेक चिप के साथ Phytec बोर्ड का भी समर्थन है। मैंने जो विचार किया है, उसमें से Phytec 3250 बोर्ड में I2C पते 0x18 पर UDA1380 कोडेक है । मेरे EA3250 V2 बोर्ड पर, ऑडियो कोडेक I2C पते 0x1a पर स्थित है ।(मैंने सत्यापित किया है कि चिप को संचालित किया गया है, और मैं इसे I2C- टूल पैकेज का उपयोग करके संवाद कर सकता हूं। यह 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 को नहीं देता है। मैं साउंडकार्ड का पता लगाने में असमर्थ हूं। क्या इसका मतलब है कि मुझे अब 0x1auda1380-codec पते पर एक नया उपकरण बनाना होगा और इसे एक ड्राइवर को बांधना होगा? मैंने निम्नलिखित करने की कोशिश की है: और प्राप्त किया है: तब मैं एक ड्राइवर को डिवाइस से बांधने की कोशिश करता हूं: और प्राप्त: मुझे यह कोशिश करने के लिए यह त्रुटि मिलती है! मुझे लग रहा है कि मैं डिवाइस को सही तरीके से नहीं बना रहा हूं, और फिर मुझे यकीन नहीं है कि इसे सही ड्राइवर से कैसे जोड़ा जाए।
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

नोटा नेने:

मैं कल रात इसके साथ खेल रहा था और किसी तरह जागने और कार्ड के लिए कम से कम जांच करने में सक्षम था। मैं अलग-अलग बाइंडिंग के साथ खेल रहा था, मुझे लगता है। मेरे चरणों को याद करना देर और कठिन था, लेकिन मैं कम से कम किसी तरह निम्नलिखित त्रुटि प्राप्त करने में सक्षम था:

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सूची पर पूछें (जहां आपको बताया जाएगा कि 2.6.39 बहुत पुरानी है, और यह कि बोर्ड विक्रेता समर्थन के लिए जिम्मेदार है)।
सीएल।

@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 डेटा / घड़ी नहीं है, तो सुनिश्चित करें कि आउटपुट पिन रजिस्टर I2S परिधीय से आउटपुट पिन को जोड़ने के लिए सही ढंग से कॉन्फ़िगर किया गया है !!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.