LINUX.ORG.RU

Audio в mini2440


0

1

В новых ядрах почему-то не работает звук в девките http://www.friendlyarm.net/products/mini2440?lang=en

Попытался разобраться сам но что-то не выходит.

static struct platform_driver s3c24xx_uda134x_driver = {
	.probe  = s3c24xx_uda134x_probe,
	.remove = s3c24xx_uda134x_remove,
	.driver = {
		.name = "s3c24xx_uda134x",
		.owner = THIS_MODULE,
	},
};

static int __init s3c24xx_uda134x_init(void)
{
	return platform_driver_register(&s3c24xx_uda134x_driver);
}
Тут все ок s3c24xx_uda134x_probe вызывается. Птому собственно доходит до snd_soc_instantiate_card(который в linux-2.6\sound\soс\soc-core.c) А вот в нем доходит до сюда
for (i = 0; i < card->num_links; i++)
		soc_bind_dai_link(card, i);
//soc_bind_dai_link
....
find_platform:
	/* do we already have the CODEC DAI for this link ? */
	if (rtd->platform) {
		goto out;
	}
	/* no, then find CPU DAI from registered DAIs*/
	list_for_each_entry(platform, &platform_list, list) {
		if (!strcmp(platform->name, dai_link->platform_name)) {
			rtd->platform = platform;
			goto out;
		}
	}
...
А вот и проблема. platform_list пуст. начал искать как заполняется. нашел файл linux-2.6\sound\soc\samsung\dma.c там
.....
static int __devinit samsung_asoc_platform_probe(struct platform_device *pdev)
{
//В эту функцию уже незаходит.
	return snd_soc_register_platform(&pdev->dev, &samsung_asoc_platform);
}

static int __devexit samsung_asoc_platform_remove(struct platform_device *pdev)
{
	snd_soc_unregister_platform(&pdev->dev);
	return 0;
}

static struct platform_driver asoc_dma_driver = {
	.driver = {
		.name = "samsung-audio",
		.owner = THIS_MODULE,
	},

	.probe = samsung_asoc_platform_probe,
	.remove = __devexit_p(samsung_asoc_platform_remove),
};

static int __init samsung_asoc_init(void)
{
//А вот эта выполняется
	return platform_driver_register(&asoc_dma_driver);
}
module_init(samsung_asoc_init);
....
Куда мне копать?

ЗЫ dai_link->platform_name = samsung-audio проверил. Тоесть надо добиться правильного заполнения platform_list но он вобще нехочет заполнтся(



Последнее исправление: a1ien_n3t (всего исправлений: 1)

Ответ на: комментарий от VladimirMalyk

Ядро в нанде. rootf через NFS(пока впадлу заливать)

a1ien_n3t
() автор топика

uda1341 ? Ух, знакомый чип! (у меня такой в древнючем ipaq 3600 - пытался когда-то прикрутить сей кодек к SA1100 процессору, даже какие-то звуки удалось извлечь)

А какие точно версии рабочих и нерабочих ядер? (и ванильные они или вендорные - если второе, то откуда качнуть поглядеть?) Просто тут хлопцы, занимающиеся ASoC не так давно перелопачивали всю инфраструктуру, чтобы добавить поддержку нескольких кодеков в одном устройстве - не исключено, что во время этого дела и поломали...

mad_soft
()

Ага, кажется нашёл кое-что в текущем ядре (2.6.38-rc8). Можете проверить - вот с этим патчем работает?

--- a/sound/soc/samsung/s3c24xx_uda134x.c
+++ b/sound/soc/samsung/s3c24xx_uda134x.c
@@ -226,7 +226,7 @@ static struct snd_soc_ops s3c24xx_uda134x_ops = {
 static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = {
        .name = "UDA134X",
        .stream_name = "UDA134X",
-       .codec_name = "uda134x-hifi",
+       .codec_name = "uda134x-codec",
        .codec_dai_name = "uda134x-hifi",
        .cpu_dai_name = "s3c24xx-iis",
        .ops = &s3c24xx_uda134x_ops,
mad_soft
()
Ответ на: комментарий от mad_soft

О нашелся человек который хоть как-то может помочь )) Нет этот код проблемму не решает. Уже нашел проблемму и почти удалось все завести. Вот такой патчик в итогее получили.

 arch/arm/mach-s3c2440/mach-mini2440.c |    7 +++++++
 sound/soc/codecs/uda134x.c            |    4 +++-
 sound/soc/samsung/s3c24xx_uda134x.c   |    3 ++-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c
index f62bb4c..7c3fb07 100644
--- a/arch/arm/mach-s3c2440/mach-mini2440.c
+++ b/arch/arm/mach-s3c2440/mach-mini2440.c
@@ -506,6 +506,11 @@ static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
 	},
 };
 
+static struct platform_device uda1340_codec = {
+		.name = "uda134x-codec",
+		.id = -1,
+};
+
 static struct platform_device *mini2440_devices[] __initdata = {
 	&s3c_device_ohci,
 	&s3c_device_wdt,
@@ -521,7 +526,9 @@ static struct platform_device *mini2440_devices[] __initdata = {
 	&s3c_device_nand,
 	&s3c_device_sdi,
 	&s3c_device_iis,
+	&uda1340_codec,
 	&mini2440_audio,
+	&samsung_asoc_dma,
 };
 
 static void __init mini2440_map_io(void)
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c
index e76847a..ea1c59d 100644
--- a/sound/soc/codecs/uda134x.c
+++ b/sound/soc/codecs/uda134x.c
@@ -486,7 +486,8 @@ static struct snd_soc_dai_driver uda134x_dai = {
 static int uda134x_soc_probe(struct snd_soc_codec *codec)
 {
 	struct uda134x_priv *uda134x;
-	struct uda134x_platform_data *pd = dev_get_drvdata(codec->card->dev);
+	struct uda134x_platform_data *pd = codec->card->dev->platform_data;
+
 	int ret;
 
 	printk(KERN_INFO "UDA134X SoC Audio Codec\n");
@@ -606,6 +607,7 @@ static struct snd_soc_codec_driver soc_codec_dev_uda134x = {
 };
 
 static int __devinit uda134x_codec_probe(struct platform_device *pdev)
+
 {
 	return snd_soc_register_codec(&pdev->dev,
 			&soc_codec_dev_uda134x, &uda134x_dai, 1);
diff --git a/sound/soc/samsung/s3c24xx_uda134x.c b/sound/soc/samsung/s3c24xx_uda134x.c
index 2c09e93..86f1dc4 100644
--- a/sound/soc/samsung/s3c24xx_uda134x.c
+++ b/sound/soc/samsung/s3c24xx_uda134x.c
@@ -226,7 +226,7 @@ static struct snd_soc_ops s3c24xx_uda134x_ops = {
 static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = {
 	.name = "UDA134X",
 	.stream_name = "UDA134X",
-	.codec_name = "uda134x-hifi",
+	.codec_name = "uda134x-codec",
 	.codec_dai_name = "uda134x-hifi",
 	.cpu_dai_name = "s3c24xx-iis",
 	.ops = &s3c24xx_uda134x_ops,
@@ -321,6 +321,7 @@ static int s3c24xx_uda134x_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(s3c24xx_uda134x_snd_device,
 			     &snd_soc_s3c24xx_uda134x);
+	platform_device_add_data(s3c24xx_uda134x_snd_device, &s3c24xx_uda134x, sizeof(s3c24xx_uda134x));
 	ret = platform_device_add(s3c24xx_uda134x_snd_device);
 	if (ret) {
 		printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: Unable to add\n");
-- 
1.7.1
НО!!! Звука в Qtopia нету. в /dev появляется /dev/dsp и /dev/audio Во время загрузки ядра появляется вот такие строчки
UDA134X SoC Audio Codec
asoc: uda134x-hifi <-> s3c24xx-iis mapping ok
ALSA device list:
  #0: S3C24XX_UDA134X
Но как я написал выше звука нет.

Точно рабочее ядро кторое лежит тут http://repo.or.cz/w/linux-2.6/mini2440.git/ это вендорное но там всего пару патчей(звук не трогался) версия 2.6.32 а вот новые 2.6.37.y и выше(а может и чуть более старые) не работают. (это уже чисто ванильные)

a1ien_n3t
() автор топика
Ответ на: комментарий от a1ien_n3t

там разница в цене весьма несущественна:
micro2440SDK + 3,5"LCD цена 1640 грн с НДС
tiny6410SDK + 4,3"LCD цена 1860 грн с НДС
но tiny6410 не устроил ибо на нем не разведен GPIO

теперь жду цену на mini6410. там камень более другого поколения, памяти больше и ддр. есть видеовыход. ядра более свежие от вендора и проч.

VladimirMalyk ★★★★★
()
Ответ на: SOLVED от a1ien_n3t

> Все проблемма решена.

Ну тогда вперёд - слать патчи в мэйнстрим :) Ещё есть шансы успеть протолкнуть в 2.6.38. Только разделить придётся - sound/soc в один патч, arch/arm/mach-s3c2440 в другой. И слать соответствующим мэйнтейнерам. И да - вот этот hunk ненужен:

 static int __devinit uda134x_codec_probe(struct platform_device *pdev)
+
 {

> Добавляем в /sound/soc/codecs/uda134x.c #define POWER_OFF_ON_STANDBY 1

Вот это вообще очень подозрительно. Предлагаю попинать Лайма Гирдвуда и спросить чего он имел в виду этим #ifdef-ом, добавив его в f0fba2ad.

mad_soft
()
Ответ на: комментарий от a1ien_n3t

А, ну ладно тогда - главное чтоб изыскания не пропали зря :)

А грязный хак с #define POWER_OFF_ON_STANDBY 1 в ядро точно не примут - скорее примут патч убирающий #ifdef

mad_soft
()
Ответ на: комментарий от mad_soft

ну это понятно. поэтому его туда и не направили. А хак делл больше на проверку что оно хотябы работает. Щас наверно буду разбираться для чего точно нужен этот дефайн

a1ien_n3t
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.