humidity_factory.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "inc/humidity_factory.h"
  2. static int hmdy_factory_open(struct inode *inode, struct file *file)
  3. {
  4. file->private_data = hmdy_context_obj;
  5. if (file->private_data == NULL) {
  6. HMDY_ERR("null pointer!!\n");
  7. return -EINVAL;
  8. }
  9. return nonseekable_open(inode, file);
  10. }
  11. static int hmdy_factory_release(struct inode *inode, struct file *file)
  12. {
  13. file->private_data = NULL;
  14. return 0;
  15. }
  16. static long hmdy_factory_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  17. {
  18. long err = 0;
  19. struct hmdy_context *cxt = hmdy_context_obj;
  20. void __user *ptr = (void __user *)arg;
  21. int dat = 0;
  22. if (_IOC_DIR(cmd) & _IOC_READ)
  23. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  24. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  25. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  26. if (err) {
  27. HMDY_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  28. return -EFAULT;
  29. }
  30. switch (cmd) {
  31. case HUMIDITY_IOCTL_INIT:
  32. HMDY_LOG("HUMIDITY_IOCTL_INIT enable\n");
  33. if (cxt->hmdy_ctl.enable_nodata != NULL) {
  34. err = cxt->hmdy_ctl.enable_nodata(1);
  35. if (err < 0) {
  36. HMDY_ERR("HUMIDITY_IOCTL_INIT fail!\n");
  37. break;
  38. }
  39. }
  40. break;
  41. case HUMIDITY_GET_HMDY_DATA:
  42. if (cxt->hmdy_data.get_raw_data != NULL) {
  43. err = cxt->hmdy_data.get_raw_data(TYPE_PRESS, &dat);
  44. if (err < 0) {
  45. HMDY_ERR("HUMIDITY_GET_PRESS_DATA fail!\n");
  46. break;
  47. }
  48. }
  49. if (copy_to_user(ptr, &dat, sizeof(dat))) {
  50. err = -EFAULT;
  51. break;
  52. }
  53. break;
  54. case HUMIDITY_GET_TEMP_DATA:
  55. if (cxt->hmdy_data.get_raw_data != NULL) {
  56. err = cxt->hmdy_data.get_raw_data(TYPE_TEMP, &dat);
  57. if (err < 0) {
  58. HMDY_ERR("HUMIDITY_GET_PRESS_DATA fail!\n");
  59. break;
  60. }
  61. }
  62. if (copy_to_user(ptr, &dat, sizeof(dat))) {
  63. err = -EFAULT;
  64. break;
  65. }
  66. break;
  67. default:
  68. HMDY_ERR("unknown IOCTL: 0x%08x\n", cmd);
  69. err = -ENOIOCTLCMD;
  70. break;
  71. }
  72. return err;
  73. }
  74. static const struct file_operations hmdy_factory_fops = {
  75. .open = hmdy_factory_open,
  76. .release = hmdy_factory_release,
  77. .unlocked_ioctl = hmdy_factory_unlocked_ioctl,
  78. };
  79. static struct miscdevice hmdy_factory_device = {
  80. .minor = MISC_DYNAMIC_MINOR,
  81. .name = "hmdymeter",
  82. .fops = &hmdy_factory_fops,
  83. };
  84. int hmdy_factory_device_init(void)
  85. {
  86. int error = 0;
  87. struct hmdy_context *cxt = hmdy_context_obj;
  88. if (!cxt->hmdy_ctl.is_use_common_factory) {
  89. HMDY_LOG("Node of '/dev/hmdymeter' has already existed!\n");
  90. return -1;
  91. }
  92. error = misc_register(&hmdy_factory_device);
  93. if (error) {
  94. HMDY_ERR("hmdy_factory_device register failed\n");
  95. error = -1;
  96. }
  97. return error;
  98. }