hpm_sccb.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. * Copyright (c) 2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_sccb.h"
  8. hpm_stat_t sccb_master_init(sccb_type sccb)
  9. {
  10. /*TODO*/
  11. return status_success;
  12. }
  13. uint8_t sccb_master_scan(sccb_type sccb)
  14. {
  15. for (uint8_t addr = 0x01, rxdata; addr < 0xff; addr++) {
  16. if (i2c_master_read(sccb, addr, &rxdata, 1) == status_success) {
  17. return addr;
  18. }
  19. }
  20. return 0;
  21. }
  22. hpm_stat_t sccb_master_gencall(sccb_type sccb, uint8_t cmd)
  23. {
  24. uint8_t reg_data = 0;
  25. return i2c_master_address_write(sccb, 0x00, &cmd, 1, &reg_data, 1);
  26. }
  27. hpm_stat_t sccb_master_readb(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint8_t *reg_data)
  28. {
  29. return i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)&reg_addr, 1, reg_data, 1);
  30. }
  31. hpm_stat_t sccb_master_writeb(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint8_t reg_data)
  32. {
  33. return i2c_master_address_write(sccb, (uint16_t)slv_addr, (uint8_t *)&reg_addr, 1, (uint8_t *)&reg_data, 1);
  34. }
  35. hpm_stat_t sccb_master_readb2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint8_t *reg_data)
  36. {
  37. uint8_t r[2];
  38. r[0] = reg_addr >> 8;
  39. r[1] = reg_addr & 0xFF;
  40. return i2c_master_address_read(sccb, (uint16_t)slv_addr, r, sizeof(r), reg_data, 1);
  41. }
  42. hpm_stat_t sccb_master_writeb2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint8_t reg_data)
  43. {
  44. int ret = 0;
  45. uint8_t r[2];
  46. r[0] = reg_addr >> 8;
  47. r[1] = reg_addr & 0xFF;
  48. return i2c_master_address_write(sccb, (uint16_t)slv_addr, r, sizeof(r), (uint8_t *)&reg_data, 1);
  49. }
  50. hpm_stat_t sccb_master_readw(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint16_t *reg_data)
  51. {
  52. hpm_stat_t ret = status_success;
  53. ret = i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)&reg_addr,
  54. 1, (uint8_t *)reg_data, 2);
  55. if (ret == status_success) {
  56. *reg_data = (*reg_data >> 8) | (*reg_data << 8);
  57. }
  58. return ret;
  59. }
  60. hpm_stat_t sccb_master_writew(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint16_t reg_data)
  61. {
  62. reg_data = (reg_data >> 8) | (reg_data << 8);
  63. return i2c_master_address_write(sccb, (uint16_t)slv_addr, (uint8_t *)&reg_addr, 1, (uint8_t *)&reg_data, 2);
  64. }
  65. hpm_stat_t sccb_master_readw2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint16_t *reg_data)
  66. {
  67. hpm_stat_t ret = status_success;
  68. ret = i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)&reg_addr,
  69. 2, (uint8_t *)reg_data, 2);
  70. if (ret == status_success) {
  71. *reg_data = (*reg_data >> 8) | (*reg_data << 8);
  72. }
  73. return ret;
  74. }
  75. hpm_stat_t sccb_master_writew2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint16_t reg_data)
  76. {
  77. int ret = 0;
  78. reg_data = (reg_data >> 8) | (reg_data << 8);
  79. return i2c_master_address_write(sccb, (uint16_t)slv_addr,
  80. (uint8_t *)&reg_addr, 2,
  81. (uint8_t *)&reg_data, 2);
  82. }
  83. hpm_stat_t sccb_master_read_bytes(sccb_type sccb, uint8_t slv_addr, uint8_t *buf, const uint32_t len, uint8_t flags)
  84. {
  85. return i2c_master_read(sccb, (uint16_t)slv_addr, buf, len);
  86. }
  87. hpm_stat_t cambus_write_bytes(sccb_type sccb, uint8_t slv_addr, uint8_t *buf, const uint32_t len, uint8_t flags)
  88. {
  89. int ret = 0;
  90. hpm_stat_t sta = status_success;
  91. int _len = len;
  92. int remain = 0;
  93. int offset = 0;
  94. while (_len > 0) {
  95. remain = (_len > 100) ? 100 : _len;
  96. sta = i2c_master_write(sccb, (uint16_t)slv_addr, &buf[offset], remain);
  97. if (sta != status_success) {
  98. return status_fail;
  99. }
  100. offset += remain;
  101. _len -= remain;
  102. }
  103. return sta;
  104. }