当前位置: 首页 > news >正文

网站建设算不算固定资产大连做网站比较好的公司

网站建设算不算固定资产,大连做网站比较好的公司,北京旧房改造装修哪家好,个人网站可以做淘宝客网站吗文章目录 一、输入子系统(一)输入子系统框架结构(二)输入子系统的API 二、实现两个按键的驱动(一)实现思路(二)代码实现 一、输入子系统 在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)
//上报数据 参数1:inpu_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)

二、实现两个按键的驱动

(一)实现思路

  1. 分配对象
  2. 初始化对象
  3. 注册对象
  4. 注销
  5. 上报数据

(二)代码实现

#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");
http://www.yayakq.cn/news/355050/

相关文章:

  • 北京网站建设收费桂林网站seo
  • 企业网站可概括为推荐家居企业网站建设
  • 网站开发的广告词如何制作一个购物平台
  • 网站开发人员绩效考核泰州市建设工程招标网
  • 如何做大型网站百度词条官网入口
  • 西安网站制作服务商湖南基础建设投资集团网站
  • 手机wap网站大全如何查看vs中建设好的网站
  • 怎么把网站设置为信任网站果农在哪些网站做推广
  • 建一个网站模板网eclipse开发网站用vue做前端
  • 陕西省建设工程质量监督局网站免费自助开通网站
  • 网站开发存在的问题京东企业采购平台
  • 用python做的大型网站网站设计实验报告内容与步骤
  • 网站建设及规划方案阜阳室内设计学校
  • 黄陂建设网站百度快照怎么删除
  • 钦州建站哪家好商城网站建设运营合同书
  • 找人做网站需要注意问题网站备案密码收不到
  • 网站备案 在哪里网站在网络文化建设方面的成果
  • 南通小企业网站建设中装建设股价
  • wordpress install.phpseo专业实战培训
  • 门户网站首页设计项目介绍ppt模板
  • 单页网站是什么专业彩票网站开发
  • 网站允许flash黔农生态现货交易平台
  • 淄博网站seo根据网站做app
  • 网站空间免费 优帮云wordpress如何迁移
  • 长沙市网站推广电话吉祥又成功的公司名字
  • html 网站开发黑龙江省特种证查询
  • 369网站建设有什么做礼品的卖家网站
  • 自己如何建立一个网站什么叫H5网站开发
  • 网站建设的作用和用途云校网站建设
  • 网站内容好双流兴城投资建设有限公司网站