Mysteo 0 30 марта Опубликовано 30 марта · Жалоба Здравствуйте! Стокнулся с проблемой написания драйвера под данную АЦП через SPIDEV. Опыта программирования под линукс не имею, до этого всегда на микроконтроллерах работал. Проблема заключается в том , что АЦП требует после каждого опроса переводить бит линию CS в высокое состояние , а затем снова переводить в ноль. Работа через SPIDEV же не позволяет управлять линией CS, можно только выставить задержку этой линии в микросекундах. Железо уже готово, я бы между хостом и АЦП микроконтроллер воткнул, гораздо удобнее бы было и частоту семплирования выставлять и прочее. Можете посоветовать откуда можно позаимствовать похожий SPI драйвер (постараюсь переделать под свои нужды ) и чтобы частота дискретизации настраивалась, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 30 марта Опубликовано 30 марта · Жалоба struct spi_ioc_transfer { __u64 tx_buf; __u64 rx_buf; __u32 len; __u32 speed_hz; __u16 delay_usecs; __u8 bits_per_word; __u8 cs_change; __u32 pad; }; len делаете 1 bits_per_word 8 cs_change 0 И на каждую передачу будет подниматься CS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndrewSh 0 30 марта Опубликовано 30 марта · Жалоба 1. Посоветовать можно. Но у хоста должна быть минимум указана архитектура...... 2. И ADC наверное не ad7046 а ads7046... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 30 марта Опубликовано 30 марта · Жалоба Извините, в торопях тему писал. Да ADS7046 , а железо используется ARM9 F1C200s Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 30 марта Опубликовано 30 марта · Жалоба Вам надо еще определиться с тем, что у вас за SPI контроллер стоит. Найти в дереве устройств описание. Что за Линукс у вас? Линукс уже стоит на устройстве? Какие файлы в /boot/ директории? Примеры можно найти в коде ядра: https://elixir.bootlin.com/linux/latest/source/drivers/spi Инструкции там же: https://elixir.bootlin.com/linux/latest/source/Documentation/spi Вам с нуля все будет непонятно. Спрашивайте. Глобально выглядит так: Каждому устройству соответствует его описание в дереве устройств. Режимы работы, адреса регистров и т.д.. Если одинаковых устройств несколько, то каждому индивидуальное описание и регистры точно будут другими в этих описаниях одного и тогоже типа устройства. Еще есть драйвер, который для работы с этим устройством. Вам надо и драйвер и описание в дерево добавить. В описании и драйвере есть признак, по которому для каждого описания ищется драйвер. Если нашелся драйвер, то устройство может быть использовано. В директории /sys/ можно посмотреть. Там каждому драйверу и каждому описанию посвящена директория. Вот дерево для вашего процессора: https://elixir.bootlin.com/linux/latest/source/arch/arm/boot/dts/allwinner/suniv-f1c200s-lctech-pi.dts или https://elixir.bootlin.com/linux/latest/source/arch/arm/boot/dts/allwinner/suniv-f1c200s-popstick-v1.1.dts Найдите этот файл в вашем коде ядра. Там та же директория. Одно SPI устройство уже описано. &spi0 { pinctrl-names = "default"; pinctrl-0 = <&spi0_pc_pins>; status = "okay"; flash@0 { compatible = "spi-nand"; reg = <0>; spi-max-frequency = <40000000>; }; }; Где compatible = "spi-nand"; есть признак ("spi-nand" -- признак), который должен совпасть с драйвером. У вас будет другой признак. Можете поискать среди драйверов. Вдруг найдете подходящий, тогда из него признак возьмете и впишите в свое дерево. Можно любой признак вписать. Напишите имя микросхемы, например. Главное чтобы в обоих местах имя в точности совпадало. Там еще ножки описаны: spi0_pc_pins: spi0-pc-pins { pins = "PC0", "PC1", "PC2", "PC3"; function = "spi0"; }; Вот похожий драйвер: https://github.com/torvalds/linux/blob/master/drivers/iio/adc/ad7476.c Он с правильного источника. То, что я давал выше -- производный источник (https://elixir.bootlin.com). В структуре static struct spi_driver ad7476_driver = { .driver = { .name = "ad7476", }, .probe = ad7476_probe, .id_table = ad7476_id, }; .name = "ad7476" "ad7476" -- признак, по которому будет найдено описание в дереве устройств для этого драйвера. Когда добавите код драйвера в соответствующее место в директории ядра, надо будет добавить описание вашего драйвера в Kconfig и Makefile. Посмотрите как сделано здесь: https://github.com/torvalds/linux/tree/master/drivers/iio/adc Потом в окне, созданном командой make menuconfig добавьте этот драйвер. Там будет строка, что вы добавили в Kconfig Теперь при компиляции ядра ваш драйвер будет присутствовать. При запуске Линукса на вашем устройстве, в директории /sys/ будет добавлена соответствующая директория. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 1 апреля Опубликовано 1 апреля · Жалоба Спасибо большое! Как добавить и обозначить SPI через дерево устройств я разобрался еще в пятницу. Сейчас буду разбирать драйвер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 апреля Опубликовано 1 апреля · Жалоба Имейте в виду, что линуксовая подсистема iio - это страшный кошмар. Мегасемплов на ARM9 не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mysteo 0 1 апреля Опубликовано 1 апреля · Жалоба On 4/1/2024 at 11:21 AM, aaarrr said: Имейте в виду, что линуксовая подсистема iio - это страшный кошмар. Мегасемплов на ARM9 не получится. Спасибо! Получается чтобы достичь 2.4 МГц дискретизации нужно все-таки промежуточное звено ставить в виде микроконтроллера какого нибудь ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 апреля Опубликовано 1 апреля · Жалоба 11 minutes ago, Mysteo said: Получается чтобы достичь 2.4 МГц дискретизации нужно все-таки промежуточное звено ставить в виде микроконтроллера какого нибудь ? Да, или программируемой логики. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 1 апреля Опубликовано 1 апреля · Жалоба 8 часов назад, aaarrr сказал: Да, или программируемой логики. Или бареметал))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 апреля Опубликовано 1 апреля · Жалоба 17 minutes ago, mantech said: Или бареметал)))) ...или бареметал. Но и он может не вывезти - все же SPI на таких процессорах не под АЦП задумывался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 1 апреля Опубликовано 1 апреля (изменено) · Жалоба 24 минуты назад, aaarrr сказал: Но и он может не вывезти - все же SPI на таких процессорах не под АЦП задумывался. Нее, тут все норм, например в Т113 По ДШ получается макс 400мегабит, ТС нужно почти на порядок меньше. Изменено 1 апреля пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 апреля Опубликовано 1 апреля · Жалоба 3 minutes ago, mantech said: макс 400мегабит А триггер от таймера, как в обычных МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 1 апреля Опубликовано 1 апреля · Жалоба 3 минуты назад, aaarrr сказал: А триггер от таймера, как в обычных МК? А вот тут х.з. не проверял)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 апреля Опубликовано 1 апреля · Жалоба Ну, вот. Потребуется извратный семплрейт или запуск по внешнему событию, и никакой бареметал тоже не спасет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться