Linux RTC设备驱动

硬件平台

  • RiotBoard imx6sol cortex A9
  • linux 3.10
  • RTC 芯片 MC13XXX i2c接口

驱动加载流程

<1> dts
mc13xxx是挂载在I2C下面的一个RTC芯片,和SOC自带RTC外设的方式多了一层I2C和 mc13xxx驱动代码的实例,后面关于RTC核心的内容都是一致的。

a)首先mc13xxx的驱动是在i2c下面实现的。
compatible 如下

static const struct of_device_id mc13xxx_dt_ids[] = {
   
	{
   
		.compatible = "fsl,mc13892",
		.data = &mc13xxx_variant_mc13892,
	}, {
   
		.compatible = "fsl,mc34708",
		.data = &mc13xxx_variant_mc34708,
	}, {
   
		/* sentinel */
	}
};

b)dts 信息如下

&i2c2 {
   
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_i2c2_1>;
	status = "okay";

	pmic: mc13892@08 {
   
		compatible = "fsl,mc13892", "fsl,mc13xxx";
		reg = <0x08>;
	};

	codec: sgtl5000@0a {
   
		compatible = "fsl,sgtl5000";
		reg = <0x0a>;
	};
};

c)底层实现
mc13xxx_i2c.c 主要实现设备和驱动的匹配,使得mc13xxx设备获得操作本身的资源,即i2c driver。

借助I2C驱动,在mc13xxx core.c里面实现RTC基本操作,主要是一些读写寄存器的操作,和中断的访问等。

int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)
int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)

这些个操作会被rtc-mc13xxx所用到实例化一个rtc设备,并在这个里面实现RTC相关的操作。(真是层层套娃呀。)

由于rtc-mc3xxx是一个虚拟出来的rtc设备他的实质是mc13xxx_i2c和mc13xxx的勾搭。(20211121增加,主要原因是,这个RTC设备没有在dts中体现,dts里面展现的是一个挂载在i2c下面的设备,没有办法通过platform_device和platfor_driver 自动匹配,这里直接手动进行匹配)
所以在设备和驱动匹配方面不能够像mc13xxx_i2c里卖弄一样通过dts文件去关联,这里使用了如下函数:

static const struct platform_device_id mc13xxx_rtc_idtable[] = {
   
	{
   
		.name = "mc13783-rtc",
	}, {
   
		.name = "mc13892-rtc",
	}, {
   
		.name = "mc34708-rtc",
	},
	{
    /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, mc13xxx_rtc_idtable);

static struct platform_driver mc13xxx_rtc_driver = {
   
	.id_table = mc13xxx_rtc_idtable,
	.remove = __exit_p(mc13xxx_rtc_remove),
	.driver = {
   
		.name = DRIVER_NAME,
		.owner = THIS_MODULE,
	},
};

module_platform_driver_probe(mc13xxx_rtc_driver, &mc13xxx_rtc_probe);

把RTC的设备和相关的driver匹配起来。
实现了rtc设备和驱动下面的操作:

static const struct rtc_class_ops mc13xxx_rtc_ops = {
   
	.read_time = mc13xxx_rtc_read_time,
	.set_mmss = mc13xxx_rtc_set_mmss,
	.read_alarm = mc13xxx_rtc_read_alarm,
	.set_alarm = mc13xxx_rtc_set_alarm,
	.alarm_irq_enable = mc13xxx_rtc_alarm_irq_enable,
};

上面的 mc13xxx_rtc_read_time 些都是调用 mc13xxx core.c 里面的函数实现的,读写不同寄存器的地址。这个时候RTC底层的设备驱动已经完成了,下面要添加设备文件了。

d)添加设备文件
在上面的底层操作里面,static int __init mc13xxx_rtc_probe(struct platform_device *pdev)是匹配设备和驱动的,匹配完成后会被执行。这个里面主要是设备设备的用的空间,设备的一些资源什么的。

static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
{
   
	int ret;
	struct mc13xxx_rtc *priv;
	struct mc13xxx *mc13xxx;
	int rtcrst_pending;

	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 设备驱动开发详解 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值