主题 : mini2440 linux2.6.32.2中i2c_master_send函数有bug?! 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 11611
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2009-12-14
最后登录: 2018-02-08
楼主  发表于: 2010-07-07 15:31

 mini2440 linux2.6.32.2中i2c_master_send函数有bug?!

我在我的i2c驱动中使用i2c_master_send函数发送数据就会使得内核(2.6.32.2 for mini2440)崩溃,注释掉i2c_master_send后,就正常的,内核崩溃信息如下,各位大侠有能不能看出什么问题?

复制代码
  1. Unable to handle kernel NULL pointer dereference at virtual address 00000000
  2. pgd = c0004000
  3. [00000000] *pgd=00000000
  4. Internal error: Oops: 17 [#1]
  5. last sysfs file: /sys/devices/platform/s3c2440-i2c/i2c-0/0-005c/input/input0/event0/dev
  6. Modules linked in: i2c_ts
  7. CPU: 0    Not tainted  (2.6.32.2-FriendlyARM #9)
  8. PC is at s3c24xx_i2c_irq+0x32c/0x3dc
  9. LR is at handle_IRQ_event+0x60/0x130
  10. pc : [<c0251fdc>]    lr : [<c0071500>]    psr: 80000093
  11. sp : c04c3eb8  ip : 00000000  fp : c04c3edc
  12. r10: 3001fb24  r9 : 41129200  r8 : 00000004
  13. r7 : ffffffea  r6 : 00000000  r5 : c382df24  r4 : c3841c00
  14. r3 : 00000001  r2 : 00000000  r1 : c382df30  r0 : c480c000
  15. Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
  16. Control: c000717f  Table: 339dc000  DAC: 00000017
  17. Process swapper (pid: 0, stack limit = 0xc04c2270)
  18. Stack: (0xc04c3eb8 to 0xc04c4000)
  19. 3ea0:                                                       c3830d40 00000000
  20. 3ec0: 00000000 0000002b 3001fb58 41129200 c04c3efc c04c3ee0 c0071500 c0251cc0
  21. 3ee0: c04cbeec c3830d40 0000002b c0526fec c04c3f1c c04c3f00 c0073000 c00714b0
  22. 3f00: 0000002b c04d832c 00000000 c04c6448 c04c3f3c c04c3f20 c0030044 c0072f68
  23. 3f20: ffffffff f4000000 08000000 c04c6448 c04c3f94 c04c3f40 c0030b04 c0030010
  24. 3f40: f4100000 00000032 f4100000 60000013 c04c2000 c05038a4 c04c6450 c04c6448
  25. 3f60: 3001fb58 41129200 3001fb24 c04c3f94 c04c3f98 c04c3f88 c003264c c0032064
  26. 3f80: 60000013 ffffffff c04c3fb4 c04c3f98 c003264c c0031fe4 c052706c c0503640
  27. 3fa0: c0021000 c04c6448 c04c3fc4 c04c3fb8 c0392ebc c00325e4 c04c3ff4 c04c3fc8
  28. 3fc0: c00089a8 c0392e70 c00084f4 00000000 00000000 c0021ca0 00000000 c0007175
  29. 3fe0: c0503950 c0021c9c 00000000 c04c3ff8 30008034 c00087ac 00000000 00000000
  30. Backtrace:
  31. [<c0251cb0>] (s3c24xx_i2c_irq+0x0/0x3dc) from [<c0071500>] (handle_IRQ_event+0x60/0x130)
  32. r9:41129200 r8:3001fb58 r7:0000002b r6:00000000 r5:00000000
  33. r4:c3830d40
  34. [<c00714a0>] (handle_IRQ_event+0x0/0x130) from [<c0073000>] (handle_edge_irq+0xa8/0x16c)
  35. r7:c0526fec r6:0000002b r5:c3830d40 r4:c04cbeec
  36. [<c0072f58>] (handle_edge_irq+0x0/0x16c) from [<c0030044>] (asm_do_IRQ+0x44/0x8c)
  37. r7:c04c6448 r6:00000000 r5:c04d832c r4:0000002b
  38. [<c0030000>] (asm_do_IRQ+0x0/0x8c) from [<c0030b04>] (__irq_svc+0x24/0xa0)
  39. Exception stack(0xc04c3f40 to 0xc04c3f88)
  40. 3f40: f4100000 00000032 f4100000 60000013 c04c2000 c05038a4 c04c6450 c04c6448
  41. 3f60: 3001fb58 41129200 3001fb24 c04c3f94 c04c3f98 c04c3f88 c003264c c0032064
  42. 3f80: 60000013 ffffffff
  43. r7:c04c6448 r6:08000000 r5:f4000000 r4:ffffffff
  44. [<c0031fd4>] (default_idle+0x0/0x9c) from [<c003264c>] (cpu_idle+0x78/0xb0)
  45. [<c00325d4>] (cpu_idle+0x0/0xb0) from [<c0392ebc>] (rest_init+0x5c/0x70)
  46. r7:c04c6448 r6:c0021000 r5:c0503640 r4:c052706c
  47. [<c0392e60>] (rest_init+0x0/0x70) from [<c00089a8>] (start_kernel+0x20c/0x27c)
  48. [<c000879c>] (start_kernel+0x0/0x27c) from [<30008034>] (0x30008034)
  49. Code: e5843010 eaffffd3 e5952008 e594002c (e7d2100c)
  50. ---[ end trace 4ede664953bd4d0e ]---
  51. Kernel panic - not syncing: Fatal exception in interrupt
  52. Backtrace:
  53. [<c0035270>] (dump_backtrace+0x0/0x10c) from [<c0395674>] (dump_stack+0x18/0x1c)
  54. r7:c0251fdc r6:c0503eb0 r5:c04c3ccf r4:c0251fdc
  55. [<c039565c>] (dump_stack+0x0/0x1c) from [<c03956c4>] (panic+0x4c/0x134)
  56. [<c0395678>] (panic+0x0/0x134) from [<c0035580>] (die+0x204/0x240)
  57. r3:00010000 r2:c04c9638 r1:0000584d r0:c0454150
  58. [<c003537c>] (die+0x0/0x240) from [<c0037934>] (__do_kernel_fault+0x6c/0x7c)
  59. [<c00378c8>] (__do_kernel_fault+0x0/0x7c) from [<c0037a8c>] (do_page_fault+0x148/0x200)
  60. r7:c04c57c0 r6:00000000 r5:00000000 r4:c04c6618
  61. [<c0037944>] (do_page_fault+0x0/0x200) from [<c003028c>] (do_DataAbort+0x40/0xa4)
  62. [<c003024c>] (do_DataAbort+0x0/0xa4) from [<c0030ac0>] (__dabt_svc+0x40/0x60)
  63. Exception stack(0xc04c3e70 to 0xc04c3eb8)
  64. 3e60:                                     c480c000 c382df30 00000000 00000001
  65. 3e80: c3841c00 c382df24 00000000 ffffffea 00000004 41129200 3001fb24 c04c3edc
  66. 3ea0: 00000000 c04c3eb8 c0071500 c0251fdc 80000093 ffffffff
  67. [<c0251cb0>] (s3c24xx_i2c_irq+0x0/0x3dc) from [<c0071500>] (handle_IRQ_event+0x60/0x130)
  68. r9:41129200 r8:3001fb58 r7:0000002b r6:00000000 r5:00000000
  69. r4:c3830d40
  70. [<c00714a0>] (handle_IRQ_event+0x0/0x130) from [<c0073000>] (handle_edge_irq+0xa8/0x16c)
  71. r7:c0526fec r6:0000002b r5:c3830d40 r4:c04cbeec
  72. [<c0072f58>] (handle_edge_irq+0x0/0x16c) from [<c0030044>] (asm_do_IRQ+0x44/0x8c)
  73. r7:c04c6448 r6:00000000 r5:c04d832c r4:0000002b
  74. [<c0030000>] (asm_do_IRQ+0x0/0x8c) from [<c0030b04>] (__irq_svc+0x24/0xa0)
  75. Exception stack(0xc04c3f40 to 0xc04c3f88)
  76. 3f40: f4100000 00000032 f4100000 60000013 c04c2000 c05038a4 c04c6450 c04c6448
  77. 3f60: 3001fb58 41129200 3001fb24 c04c3f94 c04c3f98 c04c3f88 c003264c c0032064
  78. 3f80: 60000013 ffffffff
  79. r7:c04c6448 r6:08000000 r5:f4000000 r4:ffffffff
  80. [<c0031fd4>] (default_idle+0x0/0x9c) from [<c003264c>] (cpu_idle+0x78/0xb0)
  81. [<c00325d4>] (cpu_idle+0x0/0xb0) from [<c0392ebc>] (rest_init+0x5c/0x70)
  82. r7:c04c6448 r6:c0021000 r5:c0503640 r4:c052706c
  83. [<c0392e60>] (rest_init+0x0/0x70) from [<c00089a8>] (

级别: 新手上路
UID: 23457
精华: 0
发帖: 24
金钱: 130 两
威望: 26 点
综合积分: 48 分
注册时间: 2010-06-20
最后登录: 2017-09-13
1楼  发表于: 2010-07-07 16:32
有一个指针是空的,所以报错。


把你调用i2c_master_send函数的那一段代码贴出来,让我看看。
级别: 侠客
UID: 11611
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2009-12-14
最后登录: 2018-02-08
2楼  发表于: 2010-07-07 16:43
复制代码
  1. struct i2c_ts_data{
  2.     struct i2c_client *client;
  3.     struct input_dev *input;
  4.     struct delayed_work work;
  5.     int irq;
  6. };


复制代码
  1. struct work_struct *work;
  2. struct i2c_ts_data *tsdata = container_of(work,
  3.                              struct i2c_ts_data,
  4.                              work.work);
  5. ……
  6. if (i2c_master_send(tsdata->client, 0, 1) != 1) {
  7.           dev_err(&tsdata->client->dev, "Unable to write i2c index!\n");
  8.           goto out;
  9.       }
  10. ……
  11. out:
  12.         enable_irq(tsdata->irq);


这个代码是在一个中断里调用的。
[ 此帖被delnabla在2010-07-07 16:52重新编辑 ]
级别: 侠客
UID: 11611
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2009-12-14
最后登录: 2018-02-08
3楼  发表于: 2010-07-07 17:09
是不是下面的container_of没有成功?
复制代码
  1. struct i2c_ts_data *tsdata = container_of(work,
  2.                               struct i2c_ts_data,
  3.                               work.work);
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2010-07-07 17:23
这个很明显,s3c24xx_i2c_irq()里访问了空指针,有什么i2c的东西(应该是MINI2440相关的)没有配置?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 侠客
UID: 11611
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2009-12-14
最后登录: 2018-02-08
5楼  发表于: 2010-07-08 14:44
使用了mini2440开发板上cemera上的I2c接口和IRQ_EINIT20 ,直接使用的
级别: 侠客
UID: 11611
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
综合积分: 100 分
注册时间: 2009-12-14
最后登录: 2018-02-08
6楼  发表于: 2010-07-14 10:09
已经可以了,是tsdata的问题,有一个地方赋值的时候错误,没有声明为pointer!