系统版本:Ubuntu18.04-64
编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1)
uboot版本:2018.07 -linux4sam_6.0
板子型号:at91sama5d3x-xplained
MCU型号:sama5d36
RTC型号:RX8025T
[Datasheet] RX8025T时钟芯片解读
RX8025T和RX8025SA有点区别,主要是时间寄存器的移位上面有差异;
属于爱普生公司的设计,EPSON,这个信息对于内核查找对应的驱动很有帮助。
一、启动板子查看内核启动信息
系统时钟的rtc,从打印信息可以看出,是使用cpu内部的rtc寄存器,而非外部的RX8025芯片,作为rtc0供系统读取调用;
qt1070 1-001b: ID 206 not supported
at91_rtc fffffeb0.rtc: registered as rtc0
at91_rtc fffffeb0.rtc: AT91 Real Time Clock driver.
i2c /dev entries driver
系统调用/dev/rtc0, 这是一个软链接,相当于调用的是at91内部的rtc寄存器,不是我们想要的。
二、如果你不知道调用内部rtc是哪个文件里面的函数,有个很简单的方法,到rtc文件夹下面看看哪个文件被编译成了.o文件。
cd drivers/rtc
ls *.o
linux-at91-linux-4.19-at91\drivers\rtc\rtc-at91rm9200.c这个文件有对应的.o;
打开Makefile文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075751758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
可以看到是通过宏CONFIG_RTC_DRV_AT91RM9200选择编译的;
三、让这个宏不生效,修改默认配置文件,进行裁剪
arch/arm/configs/sama5_defconfig
CONFIG_RTC_DRV_AT91RM9200=y
改为:
# CONFIG_RTC_DRV_AT91RM9200 is not set
四、进入图形化配置界面,选择EPSON的8025芯片选型
make menuconfig
Device Drivers —>
[*] Real Time Clock --->
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075808222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075815288.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
可以看到官网给出的例程为Epson RX-8025SA/NB,如果你使用的芯片刚好是RX-8025SA就可以直接使用,RX-8025T的芯片要做修改,不然时间总是错的,会发现校时后过几个小时,就乱了。
保存退出,直接编译,8025的驱动就调试好了。
驱动文件在drivers/rtc/rtc-8025.c里面。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075825988.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
在文件系统中调用函数测试一下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075834819.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
读取时间 hwclock -r
设置时间 hwclock -w
还可以添加一些打印信息在驱动里面,查看对应的寄存器数据。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075843488.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075850403.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
两款芯片的区别主要在于寄存器的读取数据这里;
对寄存器的读取操作做了如下修改:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075858196.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)
更多linux知识点推荐:
[linux kernel]内核启动阶段控制IO口时序输出
[职场吐槽]如何缓解焦虑
[linux kernel] 内核下ksz8081驱动调试
[linux kernel] 内核下ksz9031驱动调试
[linux kernel]内核图形化裁剪配置
[linux kernel]内核移植过程记录
[linux kernel] 内核启动流程梳理
[linux 底层]u-boot EMMC驱动
[linux 底层]u-boot图形化裁剪配置
[Linux 底层]U-boot ksz9031网络驱动调试
[Linux 底层]U-boot调试命令使用技巧
[Linux 底层]U-boot编译移植
[Linux 底层]U-boot烧录脚本介绍SecureCRT
[Linux 底层]bootstrap移植裁剪及编译
[Linux 底层] 平台软件分层介绍
[Linux 驱动] RS485测试程序编写
[Linux 驱动] CAN测试程序编写
推荐阅读:
芯片手册解读 | Linux底层 | 职场吐槽 | C语言视频
关注微信公众号,回复“rtc8025驱动”,下载启动文件源代码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210513075657427.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc3MTg1Mw==,size_16,color_FFFFFF,t_70)