Сохранение существующих данных и предотвращение потери данных при внезапном отключении питания имеет решающее значение для пользователей продуктов быстрого хранения и сбора данных. Существует множество решений этой проблемы, среди которых хорошим выбором является сегнетоэлектрическая память (FRAM). FRAM — это энергонезависимая память с высокой скоростью записи, способная хранить данные в энергонезависимом режиме, а также позволяющая выполнять операции, аналогичные RAM.
В этой статье мы будем использовать плату разработки Forlinx OK3568-C , чтобы представить решение, использующее FRAM — использование интерфейса SPI0 для подключения чипа PB85RS2MC (FRAM). Файлы драйверов и файлы приложений, описанные в этой статье, можно получить, обратившись в службу технической поддержки Forlinx Embedded.
Модификация—
Чтобы добавить устройство SPI, необходимо выполнить следующие шаги: Добавить описание в дерево устройств → соответствующий драйвер устройства в описании дерева устройств → драйвер устройства добавлен в ядро.
Результат-
Измените OK3568-linux-source/kernel/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi.
Измените следующее:
Далее мы представим процесс адаптации.
1 водитель
Мы искали в конфигурации меню fm25, pb85 и другие часто используемые слова FRAM, но обнаружили, что аналогичного драйвера нет. Поэтому нам нужно написать или портировать драйвер вручную. Перерыв разные сайты, нашел драйвер для W25Q64. Сравнив различные коды операций PB85RS2MC с W25Q64, я заметил, что они очень похожи. Поэтому я решил портировать драйвер W25Q64 на PB85RS2MC.
Согласно описанию в руководстве по микросхеме PB85RS2MC, различные коды операций:
Имя команды
Команда Описание
код операции
КРАПИВНИКЗапись команд включения блокировки0000 0110BВРДИСброс команды включения блокировки. Запись команды включения блокировки.0000 0100BЧИТАТЬЧтение команды0000 0011BПИСАТЬНаписать команду0000 0010BРИДИДКоманда чтения серийного номера устройства1001 1111БФСТРДКоманда высокоскоростного чтения0000 1011БСПАТЬКоманда сна1011 1001БРДСРЧтение регистра состояния0000 0101BВРСРЗапись в регистр состояния0000 0001B
Таким образом, следующие коды операций определяются макросом в драйвере, который будет использоваться в следующих драйверах:
Во-первых, в драйвере должны быть реализованы функции initi и exit, то есть spidev_init и spidev_exit. Функция init предназначена для инициализации символьного устройства, его регистрации и т. д. Функция выхода предназначена для освобождения всех вещей, которые мы зарегистрировали, при выходе. Оно должно соответствовать значению совместимого атрибута в дереве устройств, иначе сопоставление будет неудачным. Кроме того, драйвер и дерево устройств сопоставляются по значению атрибута совместимости, которое должно совпадать со значением атрибута совместимости в дереве устройств. В противном случае матч будет неудачным. Совместимое значение в драйвере показано ниже.
После успешного сопоставления драйвера и дерева устройств нам необходимо выполнить функцию проверки, где функция проверки выполняет некоторую инициализацию и регистрацию номеров первичного и вторичного устройства. Мы можем определить, успешно ли совпадают драйвер и дерево устройств, по тому, печатает ли он spi_probe успех!
Проверьте условия чтения в руководстве по микросхеме PB85RS2MC, затем прочитайте данные из ячейки памяти FRAM, для которой требуется код операции READ, любой 24-битный адрес, введенный в SI. Первая структура spi_transfer используется для отправки команды cmd на устройство SPI для подготовки устройства перед чтением данных, вторая — для отправки адреса на устройство SPI, а третья — для получения данных, считанных с устройства.
Этот код реализует синхронизированное чтение с устройства SPI и копирует данные в пространство пользователя.
Проверьте условия записи в руководстве по микросхеме PB85RS2MC, команда WREN используется для установки защелки разрешения записи. Команда WREN необходима для установки защелки разрешения записи перед операцией записи (команда WRITE), а команда WRITE записывает данные в массив ячеек памяти FRAM. Код операции WRITE, любой 24-битный адрес и 8-битные данные записи подаются на вход SI.
Следующий код реализует функцию отправки команды разрешения записи на устройство SPI.
Этот код реализует синхронизированную запись данных на устройства SPI. Сначала он отправляет команду разрешения записи, а затем отправляет информацию об адресе и данные.
Следующий код синхронно записывает данные на устройство SPI, копируя данные пользовательского пространства в буфер передачи устройства и вызывая функцию spidev_sync_write для записи данных на устройство SPI.
2 приложения
Чтобы записать данные на устройство SPI, вызовите lseek, чтобы изменить местоположение записываемых данных, чтобы данные можно было записывать по всему устройству SPI, например. /writeframeAPP /dev/pb85rs 0 для Linux
(0 — адрес для записи, forlinx — что писать)
Чтобы прочитать данные с устройства SPI, вызовите lseek, чтобы изменить местоположение считываемых данных, чтобы их можно было читать по всему устройству SPI, например. /readframeAPP /dev/pb85rs 0
(0 — адрес данных, которые нужно прочитать)
3 Фактический тест
(1) Сначала скопируйте fram.ko, readframeAPP, writeframe APP в любую папку на плате разработки OK3568-C.
(2) Загрузите модуль fram.ko с помощью insmod, spi_probe успешен! показывает, что драйвер успешно соответствует дереву устройств.
(3) Посмотрите в /dev/, есть ли там устройство pb85rs.
(4) Используйте . /writeframeAPP /dev/pb85rs 1500 forlinx
Запись данных на устройство, 1500 — это адрес, а forlinx — что писать.
(5) Используйте . /readframeAPP /dev/pb85rs 1500
(1500 — адрес данных, которые нужно прочитать)
4 Тест на сбой питания
Перечитывание PB85RS2MC после дня отключения питания показало, что данные все еще там. Проверены характеристики сохранения данных при выключенном питании сегнетоэлектрической микросхемы памяти PB85RS2MC.
На данный момент мы завершили добавление нового сегнетоэлектрического чипа памяти SPI в макетную плату OK3568-C !
Первоначально опубликовано на www.forlinx.net.