irq.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <linux/fs.h>
  2. #include <linux/interrupt.h>
  3. #include <linux/kernel.h>
  4. #include <linux/module.h>
  5. #include <linux/uaccess.h> /* copy_from_user, copy_to_user */
  6. #define NAME "lkmc_irq"
  7. #define MAX_IRQS 256
  8. static int irqs[MAX_IRQS];
  9. static int major;
  10. /**
  11. * Return value from kernel docs:*
  12. *
  13. * enum irqreturn
  14. * @IRQ_NONE interrupt was not from this device or was not handled
  15. * @IRQ_HANDLED interrupt was handled by this device
  16. * @IRQ_WAKE_THREAD handler requests to wake the handler thread
  17. */
  18. static irqreturn_t handler(int irq, void *dev)
  19. {
  20. pr_info("handler irq = %d dev = %d\n", irq, *(int *)dev);
  21. return IRQ_NONE;
  22. }
  23. static const struct file_operations fops;
  24. static int myinit(void)
  25. {
  26. int ret, i;
  27. major = register_chrdev(0, NAME, &fops);
  28. for (i = 0; i < MAX_IRQS; ++i) {
  29. ret = request_irq(
  30. i,
  31. handler,
  32. IRQF_SHARED,
  33. "myirqhandler0",
  34. &major
  35. );
  36. irqs[i] = ret;
  37. pr_info("request_irq irq = %d ret = %d\n", i, ret);
  38. }
  39. return 0;
  40. }
  41. static void myexit(void)
  42. {
  43. int i;
  44. for (i = 0; i < MAX_IRQS; ++i) {
  45. if (!irqs[i]) {
  46. free_irq(i, &major);
  47. }
  48. }
  49. unregister_chrdev(major, NAME);
  50. }
  51. module_init(myinit)
  52. module_exit(myexit)
  53. MODULE_LICENSE("GPL");