1 /**************************************************************************//**
2 *
3 * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Change Logs:
8 * Date            Author       Notes
9 * 2022-8-16       Wayne        First version
10 *
11 ******************************************************************************/
12 
13 #ifndef __CCAP_SENSOR_H__
14 #define __CCAP_SENSOR_H__
15 
16 #include <rtthread.h>
17 #include <rtdevice.h>
18 #include <drv_gpio.h>
19 #include "NuMicro.h"
20 
21 typedef enum
22 {
23     evCCAPSNR_HM1055,
24     evCCAPSNR_ADV728X,
25     evCCAPSNR_CNT
26 } ccap_sensor_id;
27 
28 typedef enum
29 {
30     CCAP_SENSOR_CMD_RESET,
31     CCAP_SENSOR_CMD_SET_POWER,
32     CCAP_SENSOR_CMD_SET_MODE,
33     CCAP_SENSOR_CMD_GET_SUIT_MODE,
34 } ccap_sensor_cmd;
35 
36 typedef struct
37 {
38     uint32_t u32Width;     // Horizontal total pixel
39     uint32_t u32Height;    // Vertical total pixel
40     uint8_t *pu8FarmAddr;
41     uint32_t u32PixFmt;
42 } ccap_view_info;
43 typedef ccap_view_info *ccap_view_info_t;
44 
45 typedef struct
46 {
47     rt_uint16_t  u16Addr;
48     rt_uint16_t  u16Val;
49 } sensor_reg_val;
50 typedef sensor_reg_val *sensor_reg_val_t;
51 
52 typedef struct
53 {
54     ccap_view_info        sViewInfo;
55     const sensor_reg_val *psRegArr;
56     rt_uint32_t           u32RegArrSize;
57     rt_uint32_t           u32SenClk;
58     rt_uint32_t           u32Polarity;
59 } sensor_mode_info;
60 typedef sensor_mode_info *sensor_mode_info_t;
61 
62 typedef rt_err_t (*ccap_sensor_set_mode)(struct rt_i2c_bus_device *i2cdev, void *pvPriv, sensor_mode_info *psInfo);
63 typedef struct
64 {
65     ccap_sensor_id     eId;
66     sensor_mode_info_t psModeInfo;
67     uint32_t           ModeInfoSize;
68     rt_uint16_t        u16AddrBL;  // Address byte length
69     rt_uint16_t        u16ValBL;   // Address byte length
70     rt_uint16_t        u16DevAddr;
71 
72     rt_bool_t          RstActLow;
73     rt_uint32_t        RstHoldTimeInMs;
74     rt_bool_t          PwrDwnActLow;
75 
76     ccap_sensor_set_mode pfnSetMode;
77 } sensor_priv;
78 typedef sensor_priv *sensor_priv_t;
79 
80 typedef struct
81 {
82     rt_base_t     RstPin;
83     rt_base_t     PwrDwnPin;
84     const char   *I2cName;
85 } ccap_sensor_io;
86 typedef ccap_sensor_io *ccap_sensor_io_t;
87 
88 typedef struct
89 {
90     struct rt_device  device;
91     ccap_sensor_io   *psIo;
92 } ccap_sensor_dev;
93 typedef ccap_sensor_dev *ccap_sensor_dev_t;
94 
95 rt_err_t ccap_sensor_i2c_write(struct rt_i2c_bus_device *i2cdev, rt_uint16_t addr, rt_uint8_t *puBuf, int i32BufLen);
96 rt_err_t ccap_sensor_i2c_read(struct rt_i2c_bus_device *i2cdev, rt_uint16_t addr, rt_uint8_t *puWBuf, int i32WBufLen, rt_uint8_t *puRBuf, int i32RBufLen);
97 rt_err_t ccap_sensor_register(struct rt_device *device, const char *name, void *user_data);
98 rt_err_t nu_ccap_sensor_create(ccap_sensor_io *psIo, ccap_sensor_id evSensorId, const char *szName);
99 ccap_sensor_dev_t nu_create_hm1055(ccap_sensor_io *psIo, const char *szName);
100 ccap_sensor_dev_t nu_create_adv728x(ccap_sensor_io *psIo, const char *szName);
101 
102 #endif /* __CCAP_SENSOR_H__ */
103