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