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