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

织梦cms传播公司网站模板长春网络公司十大排名

织梦cms传播公司网站模板,长春网络公司十大排名,房地产交易网站模版,免费小程序网站1.编程思路 1.1在gpio结构体中添加tasklet_struct结构体 1.2在probe函数中初始化tasklet结构体 1.3在中断服务程序中调度tasklet 1.4在这个函数中执行其它任务 2.代码#xff1a; 应用程序和Makefile和上节一致 https://blog.csdn.net/weixin_40933496/article/details/1… 1.编程思路 1.1在gpio结构体中添加tasklet_struct结构体 1.2在probe函数中初始化tasklet结构体 1.3在中断服务程序中调度tasklet 1.4在这个函数中执行其它任务 2.代码 应用程序和Makefile和上节一致 https://blog.csdn.net/weixin_40933496/article/details/143263990?sharetypeblogdetailsharerId143263990sharereferPCsharesourceweixin_40933496spm1011.2480.3001.8118驱动 #include linux/module.h #include linux/fs.h #include linux/errno.h #include linux/miscdevice.h #include linux/kernel.h #include linux/major.h #include linux/mutex.h #include linux/proc_fs.h #include linux/seq_file.h #include linux/stat.h #include linux/init.h #include linux/device.h #include linux/tty.h #include linux/kmod.h #include linux/gfp.h #include linux/gpio/consumer.h #include linux/platform_device.h #include linux/of_gpio.h #include linux/of_irq.h #include linux/interrupt.h #include linux/irq.h #include linux/slab.h #include linux/poll.h #include linux/fcntl.h/* 定义结构体来描述gpio */ struct gpio_key{int gpio;struct gpio_desc* gpiod;int flag;int irq;struct timer_list key_timer;struct tasklet_struct tasklet; };/* 定义全局变量来存储设备树中的所有gpio节点信息 */ static struct gpio_key* gpio_keys_100ask;/* 字符设备的主设备号 */ static unsigned int major 0; static struct class *gpio_class; //static int g_key 0;/* 定义等待队列 */ static DECLARE_WAIT_QUEUE_HEAD(gpio_key_wait); struct fasync_struct * button_fasync;/* 环形缓冲区 */ #define BUF_LEN 128 static int g_keys[BUF_LEN]; static int r, w;#define NEXT_POS(x) ((x1) % BUF_LEN)int is_key_buf_empty(void) {return (r w); }int is_key_buf_full(void) {return (r NEXT_POS(w)); }void put_key(int key) {if (!is_key_buf_full()){g_keys[w] key;w NEXT_POS(w);} }int get_key(void) {int key 0;if (!is_key_buf_empty()){key g_keys[r];r NEXT_POS(r);}return key; }static ssize_t gpio_read(struct file *fp, char __user *buf, size_t size, loff_t * offset) {int err;int key;if(is_key_buf_empty() (fp-f_flags O_NONBLOCK)){return -EAGAIN;}wait_event_interruptible(gpio_key_wait, !is_key_buf_empty());key get_key();//err copy_to_user(buf, g_key, 4);err copy_to_user(buf, key, 4);//g_key 0;//printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 4; }static unsigned int gpio_poll(struct file *fp, struct poll_table_struct *wait) {//printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);poll_wait(fp, gpio_key_wait, wait);return is_key_buf_empty() ? 0 : POLLIN | POLLRDNORM; }static int gpio_fasync(int fd , struct file *file, int on) {//printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);if (fasync_helper(fd, file, on, button_fasync) 0){return 0;}else{return -EIO;} }static const struct file_operations gpio_fops {.owner THIS_MODULE,.read gpio_read,.poll gpio_poll,.fasync gpio_fasync, };static irqreturn_t gpio_key_isr(int irq, void *dev_id) {struct gpio_key* gpio_key dev_id;//int val;//int key;//val gpio_get_value(gpio_key-gpio);//printk(key %d %d\n, gpio_key-gpio, val);//g_key (gpio_key-gpio 8) | val;//key (gpio_key-gpio 8) | val;//put_key(key);//wake_up_interruptible(gpio_key_wait);/* 发信号 *///kill_fasync(button_fasync, SIGIO, POLL_IN);//printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/* 调度tasklet函数 */tasklet_schedule(gpio_key-tasklet);/* 修改定时器超时时间 */printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);mod_timer(gpio_key-key_timer, jiffies HZ / 5);return IRQ_HANDLED; }/* 定时器超时函数 */ static void key_timer_expire(unsigned long arg) {struct gpio_key* gpio_key arg;int val;int key;val gpio_get_value(gpio_key-gpio);//printk(key %d %d\n, gpio_key-gpio, val);//g_key (gpio_key-gpio 8) | val;key (gpio_key-gpio 8) | val;put_key(key);wake_up_interruptible(gpio_key_wait);/* 发信号 */kill_fasync(button_fasync, SIGIO, POLL_IN);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/* 修改定时器超时时间 *///mod_timer(gpio_key-key_timer, jiffies HZ / 5); }/* tasklet处理函数 */ static void key_tasklet_func(unsigned long data) {struct gpio_key* key data;int val;val gpio_get_value(key-gpio);printk(进入了tasklet函数\n);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);printk(key %d value is %d\n, key-gpio, val); }static int gpio_probe(struct platform_device *pdev) {int count, i;struct device_node *node;int err;node pdev-dev.of_node;count of_gpio_count(node);if (!count){printk(%s %s line %d, there isnt any gpio available\n, __FILE__, __FUNCTION__, __LINE__);return -1;}/* 申请资源 */gpio_keys_100ask kzalloc(sizeof(struct gpio_key) * count, GFP_KERNEL);if (!gpio_keys_100ask){printk(kzalloc error\n);return -1;}/* 获得资源 */for (i 0; i count; i){gpio_keys_100ask[i].gpio of_get_gpio(node, i);if (gpio_keys_100ask[i].gpio 0){printk(%s %s line %d, of_get_gpio_flags fail\n, __FILE__, __FUNCTION__, __LINE__);return -1;}gpio_keys_100ask[i].gpiod gpio_to_desc(gpio_keys_100ask[i].gpio);gpio_keys_100ask[i].irq gpio_to_irq(gpio_keys_100ask[i].gpio);/* 申请中断 */err request_irq(gpio_keys_100ask[i].irq, gpio_key_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, test1_gpio_keys_100ask, gpio_keys_100ask[i]);if (err) {printk(request_irq err\n);}/* 设置定时器 */setup_timer(gpio_keys_100ask[i].key_timer, key_timer_expire, gpio_keys_100ask[i]);//设置定时器超时时间为无穷gpio_keys_100ask[i].key_timer.expires ~0;/* 添加定时器 */add_timer(gpio_keys_100ask[i].key_timer);/* 初始化tasklet */tasklet_init(gpio_keys_100ask[i].tasklet, key_tasklet_func, gpio_keys_100ask[i]);}/* 注册字符设备 */major register_chrdev(major, 100ask_key, gpio_fops);if(major 0){printk(register_chrdev err\n);return -1;}/* 注册类 */gpio_class class_create(THIS_MODULE, 100ask_key_class);/* 注册设备 */device_create(gpio_class, NULL, MKDEV(major,0), NULL, 100ask_key_button);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }static int gpio_remove(struct platform_device *pdev) {int count, i;struct device_node *node;node pdev-dev.of_node;count of_gpio_count(node);device_destroy(gpio_class, MKDEV(major,0));class_destroy(gpio_class);unregister_chrdev(major, 100ask_key);for (i 0; i count; i){free_irq(gpio_keys_100ask[i].irq, gpio_keys_100ask[i]);}kfree(gpio_keys_100ask);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }/* * 在设备树中添加的节点的compatible属性为test1_100ask,test1_gpio_key */ static const struct of_device_id gpio_key_of_match[] {{.compatible test1_100ask,test1_gpio_key},{/* 这里必须要有一个空项表示结束 */} };static struct platform_driver gpio_driver {.driver {.name test1_gpio_keys_100ask,.of_match_table gpio_key_of_match,},.probe gpio_probe,.remove gpio_remove, };/* 基于platform总线来实现这个程序 */ static int gpio_init(void) {int ret;ret platform_driver_register(gpio_driver);if (ret ! 0){printk(platform_driver_register err\n);return -1;}else{printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);}return ret; }static void gpio_exit(void) {platform_driver_unregister(gpio_driver);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__); }module_init(gpio_init); module_exit(gpio_exit); MODULE_LICENSE(GPL); 3.运行结果 由运行结果可知在驱动中检测到两次按键按压事件(tasklet函数被调用两次)由于上节中的定时器消抖导致key_timer_expire函数只被调用了一次故read函数只执行了一次应用程序只能获取后一个按键值。 4.代码路径 /home/book/nfs_rootfs/CSDN/01_gpio_irq/08_read_key_irq_poll_fasync_block_timer_tasklet
http://www.hkea.cn/news/14368798/

相关文章:

  • 做昆特牌的网站北京有名的广告公司
  • 如何给网站添加搜索关键字网站查询功能怎么做
  • 爱站网seo旅游网站建设的概念
  • 网站标题应该怎么做SEO优化wordpress 响应式
  • 网站建设投资wordpress设置301重定向
  • 深圳公司网站如何设计网站开发工程
  • 做公开网站的步骤小程序开发教程pdf
  • 一般网站建设中的推广费用建设专业网站排名
  • 免费素材库下载便宜营销型网站建设优化建站
  • 园林网站源代码微博广告
  • 国内外高校门户网站建设免费建立小程序网站
  • 山西房地产网站建设品牌建设规划制定情况
  • 门户网站名词解释建网站做相亲
  • 500m主机空间能做视频网站吗装潢设计就业前景
  • 策划网站做推广的公司官方新闻平台有哪些
  • 中国建设银行网站上不去河南省近期新闻热点
  • 合肥高端网站扬州网站建设企业
  • 设置一个网站到期页面怎么样提升自己的学历
  • 网站开发 分类编码中国建设银行官网站保本理财
  • 简洁大气网站模板企业邮箱怎么申请的
  • 苏州市住房城乡建设局网站在百度搜不到网站
  • 网站做关键词链接有用吗惠州市网站制作公司
  • jsp网站开发四酷全书小程序模板源码免费下载
  • h5哪个网站可以做上海市建设监理协会网站查询
  • 要建立网站是否要先做网页设计_然后把网页设计与数据库连接起来?营销网站与传统网站的区别
  • dw网站导航怎么做个人网站如何备案
  • 瑞金网站建设光龙电子商务网站规划与设计
  • 运营好还是网站开发好wordpress和织梦百度收录
  • 网站建设和维护待遇怎样建站至尊
  • 英国小子做房产网站上海专业做网站的