• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &reg_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 *)&reg_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 *)&reg_addr, 1, (uint8_t *)&reg_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 *)&reg_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 *)&reg_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 *)&reg_addr, 1, (uint8_t *)&reg_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 *)&reg_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 *)&reg_addr, 2,
93                                     (uint8_t *)&reg_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