fm24clxx.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. * 2017-07-14 aubr.cool 1st version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #include "fm24clxx.h"
  13. struct fm24clxx_device
  14. {
  15. struct rt_device parent;
  16. struct rt_i2c_bus_device *bus;
  17. };
  18. /* RT-Thread device interface */
  19. static rt_err_t fm24clxx_init(rt_device_t dev)
  20. {
  21. return RT_EOK;
  22. }
  23. static rt_err_t fm24clxx_open(rt_device_t dev, rt_uint16_t oflag)
  24. {
  25. return RT_EOK;
  26. }
  27. static rt_err_t fm24clxx_close(rt_device_t dev)
  28. {
  29. return RT_EOK;
  30. }
  31. static rt_err_t fm24clxx_control(rt_device_t dev, int cmd, void *args)
  32. {
  33. return RT_EOK;
  34. }
  35. static rt_size_t fm24clxx_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
  36. {
  37. struct fm24clxx_device *fm24clxx;
  38. const struct fm24clxx_config *cfg;
  39. struct rt_i2c_msg msg[2];
  40. rt_uint8_t mem_addr[2] = {0,};
  41. rt_size_t ret = 0;
  42. RT_ASSERT(dev != 0);
  43. fm24clxx = (struct fm24clxx_device *) dev;
  44. RT_ASSERT(fm24clxx->parent.user_data != 0);
  45. cfg = (const struct fm24clxx_config *) fm24clxx->parent.user_data;
  46. if(pos > cfg->size)
  47. {
  48. return 0;
  49. }
  50. if(pos + size > cfg->size)
  51. {
  52. size = cfg->size - pos;
  53. }
  54. msg[0].addr = cfg->addr;
  55. msg[0].flags = cfg->flags | RT_I2C_WR;
  56. mem_addr[0] = (pos >> 8);
  57. mem_addr[1] = (rt_uint8_t) pos;
  58. msg[0].buf = (rt_uint8_t *) mem_addr;
  59. msg[0].len = 2;
  60. msg[1].addr = cfg->addr;
  61. msg[1].flags = cfg->flags | RT_I2C_RD;
  62. msg[1].buf = (rt_uint8_t *) buffer;
  63. msg[1].len = size;
  64. ret = rt_i2c_transfer(fm24clxx->bus, msg, 2);
  65. return (ret == 2) ? size : 0;
  66. }
  67. static rt_size_t fm24clxx_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
  68. {
  69. struct fm24clxx_device *fm24clxx;
  70. const struct fm24clxx_config *cfg;
  71. struct rt_i2c_msg msg[2];
  72. rt_uint8_t mem_addr[2] = {0,};
  73. rt_size_t ret = 0;
  74. RT_ASSERT(dev != 0);
  75. fm24clxx = (struct fm24clxx_device *) dev;
  76. RT_ASSERT(fm24clxx->parent.user_data != 0);
  77. cfg = (const struct fm24clxx_config *) fm24clxx->parent.user_data;
  78. if(pos > cfg->size)
  79. {
  80. return 0;
  81. }
  82. if(pos + size > cfg->size)
  83. {
  84. size = cfg->size - pos;
  85. }
  86. msg[0].addr = cfg->addr;
  87. msg[0].flags = cfg->flags | RT_I2C_WR;
  88. mem_addr[0] = (pos >> 8);
  89. mem_addr[1] = (rt_uint8_t) pos;
  90. msg[0].buf = (rt_uint8_t *) mem_addr;
  91. msg[0].len = 2;
  92. msg[1].addr = cfg->addr;
  93. msg[1].flags = cfg->flags | RT_I2C_WR | RT_I2C_NO_START;
  94. msg[1].buf = (rt_uint8_t *) buffer;
  95. msg[1].len = size;
  96. ret = rt_i2c_transfer(fm24clxx->bus, msg, 2);
  97. return (ret == 2) ? size : 0;
  98. }
  99. #ifdef RT_USING_DEVICE_OPS
  100. const static struct rt_device fm24clxx_ops =
  101. {
  102. fm24clxx_init,
  103. fm24clxx_open,
  104. fm24clxx_close,
  105. fm24clxx_read,
  106. fm24clxx_write,
  107. fm24clxx_control
  108. };
  109. #endif
  110. rt_err_t fm24clxx_register(const char *fm_device_name, const char *i2c_bus, void *user_data)
  111. {
  112. static struct fm24clxx_device fm24clxx_drv;
  113. struct rt_i2c_bus_device *bus;
  114. bus = rt_i2c_bus_device_find(i2c_bus);
  115. if (bus == RT_NULL)
  116. {
  117. return RT_ENOSYS;
  118. }
  119. fm24clxx_drv.bus = bus;
  120. fm24clxx_drv.parent.type = RT_Device_Class_Block;
  121. #ifdef RT_USING_DEVICE_OPS
  122. fm24clxx_drv.parent.ops = &fm24clxx_ops;
  123. #else
  124. fm24clxx_drv.parent.init = fm24clxx_init;
  125. fm24clxx_drv.parent.open = fm24clxx_open;
  126. fm24clxx_drv.parent.close = fm24clxx_close;
  127. fm24clxx_drv.parent.read = fm24clxx_read;
  128. fm24clxx_drv.parent.write = fm24clxx_write;
  129. fm24clxx_drv.parent.control = fm24clxx_control;
  130. #endif
  131. fm24clxx_drv.parent.user_data = user_data;
  132. return rt_device_register(&fm24clxx_drv.parent, fm_device_name, RT_DEVICE_FLAG_RDWR);
  133. }