1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 Chipsea Technologies (Shenzhen) Corp., Ltd. 3094332d3Sopenharmony_ci * 4094332d3Sopenharmony_ci * HDF is dual licensed: you can use it either under the terms of 5094332d3Sopenharmony_ci * the GPL, or the BSD license, at your option. 6094332d3Sopenharmony_ci * See the LICENSE file in the root of this repository for complete details. 7094332d3Sopenharmony_ci */ 8094332d3Sopenharmony_ci 9094332d3Sopenharmony_ci#include "ppg_cs1262.h" 10094332d3Sopenharmony_ci#include <securec.h> 11094332d3Sopenharmony_ci#include "sensor_ppg_driver.h" 12094332d3Sopenharmony_ci#include "sensor_device_if.h" 13094332d3Sopenharmony_ci#include "osal_mem.h" 14094332d3Sopenharmony_ci#include "osal_time.h" 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#define HDF_LOG_TAG khdf_sensor_ppg_driver 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_cistatic struct Cs1262DrvData *g_cs1262DrvData = NULL; 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_cistatic struct Cs1262DrvData *GetDrvData(void) 21094332d3Sopenharmony_ci{ 22094332d3Sopenharmony_ci return g_cs1262DrvData; 23094332d3Sopenharmony_ci} 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cistatic int32_t ResetChip() 26094332d3Sopenharmony_ci{ 27094332d3Sopenharmony_ci uint8_t resetCmd[] = { CS1262_CHIP_REST_CMD, CS1262_SPI_DUMMY_DATA, CS1262_SPI_DUMMY_DATA }; 28094332d3Sopenharmony_ci 29094332d3Sopenharmony_ci if (Cs1262WriteData(resetCmd, HDF_ARRAY_SIZE(resetCmd)) != HDF_SUCCESS) { 30094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262WriteData fail", __func__); 31094332d3Sopenharmony_ci return HDF_FAILURE; 32094332d3Sopenharmony_ci } 33094332d3Sopenharmony_ci 34094332d3Sopenharmony_ci // delay 1 ms 35094332d3Sopenharmony_ci OsalMDelay(1); 36094332d3Sopenharmony_ci return HDF_SUCCESS; 37094332d3Sopenharmony_ci} 38094332d3Sopenharmony_ci 39094332d3Sopenharmony_cistatic int32_t ResetModule(uint16_t moduleOffset) 40094332d3Sopenharmony_ci{ 41094332d3Sopenharmony_ci uint8_t ret; 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_ci ret = Cs1262WriteRegbit(CS1262_RSTCON_REG, moduleOffset, CS1262_REG_BIT_SET); 44094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 45094332d3Sopenharmony_ci HDF_LOGE("%s: CS1262_RST module fail CS1262_REG_BIT_SET", __func__); 46094332d3Sopenharmony_ci return HDF_FAILURE; 47094332d3Sopenharmony_ci } 48094332d3Sopenharmony_ci 49094332d3Sopenharmony_ci ret = Cs1262WriteRegbit(CS1262_RSTCON_REG, moduleOffset, CS1262_REG_BIT_RESET); 50094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 51094332d3Sopenharmony_ci HDF_LOGE("%s: CS1262_RST module fail CS1262_REG_BIT_RESET", __func__); 52094332d3Sopenharmony_ci return HDF_FAILURE; 53094332d3Sopenharmony_ci } 54094332d3Sopenharmony_ci 55094332d3Sopenharmony_ci return HDF_SUCCESS; 56094332d3Sopenharmony_ci} 57094332d3Sopenharmony_ci 58094332d3Sopenharmony_cistatic int32_t RegLock(Cs1262LockStatus lockStatus) 59094332d3Sopenharmony_ci{ 60094332d3Sopenharmony_ci int32_t ret; 61094332d3Sopenharmony_ci uint16_t regRead = 0; 62094332d3Sopenharmony_ci Cs1262RegGroup lockGroup[] = { 63094332d3Sopenharmony_ci {.regAddr = CS1262_WRPROT_REG, .regVal = CS1262_LOCK, 1}, 64094332d3Sopenharmony_ci {.regAddr = CS1262_WRPROT_REG, .regVal = CS1262_UN_LOCK1, 1}, 65094332d3Sopenharmony_ci {.regAddr = CS1262_WRPROT_REG, .regVal = CS1262_UN_LOCK2, 1}, 66094332d3Sopenharmony_ci {.regAddr = CS1262_WRPROT_REG, .regVal = CS1262_UN_LOCK3, 1} 67094332d3Sopenharmony_ci }; 68094332d3Sopenharmony_ci // lock write 1 byte 'CS1262_LOCK'; unlock need write 3 bytes 69094332d3Sopenharmony_ci uint16_t lockGroupLen = (lockStatus == CS1262_REG_LOCK) ? 1 : 3; 70094332d3Sopenharmony_ci 71094332d3Sopenharmony_ci ret = Cs1262WriteGroup(&lockGroup[lockStatus], lockGroupLen); 72094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 73094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262WriteGroup fail", __func__); 74094332d3Sopenharmony_ci return HDF_FAILURE; 75094332d3Sopenharmony_ci } 76094332d3Sopenharmony_ci 77094332d3Sopenharmony_ci ret = Cs1262ReadRegs(CS1262_SYS_STATE_REG, ®Read, 1); 78094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 79094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262ReadRegs CS1262_SYS_STATE_REG fail", __func__); 80094332d3Sopenharmony_ci return HDF_FAILURE; 81094332d3Sopenharmony_ci } 82094332d3Sopenharmony_ci 83094332d3Sopenharmony_ci if ((regRead & LOCK_REG_OFFSET) == lockStatus) { 84094332d3Sopenharmony_ci return HDF_SUCCESS; 85094332d3Sopenharmony_ci } 86094332d3Sopenharmony_ci 87094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262 Lock fail status = %d", __func__, lockStatus); 88094332d3Sopenharmony_ci return HDF_FAILURE; 89094332d3Sopenharmony_ci} 90094332d3Sopenharmony_ci 91094332d3Sopenharmony_cistatic int32_t ReadFifo(uint8_t *outBuf, uint16_t outBufMaxLen, uint16_t *outLen) 92094332d3Sopenharmony_ci{ 93094332d3Sopenharmony_ci uint8_t ret; 94094332d3Sopenharmony_ci uint16_t fifoState = 0; 95094332d3Sopenharmony_ci uint16_t fifoNum; 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_ci ret = Cs1262ReadRegs(CS1262_FIFO_STATE_REG, &fifoState, 1); 98094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 99094332d3Sopenharmony_ci HDF_LOGE("%s: read reg %d fail", __func__, CS1262_FIFO_STATE_REG); 100094332d3Sopenharmony_ci return HDF_FAILURE; 101094332d3Sopenharmony_ci } 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci fifoNum = fifoState & FIFO_NUM_OFFSET; 104094332d3Sopenharmony_ci // empty 105094332d3Sopenharmony_ci if ((fifoNum == 0) || (fifoState & FIFO_EMPTY_OFFSET)) { 106094332d3Sopenharmony_ci HDF_LOGI("%s: data FIFO is empty, no need read.", __func__); 107094332d3Sopenharmony_ci return HDF_SUCCESS; 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_ci // full 111094332d3Sopenharmony_ci if (fifoState & FIFO_FULL_OFFSET) { 112094332d3Sopenharmony_ci fifoNum = CS1262_MAX_FIFO_READ_NUM; 113094332d3Sopenharmony_ci } 114094332d3Sopenharmony_ci 115094332d3Sopenharmony_ci // overflow 116094332d3Sopenharmony_ci if ((fifoNum * sizeof(Cs1262FifoVal)) > outBufMaxLen) { 117094332d3Sopenharmony_ci fifoNum = (outBufMaxLen / sizeof(Cs1262FifoVal)); 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci 120094332d3Sopenharmony_ci (void)memset_s(outBuf, outBufMaxLen, 0, (fifoNum * sizeof(Cs1262FifoVal))); 121094332d3Sopenharmony_ci ret = Cs1262ReadFifoReg((Cs1262FifoVal *)outBuf, fifoNum); 122094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 123094332d3Sopenharmony_ci HDF_LOGE("%s: ReadFifoReg fail", __func__); 124094332d3Sopenharmony_ci return HDF_FAILURE; 125094332d3Sopenharmony_ci } 126094332d3Sopenharmony_ci 127094332d3Sopenharmony_ci *outLen = fifoNum * sizeof(Cs1262FifoVal); 128094332d3Sopenharmony_ci 129094332d3Sopenharmony_ci return HDF_SUCCESS; 130094332d3Sopenharmony_ci} 131094332d3Sopenharmony_ci 132094332d3Sopenharmony_cistatic inline int32_t SetIER(uint16_t it, uint8_t status) 133094332d3Sopenharmony_ci{ 134094332d3Sopenharmony_ci return Cs1262WriteRegbit(CS1262_IER_REG, it, status); 135094332d3Sopenharmony_ci} 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_cistatic inline int32_t ClearIFR(uint16_t it) 138094332d3Sopenharmony_ci{ 139094332d3Sopenharmony_ci return Cs1262WriteRegbit(CS1262_IFR_REG, it, CS1262_REG_BIT_SET); 140094332d3Sopenharmony_ci} 141094332d3Sopenharmony_ci 142094332d3Sopenharmony_cistatic int32_t Cs1262SetOption(uint32_t option) 143094332d3Sopenharmony_ci{ 144094332d3Sopenharmony_ci HDF_LOGI("%s: cs1262 setOption :%d", __func__, option); 145094332d3Sopenharmony_ci return HDF_SUCCESS; 146094332d3Sopenharmony_ci} 147094332d3Sopenharmony_ci 148094332d3Sopenharmony_cistatic int32_t Writefw(Cs1262RegConfigTab *regTab) 149094332d3Sopenharmony_ci{ 150094332d3Sopenharmony_ci int32_t ret; 151094332d3Sopenharmony_ci Cs1262RegGroup regGroup[] = { 152094332d3Sopenharmony_ci { .regAddr = CS1262_CLOCK_REG, .regVal = regTab->clock, 1 }, 153094332d3Sopenharmony_ci { .regAddr = CS1262_TL_BA, .regValGroup = regTab->tlTab, .regLen = TL_REGS_NUM }, 154094332d3Sopenharmony_ci { .regAddr = CS1262_TX_BA, .regValGroup = regTab->txTab, .regLen = TX_REGS_NUM }, 155094332d3Sopenharmony_ci { .regAddr = CS1262_RX_BA, .regValGroup = regTab->rxTab, .regLen = RX_REGS_NUM }, 156094332d3Sopenharmony_ci { .regAddr = CS1262_TE_BA, .regValGroup = regTab->teTab, .regLen = TE_REGS_NUM }, 157094332d3Sopenharmony_ci { .regAddr = CS1262_FIFO_OFFSET_REG, .regValGroup = (regTab->fifoTab + FIFO_WRITE_OFFSET), 158094332d3Sopenharmony_ci .regLen = (FIFO_REGS_NUM - FIFO_WRITE_OFFSET)} 159094332d3Sopenharmony_ci }; 160094332d3Sopenharmony_ci 161094332d3Sopenharmony_ci if (RegLock(CS1262_REG_UNLOCK) != HDF_SUCCESS) { 162094332d3Sopenharmony_ci HDF_LOGE("%s: reg unlock failed", __func__); 163094332d3Sopenharmony_ci return HDF_FAILURE; 164094332d3Sopenharmony_ci } 165094332d3Sopenharmony_ci 166094332d3Sopenharmony_ci ret = Cs1262WriteGroup(regGroup, HDF_ARRAY_SIZE(regGroup)); 167094332d3Sopenharmony_ci HDF_LOGI("%s: cs1262 init ret :%d", __func__, ret); 168094332d3Sopenharmony_ci 169094332d3Sopenharmony_ci if (RegLock(CS1262_REG_LOCK) != HDF_SUCCESS) { 170094332d3Sopenharmony_ci HDF_LOGE("%s: reg lock failed", __func__); 171094332d3Sopenharmony_ci return HDF_FAILURE; 172094332d3Sopenharmony_ci } 173094332d3Sopenharmony_ci return ret; 174094332d3Sopenharmony_ci} 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_cistatic int32_t Cs1262SetMode(uint32_t mode) 177094332d3Sopenharmony_ci{ 178094332d3Sopenharmony_ci int32_t ret; 179094332d3Sopenharmony_ci Cs1262RegConfigTab *regTab = NULL; 180094332d3Sopenharmony_ci struct Cs1262DrvData *drvData = GetDrvData(); 181094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 182094332d3Sopenharmony_ci 183094332d3Sopenharmony_ci if ((mode == NONE_MODE) || (drvData->regMode == mode)) { 184094332d3Sopenharmony_ci HDF_LOGI("%s: mode = %d, drvData->regMode = %d", __func__, mode, drvData->regMode); 185094332d3Sopenharmony_ci drvData->regMode = mode; 186094332d3Sopenharmony_ci return HDF_SUCCESS; 187094332d3Sopenharmony_ci } 188094332d3Sopenharmony_ci 189094332d3Sopenharmony_ci ret = Cs1262Loadfw(mode, ®Tab); 190094332d3Sopenharmony_ci if ((ret != HDF_SUCCESS) || (regTab == NULL)) { 191094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262Loadfw failed", __func__); 192094332d3Sopenharmony_ci return HDF_FAILURE; 193094332d3Sopenharmony_ci } 194094332d3Sopenharmony_ci 195094332d3Sopenharmony_ci ret = Writefw(regTab); 196094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 197094332d3Sopenharmony_ci HDF_LOGE("%s: Writefw failed", __func__); 198094332d3Sopenharmony_ci return HDF_FAILURE; 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci 201094332d3Sopenharmony_ci drvData->regMode = mode; 202094332d3Sopenharmony_ci 203094332d3Sopenharmony_ci HDF_LOGI("%s: set mode success", __func__); 204094332d3Sopenharmony_ci 205094332d3Sopenharmony_ci return HDF_SUCCESS; 206094332d3Sopenharmony_ci} 207094332d3Sopenharmony_ci 208094332d3Sopenharmony_cistatic int32_t Cs1262ReadData(uint8_t *outBuf, uint16_t outBufMaxLen, uint16_t *outLen) 209094332d3Sopenharmony_ci{ 210094332d3Sopenharmony_ci uint8_t ret; 211094332d3Sopenharmony_ci uint16_t ifr = 0; 212094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(outBuf, HDF_ERR_INVALID_PARAM); 213094332d3Sopenharmony_ci 214094332d3Sopenharmony_ci ret = Cs1262ReadRegs(CS1262_IFR_REG, &ifr, 1); 215094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 216094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262ReadRegs CS1262_IFR_REG fail", __func__); 217094332d3Sopenharmony_ci return HDF_FAILURE; 218094332d3Sopenharmony_ci } 219094332d3Sopenharmony_ci 220094332d3Sopenharmony_ci if (ifr & IFR_RDY_FLAG) { 221094332d3Sopenharmony_ci ret = ReadFifo(outBuf, outBufMaxLen, outLen); 222094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 223094332d3Sopenharmony_ci HDF_LOGE("%s: ReadFifo fail", __func__); 224094332d3Sopenharmony_ci } 225094332d3Sopenharmony_ci 226094332d3Sopenharmony_ci ret = ClearIFR(FIFO_RDY_IFR_OFFSET); 227094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 228094332d3Sopenharmony_ci HDF_LOGE("%s: ClearIFR fail", __func__); 229094332d3Sopenharmony_ci return HDF_FAILURE; 230094332d3Sopenharmony_ci } 231094332d3Sopenharmony_ci } 232094332d3Sopenharmony_ci return HDF_SUCCESS; 233094332d3Sopenharmony_ci} 234094332d3Sopenharmony_ci 235094332d3Sopenharmony_cistatic int32_t Cs1262Enable() 236094332d3Sopenharmony_ci{ 237094332d3Sopenharmony_ci int32_t ret; 238094332d3Sopenharmony_ci struct Cs1262DrvData *drvData = GetDrvData(); 239094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 240094332d3Sopenharmony_ci 241094332d3Sopenharmony_ci if (drvData->regMode == NONE_MODE) { 242094332d3Sopenharmony_ci HDF_LOGW("%s: drvData->regMode == NONE_MODE, need set default mode when enable", __func__); 243094332d3Sopenharmony_ci if (Cs1262SetMode(DEFAULT_MODE) != HDF_SUCCESS) { 244094332d3Sopenharmony_ci HDF_LOGE("%s: set default mode failed", __func__); 245094332d3Sopenharmony_ci return HDF_FAILURE; 246094332d3Sopenharmony_ci } 247094332d3Sopenharmony_ci } 248094332d3Sopenharmony_ci 249094332d3Sopenharmony_ci if (RegLock(CS1262_REG_UNLOCK) != HDF_SUCCESS) { 250094332d3Sopenharmony_ci HDF_LOGE("%s: reg unlock failed", __func__); 251094332d3Sopenharmony_ci return HDF_FAILURE; 252094332d3Sopenharmony_ci } 253094332d3Sopenharmony_ci 254094332d3Sopenharmony_ci ret = SetIER(FIFO_RDY_IER_OFFSET, CS1262_REG_BIT_SET); 255094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 256094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262Enable fail", __func__); 257094332d3Sopenharmony_ci return HDF_FAILURE; 258094332d3Sopenharmony_ci } 259094332d3Sopenharmony_ci 260094332d3Sopenharmony_ci ret = ResetModule(CS1262_TE_RST_OFFSET); 261094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 262094332d3Sopenharmony_ci HDF_LOGE("%s: reset failed", __func__); 263094332d3Sopenharmony_ci return HDF_FAILURE; 264094332d3Sopenharmony_ci } 265094332d3Sopenharmony_ci 266094332d3Sopenharmony_ci ret = Cs1262WriteRegbit(CS1262_TE_CTRL_REG, PRF_START_BIT, CS1262_REG_BIT_SET); 267094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 268094332d3Sopenharmony_ci HDF_LOGE("%s: Cs1262WriteRegbit CS1262_TE_CTRL_REG fail", __func__); 269094332d3Sopenharmony_ci return HDF_FAILURE; 270094332d3Sopenharmony_ci } 271094332d3Sopenharmony_ci 272094332d3Sopenharmony_ci if (RegLock(CS1262_REG_LOCK) != HDF_SUCCESS) { 273094332d3Sopenharmony_ci HDF_LOGE("%s: reg lock failed", __func__); 274094332d3Sopenharmony_ci return HDF_FAILURE; 275094332d3Sopenharmony_ci } 276094332d3Sopenharmony_ci 277094332d3Sopenharmony_ci return HDF_SUCCESS; 278094332d3Sopenharmony_ci} 279094332d3Sopenharmony_ci 280094332d3Sopenharmony_cistatic int32_t Cs1262Disable() 281094332d3Sopenharmony_ci{ 282094332d3Sopenharmony_ci int32_t ret; 283094332d3Sopenharmony_ci 284094332d3Sopenharmony_ci if (RegLock(CS1262_REG_UNLOCK) != HDF_SUCCESS) { 285094332d3Sopenharmony_ci HDF_LOGE("%s: reg unlock failed", __func__); 286094332d3Sopenharmony_ci return HDF_FAILURE; 287094332d3Sopenharmony_ci } 288094332d3Sopenharmony_ci 289094332d3Sopenharmony_ci ret = SetIER(FIFO_RDY_IER_OFFSET, CS1262_REG_BIT_RESET); 290094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 291094332d3Sopenharmony_ci HDF_LOGE("%s: SetIER fail", __func__); 292094332d3Sopenharmony_ci return HDF_FAILURE; 293094332d3Sopenharmony_ci } 294094332d3Sopenharmony_ci 295094332d3Sopenharmony_ci ret = Cs1262WriteRegbit(CS1262_TE_CTRL_REG, PRF_START_BIT, CS1262_REG_BIT_RESET); 296094332d3Sopenharmony_ci HDF_LOGI("%s: Cs1262 disable ret = %d", __func__, ret); 297094332d3Sopenharmony_ci 298094332d3Sopenharmony_ci if (RegLock(CS1262_REG_LOCK) != HDF_SUCCESS) { 299094332d3Sopenharmony_ci HDF_LOGE("%s: reg unlock failed", __func__); 300094332d3Sopenharmony_ci return HDF_FAILURE; 301094332d3Sopenharmony_ci } 302094332d3Sopenharmony_ci 303094332d3Sopenharmony_ci return ret; 304094332d3Sopenharmony_ci} 305094332d3Sopenharmony_ci 306094332d3Sopenharmony_cistatic int32_t InitChip() 307094332d3Sopenharmony_ci{ 308094332d3Sopenharmony_ci (void)Cs1262SetMode(NONE_MODE); 309094332d3Sopenharmony_ci return ResetChip(); 310094332d3Sopenharmony_ci} 311094332d3Sopenharmony_ci 312094332d3Sopenharmony_cistatic int32_t CheckChipId(struct PpgCfgData *cfgData) 313094332d3Sopenharmony_ci{ 314094332d3Sopenharmony_ci uint16_t regRead = 0; 315094332d3Sopenharmony_ci uint8_t cnt = 0; 316094332d3Sopenharmony_ci 317094332d3Sopenharmony_ci uint16_t reg = cfgData->sensorCfg.sensorAttr.chipIdReg; 318094332d3Sopenharmony_ci uint16_t val = cfgData->sensorCfg.sensorAttr.chipIdValue; 319094332d3Sopenharmony_ci 320094332d3Sopenharmony_ci // retry 3 times 321094332d3Sopenharmony_ci while (cnt++ < 3) { 322094332d3Sopenharmony_ci if ((Cs1262ReadRegs(reg, ®Read, 1) == HDF_SUCCESS) && (regRead == val)) { 323094332d3Sopenharmony_ci HDF_LOGI("%s: cs1262 read chip id success!", __func__); 324094332d3Sopenharmony_ci return HDF_SUCCESS; 325094332d3Sopenharmony_ci } 326094332d3Sopenharmony_ci } 327094332d3Sopenharmony_ci 328094332d3Sopenharmony_ci HDF_LOGE("%s: cs1262 read chip id fail, reg=%u!", __func__, reg); 329094332d3Sopenharmony_ci return HDF_FAILURE; 330094332d3Sopenharmony_ci} 331094332d3Sopenharmony_ci 332094332d3Sopenharmony_cistatic int32_t DispatchCs1262(struct HdfDeviceIoClient *client, 333094332d3Sopenharmony_ci int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) 334094332d3Sopenharmony_ci{ 335094332d3Sopenharmony_ci (void)client; 336094332d3Sopenharmony_ci (void)cmd; 337094332d3Sopenharmony_ci (void)data; 338094332d3Sopenharmony_ci (void)reply; 339094332d3Sopenharmony_ci 340094332d3Sopenharmony_ci return HDF_SUCCESS; 341094332d3Sopenharmony_ci} 342094332d3Sopenharmony_ci 343094332d3Sopenharmony_cistatic int32_t Cs1262BindDriver(struct HdfDeviceObject *device) 344094332d3Sopenharmony_ci{ 345094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); 346094332d3Sopenharmony_ci 347094332d3Sopenharmony_ci struct Cs1262DrvData *drvData = (struct Cs1262DrvData *)OsalMemCalloc(sizeof(*drvData)); 348094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_MALLOC_FAIL); 349094332d3Sopenharmony_ci (void)memset_s(drvData, sizeof(struct Cs1262DrvData), 0, sizeof(struct Cs1262DrvData)); 350094332d3Sopenharmony_ci 351094332d3Sopenharmony_ci drvData->ioService.Dispatch = DispatchCs1262; 352094332d3Sopenharmony_ci drvData->device = device; 353094332d3Sopenharmony_ci device->service = &drvData->ioService; 354094332d3Sopenharmony_ci g_cs1262DrvData = drvData; 355094332d3Sopenharmony_ci 356094332d3Sopenharmony_ci return HDF_SUCCESS; 357094332d3Sopenharmony_ci} 358094332d3Sopenharmony_ci 359094332d3Sopenharmony_cistatic int32_t Cs1262InitDriver(struct HdfDeviceObject *device) 360094332d3Sopenharmony_ci{ 361094332d3Sopenharmony_ci int32_t ret; 362094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); 363094332d3Sopenharmony_ci struct Cs1262DrvData *drvData = (struct Cs1262DrvData *)device->service; 364094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); 365094332d3Sopenharmony_ci 366094332d3Sopenharmony_ci ret = ParsePpgCfgData(device->property, &(drvData->ppgCfg)); 367094332d3Sopenharmony_ci if ((ret != HDF_SUCCESS) || (drvData->ppgCfg == NULL)) { 368094332d3Sopenharmony_ci HDF_LOGE("%s: cs1262 construct fail!", __func__); 369094332d3Sopenharmony_ci return HDF_FAILURE; 370094332d3Sopenharmony_ci } 371094332d3Sopenharmony_ci 372094332d3Sopenharmony_ci ret = Cs1262InitSpi(&drvData->ppgCfg->sensorCfg.busCfg); 373094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 374094332d3Sopenharmony_ci HDF_LOGE("%s: cs1262 init spi!", __func__); 375094332d3Sopenharmony_ci return HDF_FAILURE; 376094332d3Sopenharmony_ci } 377094332d3Sopenharmony_ci 378094332d3Sopenharmony_ci ret = CheckChipId(drvData->ppgCfg); 379094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 380094332d3Sopenharmony_ci HDF_LOGE("%s: cs1262 check chip fail!", __func__); 381094332d3Sopenharmony_ci return HDF_FAILURE; 382094332d3Sopenharmony_ci } 383094332d3Sopenharmony_ci 384094332d3Sopenharmony_ci ret = InitChip(); 385094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 386094332d3Sopenharmony_ci HDF_LOGE("%s: cs1262 init chip fail!", __func__); 387094332d3Sopenharmony_ci return HDF_FAILURE; 388094332d3Sopenharmony_ci } 389094332d3Sopenharmony_ci 390094332d3Sopenharmony_ci struct PpgChipData chipData = { 391094332d3Sopenharmony_ci .cfgData = drvData->ppgCfg, 392094332d3Sopenharmony_ci .opsCall = { 393094332d3Sopenharmony_ci .ReadData = Cs1262ReadData, 394094332d3Sopenharmony_ci .Enable = Cs1262Enable, 395094332d3Sopenharmony_ci .Disable = Cs1262Disable, 396094332d3Sopenharmony_ci .SetOption = Cs1262SetOption, 397094332d3Sopenharmony_ci .SetMode = Cs1262SetMode, 398094332d3Sopenharmony_ci } 399094332d3Sopenharmony_ci }; 400094332d3Sopenharmony_ci 401094332d3Sopenharmony_ci ret = RegisterPpgChip(&chipData); 402094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 403094332d3Sopenharmony_ci HDF_LOGE("%s: Register CS1262 failed", __func__); 404094332d3Sopenharmony_ci return HDF_FAILURE; 405094332d3Sopenharmony_ci } 406094332d3Sopenharmony_ci 407094332d3Sopenharmony_ci HDF_LOGI("%s: cs1262 init driver success", __func__); 408094332d3Sopenharmony_ci return HDF_SUCCESS; 409094332d3Sopenharmony_ci} 410094332d3Sopenharmony_ci 411094332d3Sopenharmony_cistatic void Cs1262ReleaseDriver(struct HdfDeviceObject *device) 412094332d3Sopenharmony_ci{ 413094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN(device); 414094332d3Sopenharmony_ci struct Cs1262DrvData *drvData = (struct Cs1262DrvData *)device->service; 415094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN(drvData); 416094332d3Sopenharmony_ci CHECK_NULL_PTR_RETURN(drvData->ppgCfg); 417094332d3Sopenharmony_ci 418094332d3Sopenharmony_ci Cs1262ReleaseSpi(&drvData->ppgCfg->sensorCfg.busCfg); 419094332d3Sopenharmony_ci (void)memset_s(drvData, sizeof(struct Cs1262DrvData), 0, sizeof(struct Cs1262DrvData)); 420094332d3Sopenharmony_ci OsalMemFree(drvData); 421094332d3Sopenharmony_ci} 422094332d3Sopenharmony_ci 423094332d3Sopenharmony_cistruct HdfDriverEntry g_ppgCs1262DevEntry = { 424094332d3Sopenharmony_ci .moduleVersion = CS1262_MODULE_VER, 425094332d3Sopenharmony_ci .moduleName = "HDF_SENSOR_PPG_CS1262", 426094332d3Sopenharmony_ci .Bind = Cs1262BindDriver, 427094332d3Sopenharmony_ci .Init = Cs1262InitDriver, 428094332d3Sopenharmony_ci .Release = Cs1262ReleaseDriver, 429094332d3Sopenharmony_ci}; 430094332d3Sopenharmony_ci 431094332d3Sopenharmony_ciHDF_INIT(g_ppgCs1262DevEntry); 432