LINUX.ORG.RU

Сборка ядра/не могу найти модуль

 , ,


0

1

Добрый день, уважаемые форумчане. Занимаюсь сборкой ядра LINK версии 5.4.54 под alter’овский socfpga. Все почти успешно, линукс на отладочной плате работет. Но есть нюансы. Потребовался мне драйвер fpga-dma, но он ни в виде модуля(M), ни в ядро(*) собираться не хочет. Направьте меня куда следует, пожалуйста, по следующим вопросам: Как вообще определить, что драйвер был включен в ядро при сборке? И как его туда принудительно включить? И еще один: нужно ли делать make modules, если я хочу включить все модули в ядро? Спасибо.

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

Потребовался мне драйвер fpga-dma, но он ни в виде модуля(M), ни в ядро(*) собираться не хочет

Прошу предоставить подробности, что такое «не хочет собираться»? Нужно видеть сообщение о собственно ошибке. Как происходило собственно конфигурирование с целью включить драйвер? menuconfig или сборка off-tree?

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Собственно ошибки как таковой нет. Настраиваю через menuconfig. Как я полагал(ошибочно?), что все, что отмечено как М должно упасть в /lib/modules/$(uname -a). Соответственно ожидаю увидеть там что-то типа fpga-dma.ko, но такого нет.

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

Издеваешься чтоли над нами?

Ты когда запускаешь компиляцию ядра у тебя очень много текста в терминал вываливается? Это и есть лог сборки. Вот там где-то в конце у тебя будет что-то типа «Error», вот на это нужно смотреть.

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

Куда оно должно упасть? Ты на target чтоль собираешь? Или всё-таки кросс-компиляция и заливка на плату потом?

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

Конечно, кросс-компиляция с последующей заливкой. Директория по-умолчанию /lib/modules/… Make install - да, но я самого бинарника драйвера не вижу.

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

make install

Кстати да, в /lib/modules оно упадет лишь при установке. Может ТС-у просто поискать *.ko файл с именем своего драйвера? Наверняка лежит рядом с сорсами

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Так он кросс-компилирует. Я вообще не знаю что у него куда падает, и как на плате оказывается.

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

Отправной точкой было это руководство link Еще добавил make modules; make modules_install

Chilkin
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Ну вот нет там его. Еще вызываю make modules_install - Install the external module(s). The default location is /lib/modules/<kernel_release>/extra/ .. Хорошо, а если я компилирую драйвер в ядро через (звездочку) в menuconfig, где искать его(драйвера) бинарник?

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

Хорошо, а если я компилирую драйвер в ядро через (звездочку) в menuconfig, где искать его(драйвера) бинарник?

Что показывает файл .config (скрытый)? Есть там отмеченная опция интересующего драйвера?

Затрудняюсь сказать покажет ли /proc/modules или lsmod вокпиляченые модули, но почему бы не посмотреть артефакты сборки в исходниках? Если они там есть - значит драйвер внутри, и раз ошибок нет - тем более внутри :)

I-Love-Microsoft ★★★★★
()

Потребовался мне драйвер fpga-dma

ты или трусы одень или крестик сними. Такого драйвера не существует в природе! Есть fpga как фреймворк, с кучей модулей :

# Altera FPGA firmware download module (requires I2C)
#
CONFIG_ALTERA_STAPL=m
CONFIG_INTEL_MEI=m
CONFIG_INTEL_MEI_ME=m
CONFIG_INTEL_MEI_TXE=m
CONFIG_INTEL_MEI_HDCP=m
CONFIG_VMWARE_VMCI=m

которые имеют сходные названия.

и есть DMA которое присутствует в куче модулей(мемори алокатор какбы намекает)

или ты вводишь в заблуждение народ, или говори что тебе нужно прямо.

Gramozeka ★★
()
Последнее исправление: Gramozeka (всего исправлений: 1)
Ответ на: комментарий от Gramozeka

НАдень) Этот кусок из конфига вы для чего привели? Он имеет какое-то отношение к вопросу?
В кофиге у меня на 5.4.54 это раздел DMA Devices, называется CONFIG_FPGADMA, сейчас стоит в «=y». Никого не пытаюсь вводить в заблуждение, я и сам тут нахожусь. Вот в на хабре статья, интересуемая часть в конце почти, человек показал burst передачу в дма. И дальше я пытаюсь повторить успех.

Chilkin
() автор топика
Ответ на: комментарий от I-Love-Microsoft

По поводу конфига, да, он был сгенерирован через make socfpga_defconfig. В нем есть CONFIG_FPGADMA=y, это, видимо, он и есть, т.к. в makefile той же директории есть: obj-$(CONFIG_FPGADMA) += fpga-dma.o Самого fpga-dma.o я не нахожу после компиляции.

Я там ниже написал, что в статье на хабре в конце есть демострация работы через fpga-dma.

lsmod b /proc/modules по нулям.

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

В нем есть CONFIG_FPGADMA=y

lsmod b /proc/modules по нулям.

всё правильно. Если тебе нужен модуль, который будет загружаться по modprobe тебе нужно в конфиге указывать CONFIG_FPGADMA=m, если тебе нужно, чтоб он был в ядре монолитно, тогда указывай как «y», но если ты делаешь это всё в кросс-компиляции, то что ты хочешь от /proc/modules ? Загрузи ядро в реальную железку и смотри.

И что это за новый функционал у lsmod? Покажи хоть где об этом написано, а то вдруг чего нового изобрели, а народ то и не в курсе.

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

lsmod и /proc/modules, не ‘b’ - и.

Естественно смотрю на «железе». Сам себя цитирую, первое сообщение: «линукс на отладочной плате работет», «нужен драйвер fpga-dma, но он ни в виде модуля(M), ни в ядро(*) собираться не хочет». Т.е. хотел монолитно, но из-за отсутствия результата начал эксперименты, пробовал и так и так.

Изначально так - «монолитно». Написал =y, собрал ядро, загрузил на плату, подал питание, подключился по ssh. Как его найти? find / -iname fpga-dma - ничего. Хотя в device-tree он прописан и так и назван. Что не так сделал?

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

Изначально так - «монолитно». Написал =y, собрал ядро, загрузил на плату, подал питание, подключился по ssh. Как его найти? find / -iname fpga-dma - ничего. Хотя в device-tree он прописан и так и назван. Что не так сделал?

Если он монолитно в ядре, то никакого файла ты не найдёшь. Проверяй, вызывается ли probe твоего драйвера и работает ли он. Есть тестовый сценарий, как ты собрался свой dma тестировать? Что хочешь получить в итоге?

Какой олень эту тему из Development перенёс?

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

Что не так сделал?

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

Как я уже писал, исходники ядра могут помочь в написании DTS файла. Я правда сам не сразу понял это, но когда понял, то дело пошло быстрее. Нужно использовать исходники ядра как документацию!

Дайвайте посмотрим пример DMA драйвера из ./driver/dma/fpga-dma.c

.... (дальше идет какое-то описание что эта плюшка делает и как) ... и в конце: .... Таким образом, DTS файл должен быть написан с учетом того, как драйвер запрашивает из него ресурсы. Если используются именованные регистры и канала DMA, то имена должны совпадать и в исходнике ядра и в DTS файле. Только так две шестереночки системы: драйвер ядра и DTS/DTB могут работать вместе. ... https://habr.com/ru/post/334154/

для чего тебе нужен этот драйвер? Какие функции выполнять? Если я правильно понял прочитанное по твоей ссылке, то тебе ещё и самому надо накропать какую-то дюже умную портянку, которая должна будет выполнять какие-то осмысленные действия, используя фичи этого драйвера.

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

Есть тестовый сценарий, как ты собрался свой dma тестировать? Что хочешь получить в итоге?

Я приводил ссылку на статью, но видимо никто ее не открывал. Вот что хочу получить в итоге: ИЗОБРАЖЕНИЕ - отправлять данные из консоли и смотреть что приходит на логику через SignalTap(лог.анализатор,позволяет «заглянуть» внурть fpga). Там директория /sys/module/kernel/fpga_dma, как она появилась? Я обращался к автору статьи, но он уже ничего не помнит.

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

как она появилась?

ещё раз :

Таким образом, DTS файл должен быть написан с учетом того, как драйвер запрашивает из него ресурсы. Если используются именованные регистры и канала DMA, то имена должны совпадать и в исходнике ядра и в DTS файле. Только так две шестереночки системы: драйвер ядра и DTS/DTB могут работать вместе.

он ещё и капризный, дюже.(в смысле драйвер этот)

Gramozeka ★★
()
Последнее исправление: Gramozeka (всего исправлений: 1)
Ответ на: комментарий от Gramozeka

Не обижаюсь, действительно, понимаю не все, это так, поэтому сюда пришел. Еще раз. Хочу ПО-ПРОСТОМУ получить передачу по ДМА из памяти в логику(речь об Altera/Intel Cyclone V, есть там шина AXI, которая соединяет процессор и логику) для дальнейшей обработки и отправки в ЦАП. Что значит для меня «по-простому»? Без лишних вмешательств в систему и написания кода под нее. И так много неизвестных. Вот этот пример-статья должны были мне помочь. Почему ДМА? Для скорости, конечно. Что делает логика сейчас вообще не важно, в примере из статьи сделан loopback, что отправил,то и вернулось.

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

Что значит для меня «по-простому»?

я не особый дока по части этих девайсов, но статья по твоей ссылке явно указывает «написание собственного кода, с использованием исходников драйвера, для правильной комутации драйвера и конкретно взятой железяки». Вот к примеру указываемый там «DTS файл», для какого рожна он нужен? Сама плата, тоже ведь что-то должна выполнять полезное самостоятельно. «передачу по ДМА из памяти в логику» - это же тоже не вещь в себе, это охвостье какого-то осмысленного процесса, который просто(используя драйвер) получает определённый форс, против унылого стандарта.

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

Вот по твоей ссылке, читай с этого места внимательно:

Исходники ядра могут помочь в написании DTS файла — для меня DTS файл был очень большой проблемой. В файле DTS в текстовом виде описываются аппаратные ресурсы системы. Потом DTS компилируется в DTB файл, который потом используется ядром таким образом, что драйвера могут знать, какие ресурсы принадлежат устройствам.

Как я понял, теоретически разработка должна идти вот так:

Разрабатываем аппаратную систему в среде САПР Quartus Prime QSYS, настраиваем параметры HPS, добавляем в систему компоненты и IP ядра, соединяем компоненты. Генерируем систему с помощью QSYS и получаем результат soc_system.qsys и soc_system.sopsinfo файлы. Создаем DTS файл из *.sopsinfo файла используя командную строку:

sopc2dts --input soc_system.sopcinfo --output socfpga.dts --board soc_system_board_info.xml --board hps_clock_info.xml

Создаем DTB из DTS файла:

dtc -I dts -O dtb -o socfpga.dtb socfpga.dts

Gramozeka ★★
()
Последнее исправление: Gramozeka (всего исправлений: 1)
Ответ на: комментарий от Gramozeka

DTS-файл - описание аппаратной части. Я думал это строго линуксовская тема все зависимости от архитектуры процессора -> ССЫЛКА

написание собственного кода, с использованием исходников драйвера, для правильной комутации драйвера и конкретно взятой железяки

Видимо, к этому и идет, но зачем писать, если это уже решено в fpga-dma.c.

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

но зачем писать, если это уже решено в fpga-dma.c.

@не правильно ты бутерброды ешь, ДядяФёдор...

в fpga-dma.c только обвязка, конкретные данные то откуда-то нужно брать, вот их и надо сподобить. Железка1 имеет адресацию с «а» до «ф», а точно такая же Железка1а(с индексом) уже не с «а», а например с «с». Утрирую. Вот на плечи разработчика(тебя) это всё разруливать и ложится. Насколько я понимаю.

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

Там директория /sys/module/kernel/fpga_dma

там директория /sys/kernel/debug/fpga_dma, а не какую ты написал.

если это модуль, то при компиляции с =y он должен быть виден в /sys/modules.

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

Все,что вы пишите так. Только если бы я не читал следующее (прошу посмотреть на картинку в конце цитаты, это то, что я хочу получить):

Если кто-то захочет поэкспериментировать с DMA в SoC я рекомендую начинать эксперименты с альтеровского драйвера fpga-dma. Он использует DebugFS, это позволяет использовать прямо в консоли терминала простые команды “cat”, “echo” для выполнения транзакций в DMA канале:КАРТИНКА

И опять же, возвращаясь к нашим баранам. Для fpga-dma есть пункт в конфиге, есть мэйкфайл, есть исходник, наконец. Но после компиляции от него не остается следов в виде .o или .ko фалов.

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

Как вообще определить, что драйвер был включен в ядро при сборке?

на загруженной системе выполни modinfo fpga-dma.

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

Но после компиляции от него не остается следов в виде .o или .ko фалов.

анонимус дело говорит.

во первых не понятен сам процесс, как и что ты компилируешь. Если берём за исходное ту хабровскую статью, то надо качать «Intel SoC FPGA Embedded Development Suite», честно нет никакого желания, интел как гугль любит монструозные исходники за ради стобайтового екзешника, фу кака..

Но в любом случае, чтобы понять что у тебя не контачит(или ты думаешь, что не контачит) описывай полностью все этапы, что и как ты делаешь, что скачиваешь и какие команды вводишь.

«не остается следов», например есть такой финт ушами при компиляции - создаётся каталог build, в любом удобном месте, а сами исходники требуемого, например лежат где-то в /tmp/ishodniki-super, и компиляция выполняется вне дерева этих исходников в каталоге <some-path>/build через make o=<some-path>/build, или ещё каким способом(их море всяких) : https://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/ch0...

то в таком случае в дереве исходников будет чистота и порядок, никаких временных или объектных файлов. Всё будет(если будет) в той директории куда ты собираешь... а вот тут уже нюансов вагон, если ты решишь собрать например make bzImage, то у тебя только этот bzImage и упадёт в целевую директорию, ... но главное надо иметь в виду(!) - это всё работает весьма кривовато, и если нет понимания сути процесса, то можно долго блуждать в трёх соснах, особенно если это всё ещё приправлено кросс-компиляцией, т.к. для arm'а тебе нужен arm же компилятор, которому надо правильно ставить цели.

Попробуй описать все свои действия подробно, настолько насколько вообще сможешь, глядишь и сам увидишь «где мы свернули не туда», да и народ охотней подскажет, где ошибка(если она есть)

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

Я приводил ссылку на статью, но видимо никто ее не открывал.

Нет конечно, а зачем?

Короч вот он твой драйвер: https://github.com/altera-opensource/linux-socfpga/blob/02de4f4fa530de2f1905f6f4ac5b31e2baecac9f/arch/arm/mach-socfpga/fpga-dma.c

Я глянул, там чисто поэкспериментировать, что у тебя FIFO работает, ибо в нормльном проекте ты не будешь ничего использовать через debugfs. Добавь пару вызовово dev_info в probe() и посмотри, появятся ли они у тебя в dmesg. Вопрос ещё вот в чём: у тебя bitstream оказывается в FPGA до старта системы или после?

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

Нет конечно, а зачем?

Чтобы ответить на мой вопрос прямее.

Я глянул, там чисто поэкспериментировать

А мне это пока и надо.

до старта системы или после?

система грузится последней

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

Добавь в строку 593 что-нибудь типа:

dev_info(&pdev->dev, "Probe entry point\n");

Перекомпиляй и ищи эту строку в dmesg.

dmesg | grep "Probe entry"

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

UPD. Пересобрал, в dmesg сообщения нет.

Значит либо драйвер не в ядре, либо в device tree косяки. DT ф студию!

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

Значит так. Сейчас почистил дистрибутив make distclean, заново сконфигурировал минимально, включая CONFIG_FPGADMA, собрал ядро. При загрузке увидел «Probe entry»! Смонтировал debugfs и получил /sys/kernel/debug/fpga_dma. Победа! Значит, что-то в конфиге что-то выкинуло мой драйвер из компиляции, я других вариантов не вижу. Сейчас все по минимуму установлено.

Спасибо всем неравнодушным. Уверен, я к вам еще вернусь;)

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