LINUX.ORG.RU
ФорумJob

разработать, форкнуть драйвер под Linux

 


0

2

Добрый день! Кто напишет за вознаграждение драйвер под Linux?

Задача такая есть контроллер https://wirenboard.com/ru/product/wiren-board-7/

есть периферийное оборудование на контроллерах 2000-х годов

связь по протоколу 1Wire, необходимо увеличить время битового опроса с 80 мкс до 140 мкс, тк перифирия не успевает ответить задали вопрос производителю, предложил такое решение, Самым простым решением я вижу вам написать отдельный драйвер, не в ядро а работающий из пользовательского окружения. То есть именно как отдельный процесс. То есть форкнуть Debian – Подробная информация о пакете owfs-fuse в bookworm - и поменять в нем требуемые таймауты.

https://packages.debian.org/ru/bookworm/owfs-fuse

кто готов взяться пишите ngolovanov@ntces.ru работа срочная

Перемещено Dimez из general



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

у wirenboard 1Wire через w1_gpio работает:

https://wirenboard.com/wiki/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_GPIO#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D0%B8%D0%B7_userspace

owfs-fuse это файловая система 1wire устройств, работает через внешние драйверы:

https://www.owfs.org/index_php_page_bus-masters.html

Чем поможет owfs-fuse, если все таймауты w1_gpio в модуле ядра?

https://github.com/torvalds/linux/blob/master/drivers/w1/w1_io.c

Ну и неплохо бы запятые нормально в ТЗ расставить

zudwa
()

Если @zudwa скинул ссылку именно на тот модуль

https://github.com/torvalds/linux/blob/master/drivers/w1/w1_io.c

то там есть возможность через параметры модуля задать коэффициент для задержек.

static int w1_delay_parm = 1;  
module_param_named(delay_coef, w1_delay_parm, int, 0);

static void w1_delay(unsigned long tm)
{
   udelay(tm * w1_delay_parm);
}

Если повезёт, то можно обойтись малой кровью и ничего форкать не надо.

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

Не совсем, задержки действительно определяются в w1_io.c, но сделаны в виде констант в коде, например чтение бита


/**
 * w1_read_bit() - Generates a write-1 cycle and samples the level.
 * @dev:	the master device
 *
 * Only call if dev->bus_master->touch_bit is NULL
 */
static u8 w1_read_bit(struct w1_master *dev)
{
	int result;
	unsigned long flags = 0;

	/* sample timing is critical here */
	local_irq_save(flags);
	dev->bus_master->write_bit(dev->bus_master->data, 0);
	w1_delay(6);
	dev->bus_master->write_bit(dev->bus_master->data, 1);
	w1_delay(9);

	result = dev->bus_master->read_bit(dev->bus_master->data);
	local_irq_restore(flags);

	w1_delay(55);

	return result & 0x1;
}

Проблема там не в работе мастер-устройства, а в том, что по неизвестной причине slave отвечает с нестандартной задержкой. А такого быть не должно, как понимаешь. Я за задачу не взялся без возможности сидеть рядом с устройствами, осциллографом, потому что на самом деле неизвестно, поможет ли увеличение времени битового опроса.

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

w1_delay(6);

Я же привёл текст этой функции. Там идёт умножение на коэффициент, который задаётся снаружи. Можно в два раза все задержки увеличить.

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

Да, но (вроде как) надо не все задержки увеличивать, а только одну.

aiqu6Ait ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.