Вопрос или проблема
Недавно я обновил свой Linux Kernel с 5.4.104 до 5.15, и после этого я не могу больше записывать данные в свою QSPI NOR FLASH. Я провел небольшое исследование, и кажется, что контроллер cadence qspi начал использовать фреймворк spi-mem, и я подозреваю, что это испортило мои операции записи в QSPI. Во время загрузки ядра, похоже, всё в порядке, как видно ниже:
[ 1.400740] spi-nor spi0.0: найден n25q128a13, ожидался n25q512a
[ 1.406841] spi-nor spi0.0: n25q128a13 (16384 Kbytes)
[ 1.411954] Найдено 8 фиксированных разделов на устройстве MTD ff705000.flash.0
[ 1.419165] Создание 8 MTD-разделов на "ff705000.flash.0":
[ 1.424806] 0x000000000000-0x000000001000 : "SPL/u-boot image"
[ 1.431977] 0x000000001000-0x000000002000 : "SPL/u-boot dtb"
[ 1.438908] 0x000000002000-0x000000003000 : "reserved-0"
[ 1.445441] 0x000000003000-0x000000004000 : "reserved-1"
[ 1.452053] 0x000000200000-0x000000201000 : "u-boot environment 1"
[ 1.459482] 0x000000210000-0x000000211000 : "u-boot environment 2"
[ 1.466895] 0x000000800000-0x000000c00000 : "FPGA safe image"
[ 1.473928] 0x000000c00000-0x000001000000 : "FPGA user image"
Чтение, похоже, в порядке, но когда я пытаюсь записать, у меня возникает паника ядра:
# echo "hello" > /dev/mtdblock7
[ 1146.935881] 8<--- cut here ---
[ 1146.938943] Необработанная ошибка: неточное внешнее прерывание (0x1406) по адресу 0x00504e1c
[ 1146.945966] pgd = 1a543702
[ 1146.948667] [00504e1c] *pgd=380dc831
[ 1146.952240] Внутренняя ошибка: : 1406 [#1] SMP ARM
[ 1146.956756] Подключенные модули:
[ 1146.959803] CPU: 1 PID: 613 Comm: sh Не испорчено 5.15.0-142467-gad617140bb24-dirty #18
[ 1146.967692] Аппаратное имя: Altera SOCFPGA
[ 1146.971688] PC находится на cqspi_exec_mem_op+0xab8/0xfec
[ 1146.976485] LR находится на arm_heavy_mb+0x2c/0x48
[ 1146.980660] pc : [<c06b3b80>] lr : [<c0117b70>] psr: 20030013
[ 1146.986902] sp : c23899b8 ip : c23899a8 fp : c2389a14
[ 1146.992106] r10: 00000100 r9 : f08e4000 r8 : c1234040
[ 1146.997310] r7 : c1213b80 r6 : c1213b80 r5 : 00000000 r4 : c2389c18
[ 1147.003810] r3 : 00000001 r2 : 00000730 r1 : 00000000 r0 : 00000000
[ 1147.010308] Флаги: nzCv IRQ включены FIQ включены Режим SVC_32 ISA ARM Сегмент отсутствует
[ 1147.017419] Контроль: 10c5387d Таблица: 02a1404a DAC: 00000051
[ 1147.023141] Информация о регистре r0: NULL указатель
[ 1147.027831] Информация о регистре r1: NULL указатель
[ 1147.032518] Информация о регистре r2: память, не подверженная страницам
[ 1147.037551] Информация о регистре r3: память, не подверженная страницам
[ 1147.042584] Информация о регистре r4: память, не относящаяся к slab/vmalloc
[ 1147.048223] Информация о регистре r5: NULL указатель
[ 1147.052910] Информация о регистре r6: slab kmalloc-2k старт c1213800 указатель смещение 896 размер 2048
[ 1147.061678] Информация о регистре r7: slab kmalloc-2k старт c1213800 указатель смещение 896 размер 2048
[ 1147.070443] Информация о регистре r8: slab kmalloc-8k старт c1234000 указатель смещение 64 размер 8192
[ 1147.079122] Информация о регистре r9: 0-страница vmalloc регион начиная с 0xf08e4000 выделенный в __devm_ioremap_resource+0x170/0x1e8
[ 1147.090823] Информация о регистре r10: память, не подверженная страницам
[ 1147.095944] Информация о регистре r11: память, не относящаяся к slab/vmalloc
[ 1147.101669] Информация о регистре r12: память, не относящаяся к slab/vmalloc
[ 1147.107395] Процесс sh (pid: 613, предел стека = 0x4e67e691)
[ 1147.112949] Стек: (0xc23899b8 до 0xc238a000)
[ 1147.117293] 99a0: c01a5f98 c076e370
.
.
.
Кто-нибудь сталкивался с такой проблемой и знает, как её решить? Буду признателен за любые предложения или идеи.
Ответ или решение
Kernel Panic при попытке записи во Flash после обновления ядра
Недавнее обновление ядра Linux с версии 5.4.104 до 5.15 вызвало серьезные проблемы с записью в QSPI NOR Flash. Исходя из ваших наблюдений, вы правильно отметили, что контроллер QSPI Cadence теперь использует фреймворк spi-mem, что может быть причиной возникших затруднений. Давайте более подробно разберем возможные причины и пути решения этой проблемы.
1. Понимание проблемы
Фреймворк spi-mem был внедрен для улучшения работы с памятью SPI, но изменения, внесенные в ядро, могли вызвать конфликты с текущими драйверами или конфигурациями QSPI. Сообщение об ошибке, указывающее на "необработанный сбой: неточные внешние ошибки" (imprecise external abort), и адреса памяти наводят на мысль о том, что во время выполнения операции записи происходит сбой доступа к памяти.
2. Анализ вывода сообщений при старте
Из вывода о состоянии, который вы представили, видно, что память была правильно определена и разделена на MTD-партии. Это свидетельствует о том, что физические и логические настройки QSPI выглядят корректными. Однако, при попытке записи данных в /dev/mtdblock7
происходит сбой, что может указывать на:
- Ошибки в драйверах.
- Неправильную обработку операций записи в новом фреймворке spi-mem.
- Потенциальные проблемы с совместимостью между текущей версией ядра и драйверами контроллера.
3. Рекомендации по устранению проблемы
a. Проверка совместимости драйвера
Первым делом стоит перепроверить, используется ли последняя версия драйвера для вашего контроллера QSPI. Возможно, необходимо адаптировать или обновить драйвер для работы с новым фреймворком spi-mem. Ознакомьтесь с документацией по spi-mem
и убедитесь, что ваш драйвер совместим с установленным ядром.
b. Cборка ядра с отладкой
Рекомендуется собрать ядро с активированными отладочными возможностями. Это позволит вам получать более детальные сообщения о сбоях. Включите опции отладки в конфигурации вашего ядра:
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
После этого, проанализируйте журнал загрузки и попытайтесь воспроизвести проблему.
c. Обновление или откат ядра
Если вышеперечисленные шаги не дают результатов, возможно, вам стоит рассмотреть откат на ранее работающее ядро (например, 5.4.104) или просмотреть, есть ли доступные обновления для версии 5.15. Иногда проблемы могут быть исправлены в патчах или обновлениях.
d. Консультация с сообществом
И последним, но не менее важным, настоятельно рекомендуется обратиться к сообществу разработчиков: форумы, списки рассылки или специализированные группы. Поделитесь выводом ошибок и уточните, не сталкивались ли другие пользователи с подобными проблемами.
В заключение, следует отметить, что подобные проблемы могут возникать и требуют вдумчивого анализа. Правильный подход включает в себя обновление драйверов, настройку параметров ядра и потенциальное взаимодействие с сообществом. Удачи с решением вашей проблемы!