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, &regRead, 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, &regTab);
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, &regRead, 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