本文将借助飞凌嵌入式OK3568-C开拓板来为大家先容一种采取FRAM的方案——利用SPI0挂载PB85RS2MC (FRAM) 芯片。本文所描述的驱动文件和运用文件,可联系飞凌嵌入式的技能支持获取。
修正思路——
我们要添加一个SPI设备,须要进行如下操作:在设备树中添加描述→设备树描述中对应设备驱动→设备驱动添加到内核。
修正 OK3568-linux-source/kernel/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi
修正如下:
点击添加图片描述(最多60个字)
接下来笔者为大家先容一下适配的过程。
1 驱动程序
我们在menuconfig中搜索fm25、pb85等比较常用的FRAM字眼,创造并没有类似的驱动程序,这时就须要手写或者移植一个驱动程序。在搜遍各大网站之后找到了一个W25Q64的驱动,比拟了一下PB85RS2MC的各种操作码往后,创造两者的操作码大差不差,因此就决定将W25Q64的驱动移植过来。根据PB85RS2MC芯片手册中阐述,各种操作码为:
因此,在驱动程序中宏定义以下操作码,以便在接下来的驱动程序中利用:
首先要在驱动程序中进行初始化函数和退出函数,也便是spidev_init和spidev_exit,init函数里便是进行字符设备的初始化,注册等的操作,exit函数便是要把我们注册的东西在退出时都开释掉,再者便是驱动程序和设备树匹配,匹配是通过compatible属性值匹配的,这里我们一定要和设备树中的compatible属性值同等,否则会匹配不堪利。驱动程序中.compatible值如下图所示。
驱动和设备树匹配成功往后就要实行probe函数,这里probe函数实行了一些初始化和注册主次设备号的操作。我们可以通过是否打印spi_probe success!
来判断驱动程序,是否和设备树匹配成功。从PB85RS2MC芯片手册中看读的条件,读取FRAM存储单元的数据,须要READ的操作码,任意24位地址输入到SI。第一个spi_transfer 构造体用于发送命令cmd 到SPI设备,在读取数据之前准备设备,第二个是发送地址到SPI设备,第三个是吸收从设备读取的数据。
这段代码实现了从 SPI设备中同步读取数据,并将数据复制到用户空间的功能。
从PB85RS2MC芯片手册中看写的条件,WREN命令用于设置写使能锁存器。须要在写操作(WRITE命令) 之前利用WREN命令设置写使能锁存器,WRITE命令将数据写入 FRAM存储单元阵列。WRITE操作码、任意24位地址和8位写入数据输入到 SI。
下面这段代码实现了向SPI设备发送写入使能命令的功能。
这段代码实现了向SPI设备同步写入数据的功能。它先发送写入使能命令,然后发送地址信息和数据。
下面这段代码向 SPI设备中同步写入数据的功能,将用户空间的数据复制到设备的发送缓冲区,并调用spidev_sync_write 函数将数据写入SPI 设备。
2 运用程序
向SPI设备写数据,调用lseek来改变写入数据的位置,这样就可以在全体SPI设备里写数据,如./writeframAPP /dev/pb85rs 0 forlinx
(0是要写入的地址,forlinx是要写入的内容)。
从SPI设备读数据,调用lseek来改变读取数据的位置,这样就可以在全体SPI设备里读数据,如./readframAPP /dev/pb85rs 0
(0是要读取数据的地址)
3 实际测试
(1)首先将fram.ko, readframAPP, writefram APP拷贝到OK3568-C开拓板的任意文件夹中。
(2)用insmod加载fram.ko模块,涌现spi_probe success!解释驱动和设备树匹配成功。
(3)在/dev/下看有没有pb85rs设备。
(4)利用./writeframAPP /dev/pb85rs 1500 forlinx
向设备写数据,1500是地址,forlinx是要写入的内容。
(5)利用./readframAPP /dev/pb85rs 1500
(1500是要读取数据的地址)
4 断电测试
断电一天后重新读取PB85RS2MC的数据,创造数据仍旧存在。验证了PB85RS2MC铁电存储芯片的断电数据保留特性。
至此,我们就完成了在OK3568-C开拓板上添加一个新的SPI铁电存储芯片的操作!