找回密码
 注册
关于网站域名变更的通知
查看: 624|回复: 2
打印 上一主题 下一主题

RK3568笔记分享之如何挂载SPI FRAM铁电存储芯片——飞凌嵌入式/PB85RS2MC

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2023-9-22 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 飞凌嵌入式 于 2023-9-22 15:18 编辑
# V# ~4 H+ G* d! f. r/ u0 U( |) P; t* o, Y6 r, n
对于做快速存储采集数据类产品的用户来说,在处理突发掉电情况时需要保存现有数据并避免数据丢失,这种情况下有很多种解决方案,铁电存储器(FRAM) 就是个很好的选择。FRAM是一种具有快速写入速度的非易失性存储器,既可以进行非易失性数据存储,又可以像RAM一样操作。

0 i' m3 ~. J$ z
本文将借助飞凌嵌入式OK3568-C开发板来为大家介绍一种采用FRAM的方案——使用SPI0挂载PB85RS2MC (FRAM) 芯片。本文所描述的驱动文件和应用文件,可联系飞凌嵌入式的技术支持获取。

- M7 h# S3 _# v7 j- _1 d
* R. o; J) ~. Y: j1 C; X
修改思路——
我们要添加一个SPI设备,需要进行如下操作:在设备树中添加描述→设备树描述中对应设备驱动→设备驱动添加到内核。
修改结果——
修改 OK3568-linux-source/kernel/arch/ARM64/boot/dts/rockchip/OK3568-C-common.dtsi
修改如下:

2 r/ N6 {$ x" ~) \" X; g# Y
6 z! Y' T/ g1 n9 t, i
接下来笔者为大家介绍一下适配的过程。

3 i& Y- G# ^. ^7 Z8 z3 m
1 l+ }" E, P& H& }4 O/ P
1 驱动程序

2 H% a5 {0 W; l9 M. e% q
我们在menuconfig中搜索fm25、pb85等比较常用的FRAM字眼,发现并没有类似的驱动程序,这时就需要手写或者移植一个驱动程序。在搜遍各大网站之后找到了一个W25Q64的驱动,对比了一下PB85RS2MC的各种操作码以后,发现两者的操作码大差不差,因此就决定将W25Q64的驱动移植过来。根据PB85RS2MC芯片手册中叙述,各种操作码为:
. {! i( ]& e( \& |! v. U
因此,在驱动程序中宏定义以下操作码,以便在接下来的驱动程序中使用:

! f- y1 r/ |5 a1 N
首先要在驱动程序中进行初始化函数和退出函数,也就是spidev_init和spidev_exit,init函数里就是进行字符设备的初始化,注册等的操作,exit函数就是要把我们注册的东西在退出时都释放掉,再者就是驱动程序和设备树匹配,匹配是通过compatible属性值匹配的,这里我们一定要和设备树中的compatible属性值一致,否则会匹配不成功。驱动程序中.compatible值如下图所示。
2 T: H' ^& {, T4 m
驱动和设备树匹配成功以后就要执行probe函数,这里probe函数执行了一些初始化和注册主次设备号的操作。我们可以通过是否打印spi_probe success!来判断驱动程序,是否和设备树匹配成功。
  l2 A$ q; i9 }* a
从PB85RS2MC芯片手册中看读的条件,读取FRAM存储单元的数据,需要READ的操作码,任意24位地址输入到SI。第一个spi_transfer 结构体用于发送命令cmd 到SPI设备,在读取数据之前准备设备,第二个是发送地址到SPI设备,第三个是接收从设备读取的数据。

* t/ K3 z7 b  Q2 F& y
这段代码实现了从 SPI设备中同步读取数据,并将数据复制到用户空间的功能。
% J; K: K4 v) N4 n9 p/ W* X5 h
从PB85RS2MC芯片手册中看写的条件,WREN命令用于设置写使能锁存器。需要在写操作(WRITE命令) 之前使用WREN命令设置写使能锁存器,WRITE命令将数据写入 FRAM存储单元阵列。WRITE操作码、任意24位地址和8位写入数据输入到 SI。
下面这段代码实现了向SPI设备发送写入使能命令的功能。

( |8 @& h. L& q# X( }
这段代码实现了向SPI设备同步写入数据的功能。它先发送写入使能命令,然后发送地址信息和数据。

$ k1 G3 X: S3 U5 S
下面这段代码向 SPI设备中同步写入数据的功能,将用户空间的数据复制到设备的发送缓冲区,并调用spidev_sync_write 函数将数据写入SPI 设备。

3 w; U" H" X- i- e. e8 w
6 z  h8 n; ^& l# N! `' W
' P/ {% U  }* ~1 c! t  q0 A

( r# X' B% V# n' @7 R/ ]1 C; a2 应用程序

6 F" X6 z+ }0 k" a! G9 t3 Q2 M  I
向SPI设备写数据,调用lseek来改变写入数据的位置,这样就可以在整个SPI设备里写数据,如./writeframAPP /dev/pb85rs 0 forlinx
(0是要写入的地址,forlinx是要写入的内容)。

5 F+ T, S) {( `5 h: X& y
从SPI设备读数据,调用lseek来改变读取数据的位置,这样就可以在整个SPI设备里读数据,如./readframAPP /dev/pb85rs 0
(0是要读取数据的地址)
& m) f; z  o, ~! }* k- P7 [
0 i: A8 |. p4 n/ [$ _; g' o# Q2 c
  P6 D' z4 w# L
% N! s3 G" Y: m- f9 H6 r& D
3 实际测试
, k( Y- s. {, P2 P, X- o
& x: \: E4 |: k& ~; k8 [4 K" }' T

1 L2 o2 Q# A, v1 r' ^% S(1)首先将fram.ko, readframAPP, writefram APP拷贝到OK3568-C开发板的任意文件夹中。
% N2 Y& n/ N. m) o
2)用insmod加载fram.ko模块,出现spi_probe success!说明驱动和设备树匹配成功。

$ Y  z' n$ N' R5 v  _: |2 c
(3)在/dev/下看有没有pb85rs设备。

' _- {2 T1 X& m0 K) a- Z
(4)使用./writeframAPP /dev/pb85rs 1500 forlinx
向设备写数据,1500是地址,forlinx是要写入的内容。
/ r6 |2 @4 v2 B: q! p* \6 q. O4 A
(5)使用./readframAPP /dev/pb85rs 1500
(1500是要读取数据的地址)
0 y  w0 D7 t5 ^) O& E

7 y6 B7 {  _9 G
5 m- J' u8 I( m" ]3 s
9 z) [% p( T# Z* X# J5 H0 B
4 断电测试
* j3 s+ n/ d$ N# ^
断电一天后重新读取PB85RS2MC的数据,发现数据仍然存在。验证了PB85RS2MC铁电存储芯片的断电数据保留特性。
) p9 m; m/ M4 R  B3 H' m. W* |

8 C* _0 n; m9 K" f% A
至此,我们就完成了在OK3568-C开发板上添加一个新的SPI铁电存储芯片的操作!

1 D+ [5 C! `  D1 O, X# j7 M9 j9 \
  U$ d1 k( y% D: }5 v7 D

该用户从未签到

2#
发表于 2023-9-22 17:23 | 只看该作者
驱动程序很详细
  • TA的每日心情

    2024-4-10 15:19
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    3#
    发表于 2023-10-16 15:27 | 只看该作者
    PCB快速抄板打样,批量加急生产超快样板:8小时样板出货超快批量;24小时 48小时批量加急    电话 微信同号198769163190
    & h8 y$ R& r1 R* ]! g
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-9-4 12:48 , Processed in 0.140625 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表