Работа с памятью в загрузчике

OpenIPC

С микросхемами памяти в камерах можно работать, так сказать, в лоб — читать и писать их программатором. Но существует и более тонкий вариант — соответствующие команды в загрузчике. Во-первых, это не требует ни программатора, ни паяльника, а, во-вторых, является процедурой более высокого уровня.

Кое-что всё же понадобится, а именно UART-адаптер с коннектором, программа-терминал для работы с ним и TFTP-сервер.

Чтение

Первым делом нужно сделать резервную копию всей постоянной памяти. Передача данных между TFTP-сервером и флеш-памятью ведётся блоками при посредничестве оперативки.

Общий алгоритм чтения данных:

  • почистить область оперативной памяти;
  • считать в эту область блок данных из постоянной памяти;
  • передать полученный блок данных TFTP-серверу.

Пока встречал в камерах память двух видов: SPI NOR и NAND. Команды для работы с разными типами отличаются.

Чтение данных из памяти типа SPI NOR

sf probe 0                           
mw.b 0x82000000 0xff 0x1000000         
sf read 0x82000000 0x0 0x1000000
tftp 0x82000000 dump.bin 0x1000000
  1. Разрешить доступ к постоянной памяти
  2. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  3. Считать блок данных размером 16Мб из постоянной памяти по адресу 0x0 в оперативную память по адресу 0x82000000
  4. Выгрузить блок данных размером 16Мб из оперативной памяти по адресу 0x82000000 на TFTP-сервер в файл с именем dump.bin

Чтение данных из памяти типа SPI NAND

mw.b 0x82000000 0xff 0x1000000         
nand read 0x82000000 0x0 0x1000000
tftp 0x82000000 dump.bin 0x1000000
  1. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  2. Считать блок данных размером 16Мб из постоянной памяти по адресу 0x0 в оперативную память по адресу 0x82000000
  3. Выгрузить блок данных размером 16Мб из оперативной памяти по адресу 0x82000000 на TFTP-сервер в файл с именем dump.bin

Если размер флешки 16Мб, то на этом бэкап завершён. Если же больше — операцию нужно повторить необходимое количество раз, меняя адрес и имя файла и/или изменить размер блока. При указании размера блока и адреса в оперативке нужно учитывать особенности конкретного девайса — не всегда адрес загрузки будет 0x82000000 и размер доступной памяти может быть ограничен.

Тестирование

Перед записью данных в постоянную память, особенно, если нет уверенности, что всё совместимо, их лучше протестировать.

Тестирование загрузчика

Проверить работу загрузчика можно, передав управление загруженному образу командой go:

mw.b 0x82000000 0xff 0x1000000
tftp 0x82000000 u-boot.bin
go 0x82000000
  1. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  2. Загрузить блок данных с TFTP-сервера из файла с именем u-boot.bin в оперативную память по адресу 0x82000000
  3. Передать управление по адресу 0x82000000

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

Тестирование ядра

Проверить работу ядра системы можно, запустив его из загруженного образа командой bootm:

mw.b 0x82000000 0xff 0x1000000
tftp 0x82000000 kernel.bin
bootm 0x82000000
  1. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  2. Загрузить блок данных с TFTP-сервера из файла с именем kernel.bin в оперативную память по адресу 0x82000000
  3. Запустить систему из образа загруженного по адресу 0x82000000

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

Запись

После того, как резервная копия создана и совместимость протестирована, можно приступать к записи. Основная рекомендация — трогать загрузчик только в крайнем случае и только тогда, когда точно понимаете что это необходимо. Если загрузчик будет цел, то всё остальное поправимо без особых усилий, а если он будет повреждён, то всё гораздо хуже.

Общий алгоритм записи данных:

  • почистить область оперативки;
  • загрузить в неё блок данных от TFTP-сервера;
  • записать этот блок данных из оперативной памяти в постоянную.

Для примера рассмотрим восстановление из резервной копии.

Запись данных в память типа SPI NOR

sf probe 0                                     
mw.b 0x82000000 ff 0x1000000                   
tftp 0x82000000 dump.bin                       
sf erase 0x0 0x1000000
sf write 0x82000000 0x0 0x1000000
reset
  1. Разрешить доступ к постоянной памяти
  2. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  3. Загрузить блок данных с TFTP-сервера из файла с именем dump.bin в оперативную память по адресу 0x82000000
  4. Очистить область постоянной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x0
  5. Записать блок данных размером 16Мб (0x1000000 в HEX) из оперативной памяти по адресу 0x82000000 в постоянную память по адресу 0x0
  6. Перезапуск загрузчика

Запись данных в память типа SPI NAND

mw.b 0x82000000 ff 0x1000000                   
tftp 0x82000000 dump.bin                       
nand erase 0x0 0x1000000
nand write.i 0x82000000 0x0 0x1000000
reset
  1. Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
  2. Загрузить блок данных с TFTP-сервера из файла с именем dump.bin в оперативную память по адресу 0x82000000
  3. Очистить область постоянной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x0
  4. Записать блок данных размером 16Мб (0x1000000 в HEX) из оперативной памяти по адресу 0x82000000 в постоянную память по адресу 0x0 с учётом bad-секторов
  5. Перезапуск загрузчика

Замечания к предыдущему разделу насчёт адреса и размера справедливы и для этого.

В процессе ознакомления с вопросом использованы материалы сайта zftlab.org, а конкретно статья Трюки и хаки при экспериментах с IPCam от Xiong Mai.

Оцените статью
( Пока оценок нет )
МихаТроник
Добавить комментарий