Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. [ 80.636932] Kernel panic - not syncing: Fatal exception in interrupt
  2.  
  3. static irqreturn_t timer_irq_handler(int irq, void *dev_id)
  4. {
  5. uint16_t value;
  6.  
  7. // reset the timer interrupt status
  8. omap_dm_timer_write_status(timer_ptr, OMAP_TIMER_INT_OVERFLOW);
  9. omap_dm_timer_read_status(timer_ptr);
  10.  
  11. omap_dm_timer_set_load(timer_ptr, 1, 0xFFFFFFFF - (time * gt_rate);
  12.  
  13. value = read_channel();
  14.  
  15. return IRQ_HANDLED;
  16. }
  17.  
  18. uint16_t read_channel()
  19. {
  20. // Create variables
  21. struct file *f;
  22. char buf[128];
  23. mm_segment_t fs;
  24. int i;
  25. // Init the buffer with 0
  26. for(i=0;i < 128;i++)
  27. buf[i] = 0;
  28.  
  29. f = filp_open(device, O_RDONLY, 0);
  30. if(f == NULL)
  31. printk(KERN_ALERT "filp_open error!!.n");
  32. else{
  33. // Get current segment descriptor
  34. fs = get_fs();
  35. // Set segment descriptor associated to kernel space
  36. set_fs(get_ds());
  37. // Read the file
  38. f->f_op->read(f, buf, 128, &f->f_pos);
  39. // Restore segment descriptor
  40. set_fs(fs);
  41. // See what we read from file
  42. printk(KERN_INFO "buf:%sn",buf);
  43. }
  44. filp_close(f,NULL);
  45. return 0;
  46. }
  47.  
  48. static int __init mq7_driver_init(void)
  49. {
  50. int ret = 0;
  51. struct clk *gt_fclk;
  52.  
  53. timer_ptr = omap_dm_timer_request();
  54. if(timer_ptr == NULL){
  55. printk("No more gp timers available, bailing outn");
  56. return -1;
  57. }
  58.  
  59. // set the clock source to system clock
  60. omap_dm_timer_set_source(timer_ptr, OMAP_TIMER_SRC_SYS_CLK);
  61.  
  62. // set prescalar to 1:1
  63. omap_dm_timer_set_prescaler(timer_ptr, 0);
  64.  
  65. // figure out what IRQ our timer triggers
  66. timer_irq = omap_dm_timer_get_irq(timer_ptr);
  67.  
  68. // install our IRQ handler for our timer
  69. ret = request_irq(timer_irq, timer_irq_handler, IRQF_DISABLED | IRQF_TIMER , "mq7_driver", timer_irq_handler);
  70. if(ret){
  71. printk("mq7_driver: request_irq failed (on irq %d), bailing outn", timer_irq);
  72. return ret;
  73. }
  74.  
  75. // get clock rate in Hz
  76. gt_fclk = omap_dm_timer_get_fclk(timer_ptr);
  77. gt_rate = clk_get_rate(gt_fclk);
  78.  
  79. // set preload, and autoreload
  80. // we set it to the clock rate in order to get 1 overflow every 3 seconds
  81. omap_dm_timer_set_load(timer_ptr, 1, 0xFFFFFFFF - (5 * gt_rate)); // dobro do tempo
  82.  
  83. // setup timer to trigger our IRQ on the overflow event
  84. omap_dm_timer_set_int_enable(timer_ptr, OMAP_TIMER_INT_OVERFLOW);
  85.  
  86. // start the timer!
  87. omap_dm_timer_start(timer_ptr);
  88.  
  89. // get acess to gpio
  90. ret = gpio_request(gpio, "mq7_driver sck");
  91. if (ret) {
  92. printk(KERN_ALERT "gpio_request %d failedn",gpio);
  93. gpio_free(gpio);
  94. return -1;
  95. }
  96. gpio_direction_output(gpio, 0);
  97.  
  98. // Print adc number into address string
  99. sprintf(device,"/sys/class/hwmon/hwmon0/device/in%d_input",adc);
  100.  
  101. return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement