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);得到各个子节点的属性