drv_i2c.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-07-29 zdzn first version
  9. */
  10. #include "drv_i2c.h"
  11. #if defined (BSP_USING_I2C0)
  12. #define I2C1BUS_NAME "i2c0"
  13. #endif /*BSP_USING_I2C0*/
  14. #if defined (BSP_USING_I2C1)
  15. #define I2C2BUS_NAME "i2c1"
  16. #endif /*BSP_USING_I2C1*/
  17. static int i2c_byte_wait_us = 0;
  18. #ifdef BSP_USING_I2C0
  19. static struct raspi_i2c_bus raspi_i2c0 =
  20. {
  21. .device_name = I2C1BUS_NAME,
  22. };
  23. static struct raspi_master_config_t raspi_i2c0_cfg =
  24. {
  25. .sdl_pin = BCM_GPIO_PIN_0,
  26. .scl_pin = BCM_GPIO_PIN_1,
  27. .sdl_pin_mode = BCM283X_GPIO_FSEL_ALT0,
  28. .scl_pin_mode = BCM283X_GPIO_FSEL_ALT0,
  29. .slave_address = 8,
  30. .bsc_base = (PER_BASE + BCM283X_BSC0_BASE),
  31. .clk_div = BCM283X_I2C_CLOCK_DIVIDER_148,
  32. };
  33. #endif /* RT_USING_HW_I2C1 */
  34. #ifdef BSP_USING_I2C1
  35. static struct raspi_i2c_bus raspi_i2c1 =
  36. {
  37. .device_name = I2C2BUS_NAME,
  38. };
  39. static struct raspi_master_config_t raspi_i2c1_cfg =
  40. {
  41. .sdl_pin = BCM_GPIO_PIN_2,
  42. .scl_pin = BCM_GPIO_PIN_3,
  43. .sdl_pin_mode = BCM283X_GPIO_FSEL_ALT0,
  44. .scl_pin_mode = BCM283X_GPIO_FSEL_ALT0,
  45. .slave_address = 9,
  46. .bsc_base = (PER_BASE + BCM283X_BSC1_BASE),
  47. .clk_div = BCM283X_I2C_CLOCK_DIVIDER_148,
  48. };
  49. #endif /* RT_USING_HW_I2C2 */
  50. #if (defined(BSP_USING_I2C0) || defined(BSP_USING_I2C1))
  51. static rt_size_t raspi_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
  52. struct rt_i2c_msg msgs[],
  53. rt_uint32_t num);
  54. static rt_size_t raspi_i2c_slv_xfer(struct rt_i2c_bus_device *bus,
  55. struct rt_i2c_msg msgs[],
  56. rt_uint32_t num);
  57. static rt_err_t raspi_i2c_bus_control(struct rt_i2c_bus_device *bus,
  58. rt_uint32_t,
  59. rt_uint32_t);
  60. void i2c_master_init(struct raspi_master_config_t *cfg)
  61. {
  62. volatile rt_uint32_t addr;
  63. rt_uint32_t data;
  64. bcm283x_gpio_fsel(cfg->sdl_pin, cfg->sdl_pin_mode); /* SDA */
  65. bcm283x_gpio_fsel(cfg->scl_pin, cfg->scl_pin_mode); /* SCL */
  66. addr = cfg->bsc_base + BCM283X_BSC_DIV;
  67. data = bcm283x_peri_read(addr);
  68. i2c_byte_wait_us = ( data * 1000000 / BCM283X_CORE_CLK_HZ) * 9;
  69. addr = cfg->bsc_base + BCM283X_BSC_DIV;
  70. bcm283x_peri_write(addr, cfg->clk_div);
  71. //update
  72. i2c_byte_wait_us = (cfg->clk_div * 1000000 * 9 / BCM283X_CORE_CLK_HZ);
  73. }
  74. static rt_size_t raspi_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
  75. struct rt_i2c_msg msgs[],
  76. rt_uint32_t num)
  77. {
  78. volatile rt_uint32_t addr;
  79. struct raspi_i2c_bus *raspi_i2c;
  80. rt_size_t i;
  81. RT_ASSERT(bus != RT_NULL);
  82. raspi_i2c = (struct raspi_i2c_bus *) bus;
  83. raspi_i2c->msg = msgs;
  84. raspi_i2c->msg_ptr = 0;
  85. raspi_i2c->msg_cnt = num;
  86. raspi_i2c->dptr = 0;
  87. addr = raspi_i2c->cfg->bsc_base + BCM283X_BSC_A;
  88. bcm283x_peri_write(addr, msgs->addr);
  89. for (i = 0; i < num; i++)
  90. {
  91. if ( raspi_i2c->msg[i].flags & RT_I2C_RD )
  92. {
  93. bcm283x_i2c_read(raspi_i2c->cfg->bsc_base, raspi_i2c->msg->buf, num);
  94. }
  95. else
  96. {
  97. bcm283x_i2c_write(raspi_i2c->cfg->bsc_base, raspi_i2c->msg->buf, num);
  98. }
  99. }
  100. raspi_i2c->msg = RT_NULL;
  101. raspi_i2c->msg_ptr = 0;
  102. raspi_i2c->msg_cnt = 0;
  103. raspi_i2c->dptr = 0;
  104. return i;
  105. }
  106. static rt_size_t raspi_i2c_slv_xfer(struct rt_i2c_bus_device *bus,
  107. struct rt_i2c_msg msgs[],
  108. rt_uint32_t num)
  109. {
  110. return 0;
  111. }
  112. static rt_err_t raspi_i2c_bus_control(struct rt_i2c_bus_device *bus,
  113. rt_uint32_t cmd,
  114. rt_uint32_t arg)
  115. {
  116. return RT_ERROR;
  117. }
  118. static const struct rt_i2c_bus_device_ops raspi_i2c_ops =
  119. {
  120. .master_xfer = raspi_i2c_mst_xfer,
  121. .slave_xfer = raspi_i2c_slv_xfer,
  122. .i2c_bus_control = raspi_i2c_bus_control,
  123. };
  124. static rt_err_t raspi_i2c_configure(struct raspi_i2c_bus *bus, struct raspi_master_config_t *cfg)
  125. {
  126. RT_ASSERT(bus != RT_NULL);
  127. RT_ASSERT(cfg != RT_NULL);
  128. bus->device.ops = &raspi_i2c_ops;
  129. bus->cfg = cfg;
  130. i2c_master_init(cfg);
  131. return RT_EOK;
  132. }
  133. #endif
  134. int rt_hw_i2c_init(void)
  135. {
  136. #if defined(BSP_USING_I2C0)
  137. raspi_i2c_configure(&raspi_i2c0 , &raspi_i2c0_cfg);
  138. rt_i2c_bus_device_register(&raspi_i2c0.device, raspi_i2c0.device_name);
  139. #endif /* BSP_USING_I2C1 */
  140. #if defined(BSP_USING_I2C1)
  141. raspi_i2c_configure(&raspi_i2c1 , &raspi_i2c1_cfg);
  142. rt_i2c_bus_device_register(&raspi_i2c1.device, raspi_i2c1.device_name);
  143. #endif /* BSP_USING_I2C2 */
  144. return 0;
  145. }
  146. INIT_DEVICE_EXPORT(rt_hw_i2c_init);