Dlinyj (dlinyj) wrote,
Dlinyj
dlinyj

Categories:

Допиливание SOM-модуля на процессоре i.mx6ul



Есть вот такой чудесный 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? Может кто знает как решить проблемы частоты работы камня.
Tags: linux
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 11 comments