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

OpenIPC

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

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

Чтение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Запись

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

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

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

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

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

1. sf probe 0                                     
2. mw.b 0x82000000 ff 0x1000000                   
3. tftp 0x82000000 dump.bin                       
4. sf erase 0x0 0x1000000
5. sf write 0x82000000 0x0 0x1000000
6. 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

1. mw.b 0x82000000 ff 0x1000000                   
2. tftp 0x82000000 dump.bin                       
3. nand erase 0x0 0x1000000
4. nand write.i 0x82000000 0x0 0x1000000
5. 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.

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