1
0

i2c_dev.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2012-04-25 weety first version
  9. * 2014-08-03 bernard fix some compiling warning
  10. */
  11. #include <rtdevice.h>
  12. static rt_size_t i2c_bus_device_read(rt_device_t dev,
  13. rt_off_t pos,
  14. void *buffer,
  15. rt_size_t count)
  16. {
  17. rt_uint16_t addr;
  18. rt_uint16_t flags;
  19. struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)dev->user_data;
  20. RT_ASSERT(bus != RT_NULL);
  21. RT_ASSERT(buffer != RT_NULL);
  22. i2c_dbg("I2C bus dev [%s] reading %u bytes.\n", dev->parent.name, count);
  23. addr = pos & 0xffff;
  24. flags = (pos >> 16) & 0xffff;
  25. return rt_i2c_master_recv(bus, addr, flags, buffer, count);
  26. }
  27. static rt_size_t i2c_bus_device_write(rt_device_t dev,
  28. rt_off_t pos,
  29. const void *buffer,
  30. rt_size_t count)
  31. {
  32. rt_uint16_t addr;
  33. rt_uint16_t flags;
  34. struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)dev->user_data;
  35. RT_ASSERT(bus != RT_NULL);
  36. RT_ASSERT(buffer != RT_NULL);
  37. i2c_dbg("I2C bus dev [%s] writing %u bytes.\n", dev->parent.name, count);
  38. addr = pos & 0xffff;
  39. flags = (pos >> 16) & 0xffff;
  40. return rt_i2c_master_send(bus, addr, flags, buffer, count);
  41. }
  42. static rt_err_t i2c_bus_device_control(rt_device_t dev,
  43. int cmd,
  44. void *args)
  45. {
  46. rt_err_t ret;
  47. struct rt_i2c_priv_data *priv_data;
  48. struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)dev->user_data;
  49. RT_ASSERT(bus != RT_NULL);
  50. switch (cmd)
  51. {
  52. /* set 10-bit addr mode */
  53. case RT_I2C_DEV_CTRL_10BIT:
  54. bus->flags |= RT_I2C_ADDR_10BIT;
  55. break;
  56. case RT_I2C_DEV_CTRL_ADDR:
  57. bus->addr = *(rt_uint16_t *)args;
  58. break;
  59. case RT_I2C_DEV_CTRL_TIMEOUT:
  60. bus->timeout = *(rt_uint32_t *)args;
  61. break;
  62. case RT_I2C_DEV_CTRL_RW:
  63. priv_data = (struct rt_i2c_priv_data *)args;
  64. ret = rt_i2c_transfer(bus, priv_data->msgs, priv_data->number);
  65. if (ret < 0)
  66. {
  67. return -RT_EIO;
  68. }
  69. break;
  70. default:
  71. break;
  72. }
  73. return RT_EOK;
  74. }
  75. #ifdef RT_USING_DEVICE_OPS
  76. const static struct rt_device_ops i2c_ops =
  77. {
  78. RT_NULL,
  79. RT_NULL,
  80. RT_NULL,
  81. i2c_bus_device_read,
  82. i2c_bus_device_write,
  83. i2c_bus_device_control
  84. };
  85. #endif
  86. rt_err_t rt_i2c_bus_device_device_init(struct rt_i2c_bus_device *bus,
  87. const char *name)
  88. {
  89. struct rt_device *device;
  90. RT_ASSERT(bus != RT_NULL);
  91. device = &bus->parent;
  92. device->user_data = bus;
  93. /* set device type */
  94. device->type = RT_Device_Class_I2CBUS;
  95. /* initialize device interface */
  96. #ifdef RT_USING_DEVICE_OPS
  97. device->ops = &i2c_ops;
  98. #else
  99. device->init = RT_NULL;
  100. device->open = RT_NULL;
  101. device->close = RT_NULL;
  102. device->read = i2c_bus_device_read;
  103. device->write = i2c_bus_device_write;
  104. device->control = i2c_bus_device_control;
  105. #endif
  106. /* register to device manager */
  107. rt_device_register(device, name, RT_DEVICE_FLAG_RDWR);
  108. return RT_EOK;
  109. }