123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /*
- * Copyright (c) 2023 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #include "hpm_sccb.h"
- hpm_stat_t sccb_master_init(sccb_type sccb)
- {
- /*TODO*/
- return status_success;
- }
- uint8_t sccb_master_scan(sccb_type sccb)
- {
- for (uint8_t addr = 0x01, rxdata; addr < 0xff; addr++) {
- if (i2c_master_read(sccb, addr, &rxdata, 1) == status_success) {
- return addr;
- }
- }
- return 0;
- }
- hpm_stat_t sccb_master_gencall(sccb_type sccb, uint8_t cmd)
- {
- uint8_t reg_data = 0;
- return i2c_master_address_write(sccb, 0x00, &cmd, 1, ®_data, 1);
- }
- hpm_stat_t sccb_master_readb(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint8_t *reg_data)
- {
- return i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)®_addr, 1, reg_data, 1);
- }
- hpm_stat_t sccb_master_writeb(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint8_t reg_data)
- {
- return i2c_master_address_write(sccb, (uint16_t)slv_addr, (uint8_t *)®_addr, 1, (uint8_t *)®_data, 1);
- }
- hpm_stat_t sccb_master_readb2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint8_t *reg_data)
- {
- uint8_t r[2];
- r[0] = reg_addr >> 8;
- r[1] = reg_addr & 0xFF;
- return i2c_master_address_read(sccb, (uint16_t)slv_addr, r, sizeof(r), reg_data, 1);
- }
- hpm_stat_t sccb_master_writeb2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint8_t reg_data)
- {
- int ret = 0;
- uint8_t r[2];
- r[0] = reg_addr >> 8;
- r[1] = reg_addr & 0xFF;
- return i2c_master_address_write(sccb, (uint16_t)slv_addr, r, sizeof(r), (uint8_t *)®_data, 1);
- }
- hpm_stat_t sccb_master_readw(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint16_t *reg_data)
- {
- hpm_stat_t ret = status_success;
- ret = i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)®_addr,
- 1, (uint8_t *)reg_data, 2);
- if (ret == status_success) {
- *reg_data = (*reg_data >> 8) | (*reg_data << 8);
- }
- return ret;
- }
- hpm_stat_t sccb_master_writew(sccb_type sccb, uint8_t slv_addr, uint8_t reg_addr, uint16_t reg_data)
- {
- reg_data = (reg_data >> 8) | (reg_data << 8);
- return i2c_master_address_write(sccb, (uint16_t)slv_addr, (uint8_t *)®_addr, 1, (uint8_t *)®_data, 2);
- }
- hpm_stat_t sccb_master_readw2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint16_t *reg_data)
- {
- hpm_stat_t ret = status_success;
- ret = i2c_master_address_read(sccb, (uint16_t)slv_addr, (uint8_t *)®_addr,
- 2, (uint8_t *)reg_data, 2);
- if (ret == status_success) {
- *reg_data = (*reg_data >> 8) | (*reg_data << 8);
- }
- return ret;
- }
- hpm_stat_t sccb_master_writew2(sccb_type sccb, uint8_t slv_addr, uint16_t reg_addr, uint16_t reg_data)
- {
- int ret = 0;
- reg_data = (reg_data >> 8) | (reg_data << 8);
- return i2c_master_address_write(sccb, (uint16_t)slv_addr,
- (uint8_t *)®_addr, 2,
- (uint8_t *)®_data, 2);
- }
- hpm_stat_t sccb_master_read_bytes(sccb_type sccb, uint8_t slv_addr, uint8_t *buf, const uint32_t len, uint8_t flags)
- {
- return i2c_master_read(sccb, (uint16_t)slv_addr, buf, len);
- }
- hpm_stat_t cambus_write_bytes(sccb_type sccb, uint8_t slv_addr, uint8_t *buf, const uint32_t len, uint8_t flags)
- {
- int ret = 0;
- hpm_stat_t sta = status_success;
- int _len = len;
- int remain = 0;
- int offset = 0;
- while (_len > 0) {
- remain = (_len > 100) ? 100 : _len;
- sta = i2c_master_write(sccb, (uint16_t)slv_addr, &buf[offset], remain);
- if (sta != status_success) {
- return status_fail;
- }
- offset += remain;
- _len -= remain;
- }
- return sta;
- }
|