С микросхемами памяти в камерах можно работать, так сказать, в лоб – читать и писать их программатором. Но существует и более тонкий вариант – соответствующие команды в загрузчике. Во-первых, это не требует ни программатора, ни паяльника, а, во-вторых, является процедурой более высокого уровня.
Кое-что всё же понадобится, а именно 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
- Разрешить доступ к постоянной памяти
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Считать блок данных размером 16Мб из постоянной памяти по адресу 0x0 в оперативную память по адресу 0x82000000
- Выгрузить блок данных размером 16Мб из оперативной памяти по адресу 0x82000000 на TFTP-сервер в файл с именем dump.bin
Чтение данных из памяти типа SPI NAND
mw.b 0x82000000 0xff 0x1000000 nand read 0x82000000 0x0 0x1000000 tftp 0x82000000 dump.bin 0x1000000
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Считать блок данных размером 16Мб из постоянной памяти по адресу 0x0 в оперативную память по адресу 0x82000000
- Выгрузить блок данных размером 16Мб из оперативной памяти по адресу 0x82000000 на TFTP-сервер в файл с именем dump.bin
Если размер флешки 16Мб, то на этом бэкап завершён. Если же больше – операцию нужно повторить необходимое количество раз, меняя адрес и имя файла и/или изменить размер блока. При указании размера блока и адреса в оперативке нужно учитывать особенности конкретного девайса – не всегда адрес загрузки будет 0x82000000 и размер доступной памяти может быть ограничен.
Тестирование
Перед записью данных в постоянную память, особенно, если нет уверенности, что всё совместимо, их лучше протестировать.
Тестирование загрузчика
Проверить работу загрузчика можно, передав управление загруженному образу командой go:
mw.b 0x82000000 0xff 0x1000000 tftp 0x82000000 u-boot.bin go 0x82000000
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Загрузить блок данных с TFTP-сервера из файла с именем u-boot.bin в оперативную память по адресу 0x82000000
- Передать управление по адресу 0x82000000
Если загрузчик совместим с железом, то произойдёт его загрузка, а если несовместим, то либо будет выведена ошибка и произойдёт перезапуск, либо система зависнет.
Тестирование ядра
Проверить работу ядра системы можно, запустив его из загруженного образа командой bootm:
mw.b 0x82000000 0xff 0x1000000 tftp 0x82000000 kernel.bin bootm 0x82000000
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Загрузить блок данных с TFTP-сервера из файла с именем kernel.bin в оперативную память по адресу 0x82000000
- Запустить систему из образа загруженного по адресу 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
- Разрешить доступ к постоянной памяти
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Загрузить блок данных с TFTP-сервера из файла с именем dump.bin в оперативную память по адресу 0x82000000
- Очистить область постоянной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x0
- Записать блок данных размером 16Мб (0x1000000 в HEX) из оперативной памяти по адресу 0x82000000 в постоянную память по адресу 0x0
- Перезапуск загрузчика
Запись данных в память типа SPI NAND
mw.b 0x82000000 ff 0x1000000 tftp 0x82000000 dump.bin nand erase 0x0 0x1000000 nand write.i 0x82000000 0x0 0x1000000 reset
- Очистить область оперативной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x82000000
- Загрузить блок данных с TFTP-сервера из файла с именем dump.bin в оперативную память по адресу 0x82000000
- Очистить область постоянной памяти размером 16Мб (0x1000000 в HEX) по адресу 0x0
- Записать блок данных размером 16Мб (0x1000000 в HEX) из оперативной памяти по адресу 0x82000000 в постоянную память по адресу 0x0 с учётом bad-секторов
- Перезапуск загрузчика
Замечания к предыдущему разделу насчёт адреса и размера справедливы и для этого.
В процессе ознакомления с вопросом использованы материалы сайта zftlab.org, а конкретно статья Трюки и хаки при экспериментах с IPCam от Xiong Mai.