i.MX6ULL终结者Linux RTC驱动实验i.MX6UL下的RTC驱动

本文详细解析了NXP i.MX6ULL平台下RTC驱动的工作原理,包括设备树配置、驱动匹配、内存映射、中断处理以及RTC时间读取。通过分析rtc-snvs.c文件,阐述了如何通过regmap机制操作RTC硬件寄存器,并注册rtc_device,实现RTC功能。
摘要由CSDN通过智能技术生成

RTC是一个非常普遍的设备,因此一般厂家都会编写好,所以NXP官方已经实现好了,不用我们自己去写了。但是我们要了解RTC驱动是如何实现的,下面就来分析一下。
RTC作为一个设备,就需要有设备信息和驱动,先来看一下设备信息是如何在设备树中实现的。打开imx6ull.dtsi文件,找到snvs_rtc设备节点,节点内容如下:

1 snvs_rtc: snvs-rtc-lp {
    
2 		compatible = "fsl,sec-v4.0-mon-rtc-lp"; 
3 		regmap = <&snvs>; 
4 		offset = <0x34>;
5 		interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 20 
IRQ_TYPE_LEVEL_HIGH>; 
6 };

第2行,指定了compatible属性值的信息为“fsl,sec-v4.0-mon-rtc-lp”,所以在Linux内核中根据compatible属性值信息就可以找到对应的驱动文件,此文件为drivers/rtc/rtc-snvs.c,在 rtc-snvs.c 文件中有如下所示内容:

380 static const struct of_device_id snvs_dt_ids[] = {
    
381 		{
    .compatible = "fsl,sec-v4.0-mon-rtc-lp", }, 
382 		{
    /* sentinel */ } 
383 }; 
384 MODULE_DEVICE_TABLE(of, snvs_dt_ids); 
385 
386 static struct platform_driver snvs_rtc_driver = {
    
387 		.driver = {
    
388 			.name = "snvs_rtc", 
389 			.pm = SNVS_RTC_PM_OPS, 
390 			.of_match_table = snvs_dt_ids, 
391 		}, 
392 		.probe = snvs_rtc_probe, 
393 }; 
394 module_platform_driver(snvs_rtc_driver);

第381行,compatible的值也是“fsl,sec-v4.0-mon-rtc-lp”,这样才能匹配成功。
其他的内容就是标准的platform框架的内容,然后来看一下,当设备和驱动匹配成功后,执行的snvs_rtc_probe函数中有哪些内容:

238 static int snvs_rtc_probe(struct platform_device *pdev) 
239 {
    
240        struct snvs_rtc_data *data; 
241        struct resource *res; 
242        int ret; 
243        void __iomem *mmio; 
244 
245        data = devm_kzalloc(&pdev->dev, sizeof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值