drv_i2c.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-09-03 Yilin Sun Initial version
  9. */
  10. #include <rtdevice.h>
  11. #include "fsl_i2c.h"
  12. #ifdef RT_USING_I2C
  13. #define BSP_DEFAULT_I2C_FREQ (100000)
  14. typedef struct
  15. {
  16. struct rt_i2c_bus_device parent;
  17. I2C_Type *instance;
  18. uint32_t input_frequency;
  19. } mcx_i2c_obj_t;
  20. typedef struct
  21. {
  22. I2C_Type *instance;
  23. uint8_t id;
  24. } mcx_i2c_instance_t;
  25. static const mcx_i2c_instance_t mcx_i2c_instances[] =
  26. {
  27. #ifdef BSP_USING_I2C0
  28. {I2C0, 0},
  29. #endif
  30. #ifdef BSP_USING_I2C1
  31. {I2C1, 1},
  32. #endif
  33. };
  34. static mcx_i2c_obj_t mcx_i2c_list[ARRAY_SIZE(mcx_i2c_instances)];
  35. static int mcx_i2c_master_xfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num)
  36. {
  37. struct rt_i2c_msg *msg;
  38. i2c_master_transfer_t xfer = {0};
  39. rt_uint32_t i;
  40. rt_ssize_t ret = 0;
  41. mcx_i2c_obj_t *i2c = (mcx_i2c_obj_t *)bus;
  42. for (i = 0; i < num; i++)
  43. {
  44. msg = &msgs[i];
  45. if (msg->flags & RT_I2C_RD)
  46. {
  47. xfer.slaveAddress = msg->addr;
  48. xfer.direction = kI2C_Read;
  49. xfer.subaddress = 0;
  50. xfer.subaddressSize = 0;
  51. xfer.data = msg->buf;
  52. xfer.dataSize = msg->len;
  53. xfer.flags = kI2C_TransferDefaultFlag;
  54. if (i != 0)
  55. {
  56. xfer.flags |= kI2C_TransferRepeatedStartFlag;
  57. }
  58. if (i != num - 1)
  59. {
  60. xfer.flags |= kI2C_TransferNoStopFlag;
  61. }
  62. if (I2C_MasterTransferBlocking(i2c->instance, &xfer) != kStatus_Success)
  63. {
  64. return i;
  65. }
  66. }
  67. else
  68. {
  69. xfer.slaveAddress = msg->addr;
  70. xfer.direction = kI2C_Write;
  71. xfer.subaddress = 0;
  72. xfer.subaddressSize = 0;
  73. xfer.data = msg->buf;
  74. xfer.dataSize = msg->len;
  75. xfer.flags = kI2C_TransferDefaultFlag;
  76. if (i != 0)
  77. {
  78. xfer.flags |= kI2C_TransferRepeatedStartFlag;
  79. }
  80. if (i != num - 1)
  81. {
  82. xfer.flags |= kI2C_TransferNoStopFlag;
  83. }
  84. if (I2C_MasterTransferBlocking(i2c->instance, &xfer) != kStatus_Success)
  85. {
  86. return i;
  87. }
  88. }
  89. }
  90. ret = num;
  91. return ret;
  92. }
  93. static const struct rt_i2c_bus_device_ops mcx_i2c_ops =
  94. {
  95. mcx_i2c_master_xfer,
  96. RT_NULL,
  97. RT_NULL,
  98. };
  99. static int rt_hw_i2c_init(void)
  100. {
  101. i2c_master_config_t master_cfg;
  102. char name_buf[16];
  103. for (size_t i = 0; i < ARRAY_SIZE(mcx_i2c_instances); i++)
  104. {
  105. mcx_i2c_list[i].input_frequency = CLOCK_GetCoreSysClkFreq();
  106. mcx_i2c_list[i].instance = mcx_i2c_instances[i].instance;
  107. mcx_i2c_list[i].parent.ops = &mcx_i2c_ops;
  108. I2C_MasterGetDefaultConfig(&master_cfg);
  109. master_cfg.baudRate_Bps = BSP_DEFAULT_I2C_FREQ;
  110. I2C_MasterInit(mcx_i2c_list[i].instance, &master_cfg, mcx_i2c_list[i].input_frequency);
  111. rt_snprintf(name_buf, 16, "i2c%d", mcx_i2c_instances[i].id);
  112. rt_i2c_bus_device_register(&mcx_i2c_list[i].parent, name_buf);
  113. }
  114. return RT_EOK;
  115. }
  116. INIT_DEVICE_EXPORT(rt_hw_i2c_init);
  117. #endif