SemiDrive SSDK Appication Program Interface PTG3.0
sdrv-cam-baremetal-def.h
Go to the documentation of this file.
1
11#ifndef __SDRV_CAM_OS_DEF_H__
12#define __SDRV_CAM_OS_DEF_H__
13
14#include <assert.h>
15#include <bits.h>
16#include <board.h>
17#include <debug.h>
18#include <errno.h>
19#include <lib/list.h>
20#include <reg.h>
21#include <stddef.h>
22#include <stdint.h>
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26#include <types.h>
27
28#include "armv7-r/atomic.h"
29#include "armv7-r/cache.h"
30#include "armv7-r/irq.h"
31#include "config.h"
32#include "i2c_cfg.h"
33#include "irq.h"
34#include "irq_num.h"
35#include "regs_base.h"
36#include "sdrv_gpio.h"
37#include "sdrv_i2c.h"
38#include "udelay/udelay.h"
39
40// don't use malloc, free
41#define malloc(a) _DO_NOT_USE_MALLOC_IN_BAREMETAL_
42#define free(a)
43// please use ssdk_printf, don't use printf
44#define csi_err(x...) ssdk_printf(SSDK_ERR, x)
45#define csi_warn(x...) ssdk_printf(SSDK_WARNING, x)
46#define csi_info(x...) ssdk_printf(SSDK_NOTICE, x)
47#define csi_debug(x...) ssdk_printf(SSDK_DEBUG, x)
48
49#define cam_err(x...) ssdk_printf(SSDK_ERR, x)
50#define cam_info(x...) ssdk_printf(SSDK_NOTICE, x)
51#define cam_debug(x...) ssdk_printf(SSDK_DEBUG, x)
52
53#define sensor_err(x...) ssdk_printf(SSDK_ERR, x)
54#define sensor_info(x...) ssdk_printf(SSDK_NOTICE, x)
55#define sensor_debug(x...) ssdk_printf(SSDK_DEBUG, x)
56
57#define deser_crit(x...) ssdk_printf(SSDK_CRIT, x)
58#define deser_err(x...) ssdk_printf(SSDK_ERR, x)
59#define deser_info(x...) ssdk_printf(SSDK_NOTICE, x)
60#define deser_debug(x...) ssdk_printf(SSDK_DEBUG, x)
61
62#define HAL_LOGE(x...) ssdk_printf(SSDK_ERR, x)
63#define HAL_LOGI(x...) ssdk_printf(SSDK_NOTICE, x)
64#define HAL_LOGD(x...) ssdk_printf(SSDK_DEBUG, x)
65
66typedef enum {
67 osOK = 0,
68 osError = -1,
74 osStatusReserved = 0x7FFFFFFF
76
77#ifndef reg_addr_t
78typedef paddr_t reg_addr_t;
79#endif
80
81#ifndef dma_addr_t
82typedef paddr_t dma_addr_t;
83#endif
84
85#define CSI_COMPLETE_EVENT_FLAG 1u
86
87typedef uint32_t osEventFlagsId_t;
88typedef struct {
91
92static inline uint32_t reg_read(reg_addr_t base, uint32_t addr)
93{
94 return readl(base + addr);
95}
96
97static inline void reg_write(reg_addr_t base, uint32_t addr, uint32_t val)
98{
99 writel(val, base + addr);
100}
101
102static inline void mdelay(uint32_t ms)
103{
104 while (ms) {
105 if (ms < MAX_UDELAY / 1000) {
106 udelay(ms * 1000);
107 ms = 0;
108 } else {
109 udelay(MAX_UDELAY);
110 ms -= (MAX_UDELAY / 1000);
111 }
112 }
113}
114
115//#define usleep_range(min, max) vTaskDelay(min >> 1)
116static inline void usleep_range(uint32_t min, uint32_t max)
117{
118 max = max / 2 + min / 2;
119 while (max) {
120 if (max < MAX_UDELAY) {
121 udelay(max);
122 max = 0;
123 } else {
124 udelay(MAX_UDELAY);
125 max -= MAX_UDELAY;
126 }
127 }
128}
129
130inline static void completion_init(completion_t *com)
131{
132 com->event = 0;
133}
134
135inline static void completion_destroy(completion_t *com)
136{
137 com->event = 0;
138}
139
140inline static int wait_completion_timeout(completion_t *com, uint32_t timeout)
141{
142 if (com == NULL)
143 return osErrorParameter;
144 while (timeout) {
145 if (com->event & CSI_COMPLETE_EVENT_FLAG) {
146 com->event &= (~CSI_COMPLETE_EVENT_FLAG);
148 }
149 //TODO-DELAY
150 udelay(1000);
151 timeout--;
152 }
153 return osErrorTimeout;
154}
155
156inline static void completion_done(completion_t *com)
157{
158 irq_state_t state;
159
160 if (com == NULL)
161 return ;
162 state = arch_irq_save();
164 arch_irq_restore(state);
165}
166
167// single R5, no need spin lock
168typedef void *spinlock_t;
169#define spin_lock_init(a) (*a = NULL)
170
171#define spin_lock_irqsave(spinlock, flags) \
172 do { \
173 irq_state_t state = arch_irq_save(); \
174 flags = state; \
175 } while (0)
176
177#define spin_unlock_irqrestore(spinlock, flags) \
178 do { \
179 irq_state_t state = (irq_state_t)flags; \
180 arch_irq_restore(state); \
181 } while (0)
182
183// gpio_set: set output, and set level to gpio
184static inline void gpio_set(void *dev, unsigned int pin, bool level)
185{
186 (void)dev;
189}
190
191// I2C interface:
192static inline void wait_idle_and_set_busy(void *ctrl)
193{
194 sdrv_i2cdrv_bus_stat_t bus_stat;
195 int i = 10;
196
197 bus_stat = sdrv_i2c_get_bus_stat(ctrl);
198 while (bus_stat == SDRV_I2CDRV_BUS_BUSY && i-- > 0) {
199 mdelay(2);
200 bus_stat = sdrv_i2c_get_bus_stat(ctrl);
201 }
202
204}
205
206inline static int i2c_write(void *adap, uint8_t addr, uint8_t *buf, int count)
207{
208 int ret;
209
211 sdrv_i2c_write(adap, addr, buf, count, 1000, true);
212 ret = sdrv_i2c_get_trans_stat(adap);
214
215 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
216}
217
218inline static int i2c_read(void *adap, uint8_t addr, uint8_t *buf, int count)
219{
220 int ret;
221
223 sdrv_i2c_read(adap, addr, buf, count, 1000, true);
224 ret = sdrv_i2c_get_trans_stat(adap);
226
227 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
228}
229
230inline static int i2c_write_read(void *adap, uint8_t addr, uint8_t *reg,
231 int regc, uint8_t *buf, int bufc)
232{
233 int ret;
234
236 sdrv_i2c_write(adap, addr, reg, regc, 1000, true);
237
238 ret = sdrv_i2c_get_trans_stat(adap);
239 if (ret == SDRV_I2CDRV_TRANS_OK) {
240 sdrv_i2c_read(adap, addr, buf, bufc, 1000, true);
241 ret = sdrv_i2c_get_trans_stat(adap);
242 }
243
245
246 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
247}
248
249// mutext
250typedef void *osMutexId_t;
251static inline osMutexId_t osMutexNew(void *p)
252{
253 (void)p;
254 return NULL;
255}
256
257static inline void osMutexDelete(void *p)
258{
259 (void)p;
260}
261
262static inline void osMutexAcquire(void *p, int t)
263{
264 (void)p;
265 (void)t;
266}
267
268static inline void osMutexRelease(void *p)
269{
270 (void)p;
271}
272
273#endif /* __SDRV_CAM_OS_DEF_H__ */
Interrupt interface hearder file.
static osMutexId_t osMutexNew(void *p)
Definition: sdrv-cam-baremetal-def.h:251
static void gpio_set(void *dev, unsigned int pin, bool level)
Definition: sdrv-cam-baremetal-def.h:184
static void usleep_range(uint32_t min, uint32_t max)
Definition: sdrv-cam-baremetal-def.h:116
static uint32_t reg_read(reg_addr_t base, uint32_t addr)
Definition: sdrv-cam-baremetal-def.h:92
static int wait_completion_timeout(completion_t *com, uint32_t timeout)
Definition: sdrv-cam-baremetal-def.h:140
static void wait_idle_and_set_busy(void *ctrl)
Definition: sdrv-cam-baremetal-def.h:192
void * osMutexId_t
Definition: sdrv-cam-baremetal-def.h:250
static void completion_init(completion_t *com)
Definition: sdrv-cam-baremetal-def.h:130
static void osMutexRelease(void *p)
Definition: sdrv-cam-baremetal-def.h:268
void * spinlock_t
Definition: sdrv-cam-baremetal-def.h:168
static void completion_destroy(completion_t *com)
Definition: sdrv-cam-baremetal-def.h:135
osStatus_t
Definition: sdrv-cam-baremetal-def.h:66
@ osErrorISR
Not allowed in ISR context: the function cannot be called from interrupt service routines.
Definition: sdrv-cam-baremetal-def.h:73
@ osStatusReserved
Prevents enum down-size compiler optimization.
Definition: sdrv-cam-baremetal-def.h:74
@ osErrorResource
Resource not available.
Definition: sdrv-cam-baremetal-def.h:70
@ osErrorTimeout
Operation not completed within the timeout period.
Definition: sdrv-cam-baremetal-def.h:69
@ osOK
Operation completed successfully.
Definition: sdrv-cam-baremetal-def.h:67
@ osError
Unspecified RTOS error: run-time error but no other error message fits.
Definition: sdrv-cam-baremetal-def.h:68
@ osErrorParameter
Parameter error.
Definition: sdrv-cam-baremetal-def.h:71
@ osErrorNoMemory
System is out of memory: it was impossible to allocate or reserve memory for the operation.
Definition: sdrv-cam-baremetal-def.h:72
static int i2c_read(void *adap, uint8_t addr, uint8_t *buf, int count)
Definition: sdrv-cam-baremetal-def.h:218
static void osMutexDelete(void *p)
Definition: sdrv-cam-baremetal-def.h:257
static void mdelay(uint32_t ms)
Definition: sdrv-cam-baremetal-def.h:102
static int i2c_write(void *adap, uint8_t addr, uint8_t *buf, int count)
Definition: sdrv-cam-baremetal-def.h:206
static void reg_write(reg_addr_t base, uint32_t addr, uint32_t val)
Definition: sdrv-cam-baremetal-def.h:97
static void completion_done(completion_t *com)
Definition: sdrv-cam-baremetal-def.h:156
static int i2c_write_read(void *adap, uint8_t addr, uint8_t *reg, int regc, uint8_t *buf, int bufc)
Definition: sdrv-cam-baremetal-def.h:230
paddr_t reg_addr_t
Definition: sdrv-cam-baremetal-def.h:78
uint32_t osEventFlagsId_t
Definition: sdrv-cam-baremetal-def.h:87
static void osMutexAcquire(void *p, int t)
Definition: sdrv-cam-baremetal-def.h:262
#define CSI_COMPLETE_EVENT_FLAG
Definition: sdrv-cam-baremetal-def.h:85
paddr_t dma_addr_t
Definition: sdrv-cam-baremetal-def.h:82
#define udelay(us)
Definition: sdrv-cam-os-def.h:121
#define NULL
Definition: sdrv_crypto_utility.h:21
SemiDrive GPIO driver header file.
status_t sdrv_gpio_set_pin_direction(uint32_t pin_index, gpio_direction_e dir)
Config gpio direction.
status_t sdrv_gpio_set_pin_output_level(uint32_t pin_index, bool level)
Config gpio output level.
@ GPIO_DIR_OUT
Definition: sdrv_gpio.h:32
SemiDrive I2C driver header file.
@ SDRV_I2CDRV_TRANS_OK
Definition: sdrv_i2c.h:21
status_t sdrv_i2c_read(sdrv_i2c_t *ctrl, uint16_t addr, uint8_t *rbuf, uint16_t rlen, uint32_t timeout, bool need_stop)
Read data from slave device use poll blocking format.
status_t sdrv_i2c_get_trans_stat(sdrv_i2c_t *ctrl)
Get transfer stat(only applicable for master).
sdrv_i2cdrv_bus_stat_t sdrv_i2c_get_bus_stat(sdrv_i2c_t *ctrl)
Get bus stat(only applicable for master). @this api will abandon,please use sdrv_i2c_lock_bus/sdrv_i2...
status_t sdrv_i2c_write(sdrv_i2c_t *ctrl, uint16_t addr, uint8_t *wbuf, uint16_t wlen, uint32_t timeout, bool need_stop)
Write data to slave device use poll blocking format.
sdrv_i2cdrv_bus_stat_t
i2c bus stat(only applicable for master mode)
Definition: sdrv_i2c.h:60
@ SDRV_I2CDRV_BUS_BUSY
Definition: sdrv_i2c.h:62
@ SDRV_I2CDRV_BUS_IDLE
Definition: sdrv_i2c.h:61
status_t sdrv_i2c_set_bus_stat(sdrv_i2c_t *ctrl, sdrv_i2cdrv_bus_stat_t bus_stat)
Set bus stat(only applicable for master). @this api will abandon,please use sdrv_i2c_lock_bus/sdrv_i2...
Definition: sdrv-cam-baremetal-def.h:88
osEventFlagsId_t event
Definition: sdrv-cam-baremetal-def.h:89