
Есть вот такой чудесный SOM-модуль и я в нём допиливаю потихоньку всё что не допилили. Вообще портирование - эта та сфера, которая одновременно меня и сказочно бесит и радует. Бесит тем, что ты мало что создаёшь в реальности, а только пилишь чужие ошибки (это вымораживает, так как код хочется писать, надо больше кода). И часто ходишь по каким-то граблям и не понимаешь почему оно работает вот именно так, а не иначе, поиски решений в интернетах приводят иногда к куче битых ссылок. Иногда можно неделями стучаться головой в закрытые двери. С другой стороны, ты ковыряешься в u-boot и ядре. Т.е. правишь одну громадную программу и есть ощущение единства в глобальном проекте. Я пока ещё не определился, нравится мне это или нет, но тошнит не сильно (пока получается).
Больше всего не хватает человека, который бы мог обучить всему этому безобразию. Вопросов тысяча.
Из любопытных штук. Была задача, чтобы при обращении cat /proc/cpuinfo выдавался серийный номер процессора. До этого был нули. Примерно так:
Hardware : Freescale i.MX6 Quad/DualLite (Device Tree) Revision : 0000 Serial : 0000000000000000
Как обычно подступаем к задаче? Гуглим. Нахожу такой же вопрос, точнее два. Раз и два и написанно там следующее и страшное:
- the contents of /proc/cpuinfo are generated by c_show in arch/arm/kernel/setup.c.
- c_show takes global values system_serial_high and system_serial_low.
- these two are in turn set in arch/arm/kernel/atags_parse.c, from a tag structure (atag) with ATAG_SERIAL identifier.
- ATAGs are passed to the kernel by the bootloader.
- u-boot has ATAG support in arch/arm/lib/bootm.c, in this case if CONFIG_SERIAL_TAG is defined, setup_serial_tag exists and calls get_board_serial to get the serial number.
- unfortunately, get_board_serial is not implemented for i.MX6.
Короче говоря, передача параметров через ATAG (как я понял, типа область памяти, которая шарится между u-boot и ядром, от туда ядро берёт свои параметры) и там надо ещё поплясать. Ну и мякотка на торте, что вообще серийный номер не поддерживается. Т.е. разберись с ATAG, добавь в ядро кусок кода, в u-boot и не факт что будет работать.
Вы чувствуете этот запах? Запах старого геммороя? По второй ссылке там хоть какие-то примеры кода, которые оказались полезны хоть немного. Рассказываю гениальное и простое решение данной проблемы.
Оказалось, что серийный номер камня можно передать просто установив env "serial#" в u-boot и "мистическим" образом она попадёт в ядро. В результате, нам нужно в инициализации борды в u-boot прочитать серийник и установить env:
get_board_serial(&serialnr);
char board_serial_str [19];
sprintf(board_serial_str, "0x%X%X",serialnr.high, serialnr.low);
env_set("serial#", board_serial_str);
Четыре строчки кода!!! И да, оно работает:
cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 5 (v7l) ... Serial : 0x2F30C1D2604355C0
Поздравляю, вы великолепны.
P.S. Вообще среди читателей нет тех, кто работал с камнем i.mx6ul? Может кто знает как решить проблемы частоты работы камня.
no subject
Date: 2019-06-19 03:36 pm (UTC)и приходилось думать головой. помню это ощущение.
прочел твой курсив и то, что там было написано - не вызвало непонимания, вроде все разжевано.
но я скорее пошел бы в исходники ядра и смотрел бы на другие архитектуры и делал ctrl+c и ctrl+v
Если ты считаешь, что это гемморой - то у тебя впереди очень много всего интересного :)
и я тебе завидую :)
no subject
Date: 2019-06-19 04:08 pm (UTC)Согласись, что тогда системы были несколько проще и проще было разобраться. Я бы с удовольствием с ядром 2.6 и ниже работал бы, там всё просто и доступно.
no subject
Date: 2019-06-19 05:59 pm (UTC)- unfortunately, get_board_serial is not implemented for i.MX6.
ты ее имплементировал. работает :)
Я ковырял старые ядра, про новые не скажу, но, мне кажется, тут все должно быть еще проще - в сторону модульности, универсальности,но масштабнее уже.
Раньше - было тупо меньше народу и инфы, которые ковыряются в железках и прикручивают к ним линукс.
Сейчас - вообще рай для разработчиков. dev kits почти ничего не стоят. инфы - валом.. Здорово! хорошее время.
no subject
Date: 2019-06-19 06:07 pm (UTC)Для начала смотреть
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/cpufreq/cpufreq-dt.txt
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/cpufreq/cpufreq-dt.c
Потом
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/dts/imx6ul.dtsi (строки 54...93)
Обрати внимание на то, что частотам однозначно сопоставляется напряжение (а значит должен быть описан соответствующий регулятор и он должен уметь выдавать нужное). Ну и "губернатор" со своими настройками, который этим всем рулит. Конкретно с UL дел не имел, но с очень похожим сталкивался.
Подробнее, боюсь, копать придется самому
no subject
Date: 2019-06-20 07:21 am (UTC)no subject
Date: 2019-06-20 09:28 am (UTC)спроси его. они с Пашей плотно иМХ грызли.
no subject
Date: 2019-06-20 09:29 am (UTC)no subject
Date: 2019-06-20 09:39 am (UTC)http://starterkit.ru/html/index.php?name=forum&cat=73
ссылка на Александра - sasamy
http://starterkit.ru/html/index.php?name=account&op=info&uname=sasamy
no subject
Date: 2019-06-19 06:45 pm (UTC)no subject
Date: 2019-06-20 07:22 am (UTC)no subject
Date: 2019-06-20 02:05 am (UTC)P.S. С давних пор привыкший, что ответов в явном виде нет нигде, а в неявном ещё поискать.
Пример - формат .doc, где как в утёкшей, так и в официальной информации многого просто нет.