gpio_i2c_main.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 <asm/uaccess.h>
  13. //#include <stdint.h>
  14. #include "stm32f4xx.h"
  15. #include "stm32f4xx_hal_gpio.h"
  16. #include "driver.h"
  17. static int major = MAJOR_GPIO_I2C;
  18. static int minor = 0;
  19. static dev_t devno;
  20. static struct cdev *gpio_i2c_cdev = NULL;
  21. static int count = 1;
  22. #define DEVNAME "gpio_i2c"
  23. static int gpio_i2c_open(struct inode *inode, struct file *filep);
  24. static int gpio_i2c_close(struct inode *inode, struct file *filep);
  25. static ssize_t gpio_i2c_read(struct file *filep, char __user *buf, size_t size, loff_t *offset);
  26. static ssize_t gpio__i2c_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset);
  27. static int gpio_i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
  28. static int gpio_i2c_transfer(gpio_i2c_t *pArg);
  29. static int gpio_i2c_receive(gpio_i2c_t *pArg);
  30. static struct file_operations gpio_i2c_ops =
  31. {
  32. .owner = THIS_MODULE,
  33. .open = gpio_i2c_open,
  34. .release = gpio_i2c_close,
  35. .ioctl = gpio_i2c_ioctl,
  36. .read = gpio_i2c_read,
  37. .write = gpio_i2c_write,
  38. };
  39. static int gpio_i2c_open(struct inode *inode, struct file *filep)
  40. {
  41. //__HAL_RCC_GPIOC_CLK_ENABLE();
  42. return 0;
  43. }
  44. static int gpio_i2c_close(struct inode *inode, struct file *filep)
  45. {
  46. return 0;
  47. }
  48. static int gpio_i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
  49. {
  50. gpio_i2c_t gpio_i2c_arg;
  51. if ( copy_from_user(&gpio_i2c_arg, (void*)arg, sizeof(gpio_i2c_t)) )
  52. return -EFAULT;
  53. switch(cmd)
  54. {
  55. case GPIO_I2C_MASTER_TRANSFER:
  56. HAL_GPIO_Init(gpio_arg.GPIOx, &gpio_arg.GPIO_Init);
  57. break;
  58. case GPIO_I2C_MASTER_RECEIVE:
  59. HAL_GPIO_WritePin(gpio_arg.GPIOx, gpio_arg.GPIO_pin, gpio_arg.Data);
  60. gpio_arg.Data = HAL_GPIO_ReadPin(gpio_arg.GPIOx, gpio_arg.GPIO_pin);
  61. if ( copy_to_user((void*)arg, (void*)&gpio_arg, sizeof(gpio_t)))
  62. return -EFAULT;
  63. break;
  64. default:
  65. printk("---> Invalid action\n");
  66. return -EINVAL;
  67. break;
  68. }
  69. return 0;
  70. }
  71. static ssize_t gpio_i2c_read(struct file *filep, char __user *buf, size_t size, loff_t *offset)
  72. {
  73. return 0;
  74. }
  75. static ssize_t gpio_i2c_write(struct file *filep, const char __user *buf, size_t size, loff_t *offset)
  76. {
  77. return 0;
  78. }
  79. static int gpio_i2c_transfer(gpio_i2c_t *pArg)
  80. {
  81. //TODO:
  82. return 0;
  83. }
  84. static int gpio_i2c_receive(gpio_i2c_t *pArg)
  85. {
  86. //TODO:
  87. return 0;
  88. }
  89. static void gpio_i2c_hw_init(void)
  90. {
  91. GPIO_InitTypeDef GPIO_InitStruct;
  92. //config gpio
  93. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  94. GPIO_InitStruct.Pull = GPIO_PULLUP;
  95. GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  96. //GPIO_I2C
  97. GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; //SCL | SDA
  98. //HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  99. }
  100. static int __init gpio_i2c_init(void)
  101. {
  102. int ret;
  103. gpio_i2c_cdev = cdev_alloc();
  104. if(gpio_i2c_cdev == NULL){
  105. return -ENOMEM;
  106. }
  107. cdev_init(gpio_i2c_cdev,&gpio_i2c_ops);
  108. devno = MKDEV(major,minor);
  109. ret = register_chrdev_region(devno, count, DEVNAME);
  110. if(ret){
  111. goto ERR_STEP;
  112. }
  113. ret = cdev_add(gpio_i2c_cdev, devno, count);
  114. if(ret){
  115. goto ERR_STEP1;
  116. }
  117. gpio_i2c_hw_init();
  118. return 0;
  119. ERR_STEP1:
  120. unregister_chrdev_region(devno,count);
  121. ERR_STEP:
  122. cdev_del(gpio_i2c_cdev);
  123. return ret;
  124. }
  125. static void __exit gpio_i2c_exit(void)
  126. {
  127. unregister_chrdev_region(MKDEV(major,minor),count);
  128. cdev_del(gpio_i2c_cdev);
  129. }
  130. module_init(gpio_i2c_init);
  131. module_exit(gpio_i2c_exit);
  132. MODULE_LICENSE("GPL");
  133. MODULE_AUTHOR("Jimbo");
  134. MODULE_DESCRIPTION("this is gpio_i2c module");