天嵌 ARM开发社区

 找回密码
 注册
查看: 2433|回复: 3

求助:自己写的SPI设备驱动问题

[复制链接]
zwxhehe2012 发表于 2012-9-9 14:53:09 | 显示全部楼层 |阅读模式
自己写了一个SPI设备的驱动,加载驱动后已经成功调用probe函数并创建了设备文件,问题是现在应用程序打开设备文件后就出现以下错误:将驱动中的open函数与release函数中其它删除只留下打印信息,应用程序中只留下打开和关闭设备文件代码,还是会出现如下错误,麻烦大侠帮忙解决以下该问题(已经调试好久了还没解决)


Unable to handle kernel NULL pointer dereference at virtual address 0000002fe driver uvcv
usbcore:  
LR is at sys_close+0xa0/0xcc
pc : [<c0cde7c0>] lr : [<c0cde8d0>] psr: 80000013
sp : c082bf68 ip : c082bf88 fp : c082bf84
r10: 00000000 r9 : c082a000 r8 : c0c80008
r7 : 00000006 r6 : 0000001b r5 : c2b01cc0 r4 : 00000003
r3 : 00000007 r2 : 00000004 r1 : c2b01cc0 r0 : 0000001b
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: c000717f Table: 32b84000 DAC: 00000015
Process app_gp21 (pid: 504, stack limit = 0xc082a268)
Stack: (0xc082bf68 to 0xc082c000)
bf60: 00000003 c2b01cc0 0000001b 00000006 c082bfa4 c082bf88
bf80: c0cde8d0 c0cde7c4 0000b494 00000000 0000b450 00000006 00000000 c082bfa8
bfa0: c0c7fe60 c0cde840 0000b494 00000000 00000003 00000000 00084f2c 00000001
bfc0: 0000b494 00000000 0000b450 00000006 00000000 00000000 00000000 be851b94
bfe0: 00000000 be851b78 00008278 0001522c 60000010 00000003 e5803008 e542c001
Backtrace:
[<c0cde7b4>] (filp_close+0x0/0x7c) from [<c0cde8d0>] (sys_close+0xa0/0xcc)
r7:00000006 r6:0000001b r5:c2b01cc0 r4:00000003
[<c0cde830>] (sys_close+0x0/0xcc) from [<c0c7fe60>] (ret_fast_syscall+0x0/0x2c)
r7:00000006 r6:0000b450 r5:00000000 r4:0000b494
Code: e89da800 e1a0c00d e92dd8f0 e24cb004 (e5903014)
---[ end trace d982a507971a8f45 ]---
Segmentation fault

驱动程序主要代码如下:
  1. #define ARRYSIZE(x) ( sizeof(x)/ sizeof(x[0]))
  2. #define EINT3_IRQ 7
  3. #define SPI_MAJOR 252
  4. #define HIGH 1
  5. #define LOW 0


  6. extern int spi_register_driver(struct spi_driver *sdrv);
  7. extern int spi_write_then_read(struct spi_device *spi,const u8 *txbuf,unsigned n_tx,u8 *rxbuf,unsigned n_rx);
  8. extern int spi_sync(struct spi_device *spi,struct spi_message *message);
  9. extern struct class *__class_creat(struct module *owner ,const char *name,struct lock_class_key *key);
  10. extern int register_chrdev(unsigned int major,const char *name,const struct file_operations *fops);




  11. static char ev_irq = 0; // 定义表示中断发生的变量

  12. static DECLARE_WAIT_QUEUE_HEAD(measure_waitq); //定义一个等待队列




  13.   struct spidev_data  
  14. {
  15.   dev_t devt;
  16.   struct spi_device *spi ;
  17. };



  18.   irqreturn_t mp_interrupt (int irq ,void *dev_id)
  19. {
  20.   unsigned char value ;
  21.   value = s3c2410_gpio_getpin(S3C2410_GPF3);   
  22.   if (!value)
  23.   {
  24.   ev_irq = 1 ;
  25.   wake_up_interruptible (&measure_waitq);
  26.   }
  27.    
  28. }



  29.   int Mp_Open (struct inode *inode ,struct file *file)
  30. {
  31.   /* struct spidev_data *data_spi ;
  32.   file->private_data = data_spi ;   
  33.   if (request_irq(EINT3_IRQ,mp_interrupt,IRQF_DISABLED|IRQF_TRIGGER_LOW,"mp",NULL)) //申请中断
  34.   {
  35.   printk ("request_irq error\n");

  36. } */
  37.    
  38.   printk("kernel open device success\n");
  39. }


  40.    
  41.   int Mp_Release (struct inode *inode ,struct file *filp)
  42. {
  43.   printk("close device\n");



  44. }
  45.   struct file_operations mp_fops =
  46. {
  47.   .owner = THIS_MODULE ,
  48.   .open = Mp_Open ,
  49.   .release = Mp_Release ,
  50.    
  51. };

  52.   static struct class *spi_class ;



  53. static int Mp_Probe (struct spi_device *spi_dev)
  54. {
  55.   int ret ;
  56.   struct spidev_data *data_spi ;
  57.   data_spi= kzalloc (sizeof(*data_spi),GFP_KERNEL);
  58.   if(!data_spi)
  59.   return -ENOMEM ;
  60.   printk("kzalloc success\n");
  61.   data_spi->spi = spi_dev ;
  62.   data_spi->devt = MKDEV(SPI_MAJOR,0);  
  63.   device_create(spi_class,&spi_dev->dev,data_spi->devt,data_spi,"mp");
  64.   spi_set_drvdata(spi_dev,data_spi);  
  65.   printk ("probe mp \n ");
  66.   return 0 ;
  67.    
  68. }


  69. static int Mp_Remove (struct spi_device *spi_dev)
  70. {

  71.   struct spidev_data *data_spi ;
  72.   cdev_del (&data_spi->spi);//注销字符设备
  73.   return 0 ;


  74. }


  75. static struct spi_driver mp_driver =
  76. {
  77.   .probe = Mp_Probe ,
  78.   .remove = Mp_Remove ,
  79.   .driver =
  80.   {
  81.   .name = "mp" ,
  82.   .owner = THIS_MODULE ,
  83.   }

  84. } ;



  85. static int __init Mp_init (void)
  86. {
  87.   unsigned int ret ;
  88.   ret = register_chrdev(SPI_MAJOR,"spi",&mp_fops);
  89.   if (ret<0)
  90.   {
  91.   printk ("cdev add error\n");
  92.   return ret;
  93.   }
  94.   spi_class = class_create (THIS_MODULE,"mp");
  95.   if (IS_ERR(spi_class))
  96.   {
  97.   return PTR_ERR(spi_class);
  98.   }
  99.   return spi_register_driver (&mp_driver);

  100. }

  101. static void __exit Mp_exit (void)
  102. {
  103.   spi_unregister_driver (&mp_driver);
  104. }



  105. module_init(Mp_init);
  106. module_exit(Mp_exit);
  107. MODULE_LICENSE("GPL");
  108. MODULE_DESCRIPTION("mp for EmbedSky SKY2440/TQ2440 Board");
复制代码
应用程序如下:
  1. void main (int argc ,char **argv)
  2. {
  3. int fd ;
  4. fd = open("/dev/mp" ,O_RDWR);   

  5. if (fd<0)
  6. {
  7.   printf ("open device error\n");
  8.   return ;
  9. }

  10. printf ("open seccuss\n");   
  11.   close(fd);
  12. }



复制代码
embedsky_lhh 发表于 2012-9-10 13:27:09 | 显示全部楼层
是不是设备号重了?
亚瑟王 发表于 2012-9-10 17:24:14 | 显示全部楼层
如果你选择使用系统自带的SPI的框架,建议参考系统自带的针对S3C2410的那个SPI驱动。
 楼主| zwxhehe2012 发表于 2012-9-10 17:31:20 | 显示全部楼层
设备号没有重复  ,查看/dev目录下自动创建的设备文件主设备号是252,参考了系统自带的spidev.c驱动文件,但是基本框架式一样的,不可能完全抄那个的,但是不知道具体哪一条语句造成这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-18 06:07 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表