红外遥控器的驱动函数

rockchip_pwm_remotectl.c为一个红外遥控器的驱动函数,资源由dts提供:

1030 &pwm0 {
1031     compatible = "rockchip,remotectl-pwm";
1032     remote_pwm_id = <0>;
1033     handle_cpu_id = <1>;
1034     status = "okay";
1035 ir_key{
1036         rockchip,usercode = <0xff00>;
1037         rockchip,key_table =
1038             <0xf5   KEY_POWER>,
1039             <0xef   KEY_ENTER>,
1040             <0xea   KEY_HOMEPAGE>,
1041             <0xbf   KEY_BACK>,
1042             <0xed   KEY_MENU>,
1043             <0xf3   KEY_UP>,
1044             <0xf2   KEY_DOWN>,
1045             <0xf1   KEY_LEFT>,
1046            // <0xf1   BTN_LEFT>,
1047             <0xec   KEY_F8>,
1048             <0xeb   KEY_F9>,
1049             <0xf0   KEY_RIGHT>,
1050             //<0xf0   BTN_RIGHT>,
1051             <0xee   KEY_BACK>,
1052             <0x0b   KEY_VOLUMEUP>,
1053             <0x58   KEY_VOLUMEDOWN>;
1054     };
1055 };

在驱动中首先调用rk_pwm_probe,函数为rkxx_remotectl_drvdata内存的申请和初始化,并且申请必要资源和获取dts中的设备资源。
本系统有三个中断服务函数分别为:
Pwm中断,定时器中断,和软件中断。
在pwm中断中来触发软件中断来上报获取到的按键值,用定时器中断来检测按键抬起。
涉及内容:
Dts的数据获取。
定时器的创建
中断的创建
Wake_lock锁机制
Tasklet机制
输入子系统
电源管理标志(唤醒系统)

结点调用顺序
of_match_table中的.compatible成员 和设备树进行匹配(最后一个必须为空作为结束符)
匹配成功则调用probe函数,并将platform_device *pdev 传递下来(platform_device *pdev为设备树创建时自动创建,只会创建根目录下的一级子节点,并将结点保存在dev->node中)
通过 子节点名称=of_find_node_by_name(np, “子节点名称”);获得子节点的指针。也可以通过for_each_child_of_node (node, child)遍历子节点(为一个 for循环),在for循环中通过函数:
属性值 = of_get_property(*np,"子节点属性名, len);得到各个子节点的属性

猜你喜欢

转载自blog.csdn.net/qq_31878855/article/details/89874268