test_main.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. #include <linux/cdev.h>
  5. #include <linux/fs.h>
  6. #include <linux/errno.h>
  7. #include <asm/current.h>
  8. #include <linux/kernel.h>
  9. #include <linux/sched.h>
  10. #include <linux/device.h>
  11. #include <linux/err.h>
  12. #include <linux/uaccess.h>
  13. #include <linux/jiffies.h>
  14. #include <linux/delay.h>
  15. #include <linux/irqreturn.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/wait.h>
  18. #include "stm32f4xx.h"
  19. #include "stm32f4xx_hal_gpio.h"
  20. #include "stm32f4xx_hal_cortex.h"
  21. static int major = 99;
  22. static int minor = 0;
  23. static dev_t devno;
  24. static struct cdev *test_cdev = NULL;
  25. static int count = 3;
  26. #define DEVNAME "test_module"
  27. //struct class *my_class = NULL;
  28. struct device *dev = NULL;
  29. static uint8_t PR_Reg;
  30. static DECLARE_WAIT_QUEUE_HEAD(wq);
  31. static volatile int ev_press = 0;
  32. static int test_open(struct inode *inode, struct file *filep);
  33. static int test_close(struct inode *inode, struct file *filep);
  34. static ssize_t test_read(struct file *filep, char __user *buf, size_t size, loff_t *offset);
  35. static ssize_t test_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset);
  36. static struct file_operations test_ops =
  37. {
  38. .owner = THIS_MODULE,
  39. .open = test_open,
  40. .release = test_close,
  41. .read = test_read,
  42. .write = test_write,
  43. };
  44. static int test_open(struct inode *inode, struct file *filep)
  45. {
  46. printk("---> test open\n");
  47. return 0;
  48. }
  49. static int test_close(struct inode *inode, struct file *filep)
  50. {
  51. printk("---> test close\n");
  52. return 0;
  53. }
  54. static ssize_t test_read(struct file *filep, char __user *buf, size_t size, loff_t *offset)
  55. {
  56. // struct inode *inode = filep->f_path.dentry->d_inode;
  57. wait_event_interruptible(wq,ev_press);
  58. ev_press = 0;
  59. copy_to_user(buf, &PR_Reg, 1);
  60. printk("---> test read, PR_Reg = %#x\n", PR_Reg);
  61. return 0;
  62. }
  63. static ssize_t test_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset)
  64. {
  65. printk("---> test write\n");
  66. return 0;
  67. }
  68. irqreturn_t irq_handler(int irqno, void *dev_id)
  69. {
  70. /* EXTI line interrupt detected */
  71. if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != RESET)
  72. {
  73. PR_Reg = EXTI->PR;
  74. printk("EXTI->PR = %#x\n", PR_Reg);
  75. __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
  76. ev_press = 1;
  77. wake_up_interruptible(&wq);
  78. }
  79. //printk("%#x\n", EXTI->PR);
  80. return IRQ_HANDLED;
  81. }
  82. static int __init test_init(void)
  83. {
  84. uint32_t start_jiffies, now_jiffies, tickRate;
  85. GPIO_InitTypeDef gpio_init_struct;
  86. uint32_t pre_priority, sub_priority;
  87. uint32_t priority_group;
  88. int ret;
  89. printk(KERN_ALERT"hello test module!\n");
  90. test_cdev = cdev_alloc();
  91. if(test_cdev == NULL){
  92. return -ENOMEM;
  93. }
  94. cdev_init(test_cdev,&test_ops);
  95. devno = MKDEV(major,minor);
  96. ret = register_chrdev_region(devno, count, DEVNAME);
  97. if(ret){
  98. goto ERR_STEP;
  99. }
  100. ret = cdev_add(test_cdev, devno, count);
  101. if(ret){
  102. goto ERR_STEP1;
  103. }
  104. printk(KERN_INFO"(%s:pid=%d)major:%d,minor:%d\n",current->comm,current->pid,major,minor);
  105. /* GPIOI4 input interrupt */
  106. __HAL_RCC_GPIOI_CLK_ENABLE();
  107. gpio_init_struct.Pin = GPIO_PIN_4;
  108. gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;
  109. gpio_init_struct.Pull = GPIO_PULLUP;
  110. gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
  111. HAL_GPIO_Init(GPIOI, &gpio_init_struct);
  112. // HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
  113. priority_group = HAL_NVIC_GetPriorityGrouping();
  114. HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);
  115. HAL_NVIC_EnableIRQ(EXTI4_IRQn);
  116. HAL_NVIC_GetPriority(EXTI4_IRQn, priority_group, &pre_priority, &sub_priority);
  117. ret = request_irq( EXTI4_IRQn,
  118. irq_handler,
  119. IRQF_TRIGGER_FALLING,
  120. DEVNAME,
  121. &devno);
  122. if(ret){
  123. printk("request_irq() failed ! %d\n", ret);
  124. goto ERR_STEP1;
  125. }
  126. start_jiffies = jiffies;
  127. // tickRate = sysconf(__SC_CLK_TCK);
  128. mdelay(100);
  129. printk("start: %lu, now %lu, rate %lu\n", start_jiffies, jiffies, HZ);
  130. printk("---> test module ok! priority_group = %d, pre_priority = %d, sub_priority = %d\n", priority_group, pre_priority, sub_priority);
  131. return 0;
  132. //device_err:
  133. // device_destroy(my_class, devno);
  134. //class_err:
  135. ERR_STEP1:
  136. unregister_chrdev_region(devno,count);
  137. ERR_STEP:
  138. cdev_del(test_cdev);
  139. return ret;
  140. }
  141. static void __exit test_exit(void)
  142. {
  143. printk(KERN_ALERT"exit test module!\n");
  144. // device_destroy(my_class, devno);
  145. // class_destroy(my_class);
  146. unregister_chrdev_region(MKDEV(major,minor),count);
  147. cdev_del(test_cdev);
  148. // return 0;
  149. }
  150. module_init(test_init);
  151. module_exit(test_exit);
  152. MODULE_LICENSE("GPL");
  153. MODULE_AUTHOR("Jimbo");
  154. MODULE_DESCRIPTION("this module just for test");