5224|4

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【周立功ARM9 imx28学习第四天】 [复制链接]

本帖最后由 qq670300923 于 2016-8-14 20:53 编辑

    昨天断网了,时间过的真快,没想到已经来北京实训一个月了。(网正好是办的是一个月)好了不多说,下面来看看按键驱动(中断+工作队列+内核定时器去抖),是不是感觉有点多呢
    1.首先写的是内核代码,也就不多说了(前面已经说了,不了解的可以看第二天)。        
    2.来看看我init里面的代码
  1. static int __init button_init(void)
  2. {
  3.         int iRet=0;
  4.         misc_register(&key_miscdev);
  5.         key_hw_init();
  6.         iRet = request_irq(205,key_int,IRQF_TRIGGER_FALLING,"zlg_key1",NULL);
  7.         iRet = request_irq(204,key_int,IRQF_TRIGGER_FALLING,"zlg_key2",NULL);
  8.         iRet = request_irq(196,key_int,IRQF_TRIGGER_FALLING,"zlg_key3",NULL);
  9.         iRet = request_irq(197,key_int,IRQF_TRIGGER_FALLING,"zlg_key4",NULL);
  10.         iRet = request_irq(198,key_int,IRQF_TRIGGER_FALLING,"zlg_key5",NULL);
  11.         if(iRet==0)
  12.         {
  13.                 printk("irq success\n");
  14.         }
  15.         else
  16.         {
  17.                 printk("irq flast,tip:%d\n",iRet);
  18.         }
  19.         //创建工作
  20.         
  21.         INIT_WORK(&buttons_work,buttons_do_func);
  22.         buttons_work.func = buttons_do_func;
  23.         
  24.         //初始化定时器
  25.         init_timer(&buttons_timer);
  26.         buttons_timer.function = buttons_do_timer;
  27.         
  28.         //注册一个定时器
  29.         add_timer(&buttons_timer);
  30.         
  31.         
  32.         return 0;
  33. }
复制代码
首先是misc_register(&key_miscdev)注册一个混杂设备,key_miscdev我就不多说了。(不知道可以看看我的第三天) 接在来就是硬件初始化了(这里是配置成外部中断模式),

按照这个配置寄存器,这个在数据手册的687页。(这个应该没有什么问题吧)。下面就是request_irq这个函数了,
可以看看函数原型int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags, const char *devname, void *dev_id) 这个函数挺长的,这里的我本来应该是申请GPIO中断的,
(这个在数据手册的139页)
但是我申请的时候发现申请不了,可能是内核源码给GPIO中断再加了一次吧,实在没有办法,我就看看周立功他们给的源码,可以看到他们使用的是函数获得中断号,然后我就修改了一个下得到了我要的GPIO的中断号,具体怎么是这个中断号我没有看,现在先直接拿来用吧。
    irq_handler_t handler 这个是中断处理函数,这个再也熟悉不过了,写stm32这类芯片代码时都要用的。
    unsigned long flags 表示中断的属性
    const char *devnam 表示设备名字
    void *dev_id 共享中断使用的(这没有用到,使用NULL)
    接下来当然是INIT_WORK(&buttons_work,buttons_do_func);这个是初始化工作队列的我这里的工作队列是当中断来的时候可以让中断函数执行很少的代码,就相当于当中断来的时候,注册了一个任务(函数名buttons_do_func),等待调度,从而不会出现在中断函数里太久(linux运行是要触发中断)。
    最后是 add_timer(&buttons_timer); 这个函数是相当于我们写裸机开发是我们使用的延时函数,这样是为了消除按键抖动的影响。
   下面我就讲一下程序执行的过程(我就不画图表了哈),首先insomd加载模块 执行button_init这个函数,当我们按下按键是触发中断执行buttons_do_func,mod_timer(&buttons_timer, jiffies + (HZ /10)); 这个函数设置等待时间。当时间到时候操作系统调度进入buttons_do_timer函数。
可以看到我使用的短路器。按下上面的按键可以看下图效果
  
   

key.zip

17.97 KB, 下载次数: 26

此帖出自Linux开发论坛

最新回复

楼主,这个板子可以ping通外网吗?  详情 回复 发表于 2016-8-15 09:08

赞赏

1

查看全部赞赏

点赞(1) 关注

回复
举报

2774

帖子

8

TA的资源

版主

沙发
 
不错,还去参考实训,还是论月的,真不容易
此帖出自Linux开发论坛

点评

没有哦 学校是三加一的 在北京实训两三个月  详情 回复 发表于 2016-8-15 08:32
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
strong161 发表于 2016-8-14 22:47
不错,还去参考实训,还是论月的,真不容易

没有哦 学校是三加一的 在北京实训两三个月
此帖出自Linux开发论坛
 
 
 

回复

129

帖子

3

TA的资源

一粒金砂(中级)

4
 
楼主,这个板子可以ping通外网吗?
此帖出自Linux开发论坛

点评

这个我还没有试过 应该要设置为自动获取IP 然后再ping  详情 回复 发表于 2016-8-15 10:09
 
个人签名游离在码农与网工之间
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

5
 
eeliu 发表于 2016-8-15 09:08
楼主,这个板子可以ping通外网吗?

这个我还没有试过 应该要设置为自动获取IP 然后再ping
此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表