1 /*
2  * Copyright (C) 2017-2019 Alibaba Group Holding Limited
3  */
4 
5 
6 /******************************************************************************
7  * @file     drv_crc.h
8  * @brief    Header File for CRC Driver
9  * @version  V1.0
10  * @date     02. June 2017
11  * @model    crc
12  ******************************************************************************/
13 #ifndef _CSI_CRC_H_
14 #define _CSI_CRC_H_
15 
16 
17 #include <stdint.h>
18 #include <drv/errno.h>
19 #include <drv/common.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /****** CRC specific error codes *****/
26 #define CRC_ERROR_MODE                (DRV_ERROR_SPECIFIC + 1)     ///< Specified Mode not supported
27 
28 /// definition for crc handle.
29 typedef void *crc_handle_t;
30 
31 /*----- CRC Control Codes: Mode -----*/
32 typedef enum {
33     CRC_MODE_CRC8                   = 0,   ///< Mode CRC8
34     CRC_MODE_CRC16,                        ///< Mode CRC16
35     CRC_MODE_CRC32                         ///< Mode CRC32
36 } crc_mode_e;
37 
38 /*----- CRC Control Codes: Mode Parameters: Key length -----*/
39 typedef enum {
40     CRC_STANDARD_CRC_ROHC         = 0,    ///< Standard CRC RHOC
41     CRC_STANDARD_CRC_MAXIM,               ///< Standard CRC MAXIAM
42     CRC_STANDARD_CRC_X25,                 ///< Standard CRC X25
43     CRC_STANDARD_CRC_CCITT,               ///< Standard CRC CCITT
44     CRC_STANDARD_CRC_CCITT_FALSE,         ///< Standard CRC CCITT-FALSE
45     CRC_STANDARD_CRC_USB,                 ///< Standard CRC USB
46     CRC_STANDARD_CRC_IBM,                 ///< Standard CRC IBM
47     CRC_STANDARD_CRC_MODBUS,              ///< Standard CRC MODBUS
48     CRC_STANDARD_CRC_ITU,                 ///< Standard CRC ITU
49     CRC_STANDARD_CRC_PMEQ_2,              ///< Standard CRC PMEQ_2
50     CRC_STANDARD_CRC_XMODEM,              ///< Standard CRC XMODEM
51     CRC_STANDARD_CRC_DNP,                 ///< Standard CRC DNP
52     CRC_STANDARD_CRC_NONE,                ///< Standard CRC NONE
53 } crc_standard_crc_e;
54 
55 /**
56 \brief CRC Status
57 */
58 typedef struct {
59     uint32_t busy             : 1;        ///< busy flag
60 } crc_status_t;
61 
62 /****** CRC Event *****/
63 typedef enum {
64     CRC_EVENT_CALCULATE_COMPLETE  = 0,  ///< Calculate completed
65 } crc_event_e;
66 
67 typedef void (*crc_event_cb_t)(int32_t idx, crc_event_e event);   ///< Pointer to \ref crc_event_cb_t : CRC Event call back.
68 
69 /**
70 \brief CRC Device Driver Capabilities.
71 */
72 typedef struct {
73     uint32_t ROHC               : 1;      ///< supports ROHC mode
74     uint32_t MAXIM              : 1;      ///< supports MAXIM mode
75     uint32_t X25                : 1;      ///< supports X25 mode
76     uint32_t CCITT              : 1;      ///< supports CCITT mode
77     uint32_t CCITT_FALSE        : 1;      ///< supports CCITT-FALSE mode
78     uint32_t USB                : 1;      ///< supports USB mode
79     uint32_t IBM                : 1;      ///< supports IBM mode
80     uint32_t MODBUS             : 1;      ///< supports MODBUS mode
81     uint32_t ITU                : 1;      ///< supports ITU mode
82     uint32_t PMEQ_2             : 1;      ///< supports PMEQ_2 mode
83     uint32_t XMODEM             : 1;      ///< supports XMODEM mode
84     uint32_t DNP                : 1;      ///< supports DNP mode
85     uint32_t NONE               : 1;      ///< supports NONE mode
86 } crc_capabilities_t;
87 
88 // Function documentation
89 
90 /**
91   \brief       Initialize CRC Interface. 1. Initializes the resources needed for the CRC interface 2.registers event callback function
92   \param[in]   idx  device id
93   \param[in]   cb_event event callback function \ref crc_event_cb_t
94   \return      return crc handle if success
95 */
96 crc_handle_t csi_crc_initialize(int32_t idx, crc_event_cb_t cb_event);
97 
98 /**
99   \brief       De-initialize CRC Interface. stops operation and releases the software resources used by the interface
100   \param[in]   handle  crc handle to operate.
101   \return      error code
102 */
103 int32_t csi_crc_uninitialize(crc_handle_t handle);
104 
105 /**
106   \brief       control crc power.
107   \param[in]   handle  crc handle to operate.
108   \param[in]   state   power state.\ref csi_power_stat_e.
109   \return      error code
110 */
111 int32_t csi_crc_power_control(crc_handle_t handle, csi_power_stat_e state);
112 
113 /**
114   \brief       Get driver capabilities.
115   \param[in]   idx  device id
116   \return      \ref crc_capabilities_t
117 */
118 crc_capabilities_t csi_crc_get_capabilities(int32_t idx);
119 
120 /**
121   \brief       config crc mode.
122   \param[in]   handle  crc handle to operate.
123   \param[in]   mode      \ref crc_mode_e
124   \param[in]   standard  \ref crc_standard_crc_e
125   \return      error code
126 */
127 int32_t csi_crc_config(crc_handle_t handle,
128                        crc_mode_e mode,
129                        crc_standard_crc_e standard
130                       );
131 
132 /**
133   \brief       calculate crc. this function will pad zero if input data is not word aligned
134   \param[in]   handle  crc handle to operate.
135   \param[in]   in      Pointer to the input data
136   \param[out]  out     Pointer to the result.
137   \param[in]   len     intput data len.
138   \return      error code
139 */
140 int32_t csi_crc_calculate(crc_handle_t handle, const void *in, void *out, uint32_t len);
141 
142 /**
143   \brief       Get CRC status.
144   \param[in]   handle  crc handle to operate.
145   \return      CRC status \ref crc_status_t
146 */
147 crc_status_t csi_crc_get_status(crc_handle_t handle);
148 
149 
150 #ifdef __cplusplus
151 }
152 #endif
153 
154 #endif /* _CSI_CRC_H_ */
155