手机端 网站 模板,关于网站设计的新闻,磁力猫引擎入口,不用下载的游戏直接玩文章目录 一、输入子系统#xff08;一#xff09;输入子系统框架结构#xff08;二#xff09;输入子系统的API 二、实现两个按键的驱动#xff08;一#xff09;实现思路#xff08;二#xff09;代码实现 一、输入子系统
在linux系统中使用输入子系统驱动上报鼠标一输入子系统框架结构二输入子系统的API 二、实现两个按键的驱动一实现思路二代码实现 一、输入子系统
在linux系统中使用输入子系统驱动上报鼠标键盘触摸屏游戏摇杆等输入类设备上报的事件。当输入子系统驱动被安装到linux内核之后就会在/dev/input/eventX节点如果想要获取上报的输入事件的值直接从这个文件中读取input_event结构类型的数据即可。
一输入子系统框架结构 二输入子系统的API
1.分配对象
struct input_dev *key_dev;
struct input_dev *input_allocate_device(void);
//void input_free_device(struct input_dev *dev);
功能申请input_dev结构体内存
参数无
返回值成功返回首地址失败返回NULL2.对象初始化set_bit(EV_KEY, key_dev—evbit); //设置事件类型set_bit(KEY_L, key_dev—keybit); //可以上报l键set_bit(KEY_S, key_dev—keybit); //可以上报s键set_bit(KEY_ENTER, key_dev—keybit); //可以上报enter键3.注册int input_register_device(struct input_dev *dev)4.注销void input_unregister_device(struct input_dev *dev)5.上报数据
void input_event(struct input_dev *dev,
unsigned int type, unsigned int code, int value)
//上报数据 参数1inpu_dev结构体指针参数2类型参数3那个键参数4值
以下的函数都是在input_event函数基础上做的封装input_report_key(struct input_dev *dev, unsigned int code, int value)void input_report_rel(struct input_dev *dev, unsigned int code, int value)void input_report_abs(struct input_dev *dev, unsigned int code, int value)void input_sync(struct input_dev *dev)二、实现两个按键的驱动
一实现思路
分配对象初始化对象注册对象注销上报数据
二代码实现
#include linux/init.h
#include linux/input.h
#include linux/interrupt.h
#include linux/module.h
#include linux/of.h
#include linux/of_gpio.h
#include linux/of_irq.h
// mykeys{
// interrupt-parent gpiof;
// interrupts 9 0,7 0,8 0;
// keys_no gpiof 9 0,gpiof 7 0,gpiof 8 0;
// };
enum {KEYL,KEYS,KEYEN,
};
struct device_node* node;
unsigned int irqno[3];
int gpiono[3];
struct timer_list mytimer;
struct input_dev* key_dev;void key_irq_timer_func(struct timer_list* timer)
{int i;for (i 0; i ARRAY_SIZE(gpiono); i) {if (!gpio_get_value(gpiono[i])) {switch (i) {case KEYL:input_report_key(key_dev,KEY_L,1);input_report_key(key_dev,KEY_L,0);input_sync(key_dev);break;case KEYS:input_report_key(key_dev,KEY_S,1);input_report_key(key_dev,KEY_S,0);input_sync(key_dev);break;case KEYEN:input_report_key(key_dev,KEY_ENTER,1);input_report_key(key_dev,KEY_ENTER,0);input_sync(key_dev);break;}}}
}
// 中断处理函数
irqreturn_t keys_irq_handle(int irq, void* dev)
{mod_timer(mytimer, jiffies 1); // 再次启动定时器return IRQ_HANDLED;
}
static int __init mykeys_init(void)
{int ret, i;// 1.获取节点node of_find_node_by_name(NULL, mykeys);if (node NULL) {pr_err(of_find_node_by_name error\n);ret -ENODATA;goto err1;}for (i 0; i 3; i) {// 2.获取gpio号gpiono[i] of_get_named_gpio(node, keys_no, i);if (gpiono[i] 0) {pr_err(of_get_named_gpio error\n);ret gpiono[i];goto err1;}// 3.解析得到软中断号irqno[i] irq_of_parse_and_map(node, i);if (irqno[i] 0) {pr_err(irq_of_parse_and_map error\n);ret -EAGAIN;goto err1;}}// 4.初始化并注册输入子系统key_dev input_allocate_device();if (!key_dev) {pr_err(input_allocate_device error\n);ret -ENOMEM;goto err1;}set_bit(EV_KEY, key_dev-evbit); // 设置键盘类事件set_bit(KEY_L, key_dev-keybit); // 可以上报键盘中的L键set_bit(KEY_S, key_dev-keybit); // 可以上报键盘中的S键set_bit(KEY_ENTER, key_dev-keybit); // 可以上报键盘中的ENTER键ret input_register_device(key_dev);if (ret) {pr_err(input_register_device error\n);goto err2;}// 5.初始化并定时器mytimer.expires jiffies 1; // 10mstimer_setup(mytimer, key_irq_timer_func, 0);add_timer(mytimer);for (i 0; i 3; i) {// 6.注册中断ret request_irq(irqno[i], keys_irq_handle,IRQF_TRIGGER_FALLING, key, NULL);if (ret) {pr_err(request_irq error\n);goto err3;}}return 0;
err3:for (--i; i 0; i--) {free_irq(irqno[i], NULL);}del_timer(mytimer);input_unregister_device(key_dev);key_dev NULL;
err2:input_free_device(key_dev);
err1:return ret;
}
static void __exit mykeys_exit(void)
{int i;for (i 0; i 3; i) {free_irq(irqno[i], NULL);}del_timer(mytimer);input_unregister_device(key_dev);
}
module_init(mykeys_init);
module_exit(mykeys_exit);
MODULE_LICENSE(GPL);