免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3808 | 回复: 1
打印 上一主题 下一主题

菜鸟请大神分析一个旋转编码器的驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-06 20:34 |只看该作者 |倒序浏览
小弟最近在做一个旋转编码器的驱动程序,probe执行成功,但在执行中断处理程序时出现如下错误,请各位大神帮忙分析一下,小弟先在此谢过~~

  1. Unable to handle kernel NULL pointer dereference at virtual address 00000008
  2. pgd = c0004000
  3. [00000008] *pgd=00000000
  4. Internal error: Oops: 17 [#1] PREEMPT
  5. Modules linked in: 8192cu
  6. CPU: 0    Not tainted  (2.6.31 #28)
  7. PC is at rotary_encoder_irq+0x14/0x198
  8. LR is at rotary_encoder_irq+0x10/0x198
  9. pc : [<c02306e0>]    lr : [<c02306dc>]    psr: 40000093
  10. sp : c0451f28  ip : 00002cab  fp : 00000000
  11. r10: 4001e758  r9 : c0450000  r8 : 00000001
  12. r7 : 000000c7  r6 : c0458100  r5 : 00000000  r4 : c38d1000
  13. r3 : c0451f50  r2 : c0451f1c  r1 : c03fcf21  r0 : 00000011
  14. Flags: nZcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
  15. Control: 0005317f  Table: 43be0000  DAC: 00000017
  16. Process swapper (pid: 0, stack limit = 0xc0450270)
  17. Stack: (0xc0451f28 to 0xc0452000)
  18. 1f20:                   c38d1000 00000000 00000000 c0069590 c38d1000 c045e954
  19. 1f40: 000000c7 c045b0c4 00000001 c006b300 00000000 000000c7 00000012 c0034a24
  20. 1f60: 00000012 00000000 c001fca4 00000002 00000001 c0025068 ffffffff f0000000
  21. 1f80: c001fca4 c0025a04 2625a000 80000013 00001000 60000013 c0450000 c001fca8
  22. 1fa0: c001fca4 c04542f0 4001e78c 41069265 4001e758 00000000 c0458240 c0451fd0
  23. 1fc0: c0026d58 c0030e1c 60000013 ffffffff c04887c4 c0008a5c c00085f0 00000000
  24. 1fe0: 00000000 c001fca8 00000000 00053175 c0480a44 40008034 00000000 00000000
  25. [<c02306e0>] (rotary_encoder_irq+0x14/0x198) from [<c0069590>] (handle_IRQ_event+0x3c/0x10c)
  26. [<c0069590>] (handle_IRQ_event+0x3c/0x10c) from [<c006b300>] (handle_level_irq+0xc0/0x140)
  27. [<c006b300>] (handle_level_irq+0xc0/0x140) from [<c0034a24>] (mxs_gpio_irq_handler+0x68/0x98)
  28. [<c0034a24>] (mxs_gpio_irq_handler+0x68/0x98) from [<c0025068>] (_text+0x68/0x84)
  29. [<c0025068>] (_text+0x68/0x84) from [<c0025a04>] (__irq_svc+0x44/0x8c)
  30. Exception stack(0xc0451f88 to 0xc0451fd0)
  31. 1f80:                   2625a000 80000013 00001000 60000013 c0450000 c001fca8
  32. 1fa0: c001fca4 c04542f0 4001e78c 41069265 4001e758 00000000 c0458240 c0451fd0
  33. 1fc0: c0026d58 c0030e1c 60000013 ffffffff
  34. [<c0025a04>] (__irq_svc+0x44/0x8c) from [<c0030e1c>] (mx23_pm_idle+0x74/0x7c)
  35. [<c0030e1c>] (mx23_pm_idle+0x74/0x7c) from [<c0026d58>] (cpu_idle+0x60/0xb8)
  36. [<c0026d58>] (cpu_idle+0x60/0xb8) from [<c0008a5c>] (start_kernel+0x220/0x268)
  37. [<c0008a5c>] (start_kernel+0x220/0x268) from [<40008034>] (0x40008034)
  38. Code: e59f0170 e1a06001 eb0401f0 e5965004 (e5950008)
  39. Kernel panic - not syncing: Fatal exception in interrupt
复制代码
中断处理程序源码如下:

  1. static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
  2. {
  3.         struct rotary_encoder *encoder = dev_id;
  4.         struct rotary_encoder_platform_data *pdata = encoder->pdata;
  5.         int a = !!gpio_get_value(pdata->gpio_a);
  6.         int b = !!gpio_get_value(pdata->gpio_b);
  7.         int state;

  8.         a ^= pdata->inverted_a;
  9.         b ^= pdata->inverted_b;
  10.         state = (a << 1) | b;

  11.         switch (state) {

  12.         case 0x0:
  13.                 if (!encoder->armed)
  14.                         break;

  15.                 if (pdata->relative_axis) {
  16.                         input_report_rel(encoder->input, pdata->axis,
  17.                                          encoder->dir ? -1 : 1);
  18.                 } else {
  19.                         unsigned int pos = encoder->pos;

  20.                         if (encoder->dir) {
  21.                                 /* turning counter-clockwise */
  22.                                 if (pdata->rollover)
  23.                                         pos += pdata->steps;
  24.                                 if (pos)
  25.                                         pos--;
  26.                         } else {
  27.                                 /* turning clockwise */
  28.                                 if (pdata->rollover || pos < pdata->steps)
  29.                                         pos++;
  30.                         }
  31.                         if (pdata->rollover)
  32.                                 pos %= pdata->steps;
  33.                         encoder->pos = pos;
  34.                         input_report_abs(encoder->input, pdata->axis,
  35.                                          encoder->pos);
  36.                 }
  37.                 input_sync(encoder->input);

  38.                 encoder->armed = false;
  39.                 break;

  40.         case 0x1:
  41.         case 0x2:
  42.                 if (encoder->armed)
  43.                         encoder->dir = state - 1;
  44.                 break;

  45.         case 0x3:
  46.                 encoder->armed = true;
  47.                 break;
  48.         }

  49.         return IRQ_HANDLED;
  50. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-07 11:12 |只看该作者
求大神,求指导……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP