LINUX.ORG.RU

Device tree. строка compatible=«***»; ведет себя странно

 


0

1

Добрый день! Подскажите пожалуйста кто знает. Работаю с модулем beaglebone black, debian (kernel 3.8). Недавно запустил на нем ethernet микросхему wiznet w5300. Изначально была проблема в том, что драйвер не начинал даже запускаться. В device tree была прописана строка compatible = «wiznet,w5300»;, однако в логах ядра быбло четко видно что gpmc на котором висит данная микросхема успешно запущен, а вот драйвер даже не начинает загрузку. (Что бы убедиться в этом перекомпилировал ядро добавив в драйвер w5300 в начало функции probe prink(«Текст»);. Данная проблема была решена путем изменения в драйвере w5300 следующих строк

Было:

static SIMPLE_DEV_PM_OPS(w5300_pm_ops, w5300_suspend, w5300_resume);


static struct platform_driver w5300_driver = {
	.driver		= {
		.name	= DRV_NAME,
		.owner	= THIS_MODULE,
		.pm	= &w5300_pm_ops,
	},
	.probe		= w5300_probe,
	.remove		= w5300_remove,
};

module_platform_driver(w5300_driver);

Стало

static SIMPLE_DEV_PM_OPS(w5300_pm_ops, w5300_suspend, w5300_resume);

static const struct of_device_id w5300_dt_ids[] = {
	{ .compatible = "wiznet,w5300" },
	{ .compatible = "w5300" },
	{  }
};

MODULE_DEVICE_TABLE (of, w5300_dt_ids);

static struct platform_driver w5300_driver = {
	.driver		= {
		.name	= DRV_NAME,
		.owner	= THIS_MODULE,
		.pm	= &w5300_pm_ops,
		.of_match_table	= w5300_dt_ids,
	},
	.probe		= w5300_probe,
	.remove		= w5300_remove,
};

module_platform_driver(w5300_driver);

В итоге после ещё некоторых извращений удалось таки успешно запустить микросхему. После чего встала задача аналогичным образом запустить микросхему w5100, которая отличается тем, что висит на spi а не на параллельной шине. Однако, драйвер микросхемы не запускается, и аналогичное изменение драйвера не помогло. В device tree считаю что принципиальных ошибок, из за которых может не грузиться драйвер нет, так как стоит заменить в copmatible w5100 на другую микросхему, как в части случаев все работает, в части нет. Кто знает, из-за чего можетне запускаться драйвер, прописанный в compatible?

ну, в деревцах вообще не копаюсь,

но как бздени поклонник, могу набросать пару советов НМВ важных, итак: первое, попробывать тупо поменять местами эти дела, нечай не математика, и тут от перемены мест, всё в зависимости. второе, а конструкция типа <***>- не очень опастна?? Так, по опыту в поисковиках, это «семафор», и ещё тот. Ну, вроде энд оф трэнслейшн..

anonymous
()

Надо смотреть, почему драйвер не загружается. Если не находит устройства - вероятно, проблема в dts.

Никогда не видел wildcard в dts.

tailgunner ★★★★★
()
Ответ на: ну, в деревцах вообще не копаюсь, от anonymous

Спасибо за ответ! Эта запись (<***>) означала что вместо звездочек какой то конкретный драйвер, в данном случае либо w5100 либо w5300, звездочки конечно в дерево не пишу.

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

Так если не находит устройство, он обычно загружает драйвер и уже из него пытается считать ID, выдает ошибку что устройство не найдено, и в логах это можно отследить. А если он даже не запускает драйвер - тут что то другое скорее всего. Ставлю на место compatible = «wiznet,w5300» compatible = «ks8851» - он так и пишет прямо из драйвера - не могу считать ID устройства.

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

Так если не находит устройство, он обычно загружает драйвер и уже из него пытается считать ID

Не знаю, кто такой «он», но про считывание ID из OF-драйвера слышу впервые. Драйвер при загрузке ищет устройства, для которых предназначен, по значению compatible. Если не находит - обычно пишет в лог и сообщает ядру об ошибке.

он так и пишет прямо из драйвера - не могу считать ID устройства.

Вот именно «не могу считать»?

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

Вот именно, драйвер как минимум должен попытаться найти устройство и записать в лог об успехе\ошибке. Например в драйвере ks8851 присутсвуют такие строки

/* simple check for a valid chip being connected to the bus */
	cider = ks8851_rdreg16(ks, KS_CIDER);
	if ((cider & ~CIDER_REV_MASK) != CIDER_ID) {
		dev_err(&spi->dev, "failed to read device ID\n");
		ret = -ENODEV;
		goto err_id;
	}
И при отсутсвии устройства в логи выводится строка «failed to read device ID».

По этой строке можем четко определить в чем проблема - драйвер не может считать ID, в данном случае по причине отсутствия устройства.

Драйвер же w5100, который мне нужен, не подает вообще никаких признаков жизни, не выводит в логи ни одной строки, даже если в функцию probe первым делом поставить вывод строки в логи ядра. Делаю вывод что скорее всего драйвер даже не вызывается.

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

Например в драйвере ks8851 присутсвуют такие строки

Это чтение идентификатора с настоящего устройства, выполняется (если у устройства есть такой ID) после проверки на совпадение compatible.

не выводит в логи ни одной строки, даже если в функцию probe первым делом поставить вывод строки в логи ядра.

Попробуй ставить печать не в probe, а в driver_init или как там она называется у w5100.

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

Это чтение идентификатора с настоящего устройства, выполняется (если у устройства есть такой ID) после проверки на совпадение compatible.

Это фрагмент из функции ks8851_probe. Вокруг него поставил несколько printk,все выполняется по порядку, как и должно быть.

Попробуй ставить печать не в probe, а в driver_init или как там она называется у w5100

Ничего наподобии driver_init в драйвере не обнаружил. В драйвере на ks8851 есть ещё нечто подобное :

static void __exit ks8851_exit(void)
{
	spi_unregister_driver(&ks8851_driver);
}

module_init(ks8851_init);

А в драйвере w5100

static SIMPLE_DEV_PM_OPS(w5100_pm_ops, w5100_suspend, w5100_resume);

static const struct of_device_id w5100_dt_ids[] = {
	{ .compatible = "wiznet,w5100" },
	{ .compatible = "w5100" },
	{  }
};

MODULE_DEVICE_TABLE (of, w5100_dt_ids);

static struct platform_driver w5100_driver = {
	.driver		= {
		.name	= DRV_NAME,
		.owner	= THIS_MODULE,
		.pm	= &w5100_pm_ops,
		.of_match_table	= w5100_dt_ids,
	},
	.probe		= w5100_probe,
	.remove		= w5100_remove,
};

module_platform_driver(w5100_driver);

И стандартные функции типа probe, probe_hw и тд

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

Похоже, в этом случае само ядро матчит идентификаторы из w5100_dt_ids. Можно попробовать подставить туда ровно то же, что стоит в dts-файле, чтобы процедура probe хотя бы вызвалась.

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

Похоже, в этом случае само ядро матчит идентификаторы из w5100_dt_ids. Можно попробовать подставить туда ровно то же, что стоит в dts-файле, чтобы процедура probe хотя бы вызвалась.

Подскажи пожалуйста, где находится функция в ядра, которая за это отвечает? Куда туда подставить?

static const struct of_device_id w5100_dt_ids[] = {
	{ .compatible = "wiznet,w5100" },
	{ .compatible = "w5100" },
	{  }
};

MODULE_DEVICE_TABLE (of, w5100_dt_ids);

и

.of_match_table	= w5100_dt_ids,

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

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

Похоже, в этом случае само ядро матчит идентификаторы из w5100_dt_ids. Можно попробовать подставить туда ровно то же, что стоит в dts-файле, чтобы процедура probe хотя бы вызвалась.

Подскажи пожалуйста, где находится функция в ядра, которая за это отвечает? Куда туда подставить?

static const struct of_device_id w5100_dt_ids[] = {
	{ .compatible = "wiznet,w5100" },
	{ .compatible = "w5100" },
	{  }
};

MODULE_DEVICE_TABLE (of, w5100_dt_ids);

и

.of_match_table	= w5100_dt_ids,

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

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

Куда туда подставить?

Я имел в виду w5100_dt_ids

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

Но теперь уже не знаю %)

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