SemiDrive SSDK Appication Program Interface PTG3.0
sdrv-cam-os-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 "FreeRTOS.h"
29#include "armv7-r/atomic.h"
30#include "armv7-r/cache.h"
31#include "armv7-r/irq.h"
32#include "config.h"
33#include "event_groups.h"
34#include "i2c_cfg.h"
35#include "irq.h"
36#include "irq_num.h"
37#include "queue.h"
38#include "regs_base.h"
39#include "sdrv_gpio.h"
40#include "sdrv_i2c.h"
41#include "task.h"
42
43// define from cmsis_os2.h
44#define osFlagsWaitAny 0x00000000U
45#define osFlagsWaitAll 0x00000001U
46#define osFlagsNoClear 0x00000002U
47#define MAX_BITS_EVENT_GROUPS 24U
48#define EVENT_FLAGS_INVALID_BITS (~((1UL << MAX_BITS_EVENT_GROUPS) - 1U))
49
50#define csi_err(x...) ssdk_printf(SSDK_ERR, x)
51#define csi_warn(x...) ssdk_printf(SSDK_WARNING, x)
52#define csi_info(x...) ssdk_printf(SSDK_NOTICE, x)
53#define csi_debug(x...) ssdk_printf(SSDK_DEBUG, x)
54
55#define cam_err(x...) ssdk_printf(SSDK_ERR, x)
56#define cam_info(x...) ssdk_printf(SSDK_NOTICE, x)
57#define cam_debug(x...) ssdk_printf(SSDK_DEBUG, x)
58
59#define sensor_err(x...) ssdk_printf(SSDK_ERR, x)
60#define sensor_info(x...) ssdk_printf(SSDK_NOTICE, x)
61#define sensor_debug(x...) ssdk_printf(SSDK_DEBUG, x)
62
63#define deser_crit(x...) ssdk_printf(SSDK_CRIT, x)
64#define deser_err(x...) ssdk_printf(SSDK_ERR, x)
65#define deser_info(x...) ssdk_printf(SSDK_NOTICE, x)
66#define deser_debug(x...) ssdk_printf(SSDK_DEBUG, x)
67
68#define HAL_LOGE(x...) ssdk_printf(SSDK_ERR, x)
69#define HAL_LOGI(x...) ssdk_printf(SSDK_NOTICE, x)
70#define HAL_LOGD(x...) ssdk_printf(SSDK_DEBUG, x)
71
72typedef enum {
73 osOK = 0,
74 osError = -1,
80 osStatusReserved = 0x7FFFFFFF
82
83#ifndef reg_addr_t
84typedef paddr_t reg_addr_t;
85#endif
86
87#ifndef dma_addr_t
88typedef paddr_t dma_addr_t;
89#endif
90
91#define CSI_COMPLETE_EVENT_FLAG 1u
92
93typedef void *osEventFlagsId_t;
94typedef struct {
95 osEventFlagsId_t event;
97
98
99static inline uint32_t reg_read(reg_addr_t base, uint32_t addr)
100{
101 return readl(base + addr);
102}
103
104static inline void reg_write(reg_addr_t base, uint32_t addr, uint32_t val)
105{
106 writel(val, base + addr);
107}
108
109//#define usleep_range(min, max) vTaskDelay(min >> 1)
110static inline void usleep_range(uint32_t min, uint32_t max)
111{
112 max = max / 2 + min / 2;
113 if (max < 1000)
114 max = 1000;
115
116 max /= 1000;
117 vTaskDelay(max);
118}
119
120#define mdelay(ms) vTaskDelay(ms)
121#define udelay(us) vTaskDelay((us + 999) / 1000)
122
123static inline uint32_t IRQ_Context(void)
124{
125 uint32_t irq;
126 BaseType_t state;
127
128 irq = 0U;
129
130 if (arch_in_irq_mode()) {
131 /* Called from interrupt context */
132 irq = 1U;
133 } else {
134 /* Get FreeRTOS scheduler state */
135 state = xTaskGetSchedulerState();
136
137 if (state != taskSCHEDULER_NOT_STARTED) {
138 /* Scheduler was started */
139 if (arch_irq_is_masked()) {
140 /* Interrupts are masked */
141 irq = 1U;
142 }
143 }
144 }
145 /* Return context, 0: thread context, 1: IRQ context */
146 return (irq);
147}
148
149inline static void completion_init(completion_t *com)
150{
151 // com->event = osEventFlagsNew(NULL);
152 EventGroupHandle_t hEventGroup;
153
154 hEventGroup = NULL;
155 if (IRQ_Context() == 0U) { // thread context
156#if (configSUPPORT_DYNAMIC_ALLOCATION == 1)
157 hEventGroup = xEventGroupCreate();
158#endif
159 }
160 /* Return event flags ID */
161 com->event = ((osEventFlagsId_t)hEventGroup);
162}
163
164inline static void completion_destroy(completion_t *com)
165{
166// osEventFlagsDelete(com->event);
167#ifndef USE_FreeRTOS_HEAP_1
168 if (IRQ_Context() == 0U && com->event != NULL) {
169 vEventGroupDelete(com->event);
170 }
171 return;
172#else
173 return;
174#endif
175}
176
177inline static int wait_completion_timeout(completion_t *com, uint32_t timeout)
178{
179 // ret = osEventFlagsWait(com->event, CSI_COMPLETE_EVENT_FLAG,
180 // osFlagsWaitAny, timeout);
181
182 uint32_t flags = CSI_COMPLETE_EVENT_FLAG;
183 EventGroupHandle_t hEventGroup = (EventGroupHandle_t)com->event;
184 BaseType_t wait_all;
185 BaseType_t exit_clr;
186 uint32_t rflags;
187
188 if ((hEventGroup == NULL) || ((flags & EVENT_FLAGS_INVALID_BITS) != 0U)) {
189 rflags = (uint32_t)osErrorParameter;
190 } else if (IRQ_Context() != 0U) {
191 rflags = (uint32_t)osErrorISR;
192 } else {
193 wait_all = pdFAIL;
194 exit_clr = pdTRUE;
195
196 rflags = xEventGroupWaitBits(hEventGroup, (EventBits_t)flags, exit_clr,
197 wait_all, (TickType_t)timeout);
198 if ((flags & rflags) == 0U) {
199 if (timeout > 0U) {
200 rflags = (uint32_t)osErrorTimeout;
201 } else {
202 rflags = (uint32_t)osErrorResource;
203 }
204 }
205 }
206
207 return (int)rflags;
208}
209
210inline static void completion_done(completion_t *com)
211{
212 // osEventFlagsSet(com->event, CSI_COMPLETE_EVENT_FLAG);
213 EventGroupHandle_t hEventGroup = (EventGroupHandle_t)com->event;
214 BaseType_t yield;
215
216 if ((hEventGroup == NULL) ||
218 ; // rflags = (uint32_t)osErrorParameter;
219 } else if (IRQ_Context() != 0U) {
220#if (configUSE_OS2_EVENTFLAGS_FROM_ISR == 0)
221 (void)yield;
222 /* Enable timers and xTimerPendFunctionCall function to support
223 * osEventFlagsSet from ISR */
224 // rflags = (uint32_t)osErrorResource;
225#else
226 yield = pdFALSE;
227
228 if (xEventGroupSetBitsFromISR(hEventGroup,
229 (EventBits_t)CSI_COMPLETE_EVENT_FLAG,
230 &yield) == pdFAIL) {
231 ; // rflags = (uint32_t)osErrorResource;
232 } else {
233 // rflags = CSI_COMPLETE_EVENT_FLAG;
234 portYIELD_FROM_ISR(yield);
235 }
236#endif
237 } else {
238 xEventGroupSetBits(hEventGroup, (EventBits_t)CSI_COMPLETE_EVENT_FLAG);
239 }
240 /* Return event flags after setting */
241 // return (rflags);
242}
243
244// single R5, no need spin lock
245typedef void *spinlock_t;
246#define spin_lock_init(a) (*a = NULL)
247
248#define spin_lock_irqsave(spinlock, flags) \
249 do { \
250 irq_state_t state = arch_irq_save(); \
251 flags = state; \
252 } while (0)
253
254#define spin_unlock_irqrestore(spinlock, flags) \
255 do { \
256 irq_state_t state = (irq_state_t)flags; \
257 arch_irq_restore(state); \
258 } while (0)
259
260// gpio_set: set output, and set level to gpio
261static inline void gpio_set(void *dev, unsigned int pin, bool level)
262{
263 (void)dev;
266}
267
268// I2C interface:
269static inline void wait_idle_and_set_busy(void *ctrl)
270{
271 sdrv_i2cdrv_bus_stat_t bus_stat;
272 int i = 10;
273
274 bus_stat = sdrv_i2c_get_bus_stat(ctrl);
275 while (bus_stat == SDRV_I2CDRV_BUS_BUSY && i-- > 0) {
276 vTaskDelay(2);
277 bus_stat = sdrv_i2c_get_bus_stat(ctrl);
278 }
279
281}
282
283inline static int i2c_write(void *adap, uint8_t addr, uint8_t *buf, int count)
284{
285 int ret;
286
288 sdrv_i2c_write(adap, addr, buf, count, 1000, true);
289 ret = sdrv_i2c_get_trans_stat(adap);
291
292 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
293}
294
295inline static int i2c_read(void *adap, uint8_t addr, uint8_t *buf, int count)
296{
297 int ret;
298
300 sdrv_i2c_read(adap, addr, buf, count, 1000, true);
301 ret = sdrv_i2c_get_trans_stat(adap);
303
304 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
305}
306
307inline static int i2c_write_read(void *adap, uint8_t addr, uint8_t *reg,
308 int regc, uint8_t *buf, int bufc)
309{
310 int ret;
311
313 sdrv_i2c_write(adap, addr, reg, regc, 1000, true);
314
315 ret = sdrv_i2c_get_trans_stat(adap);
316 if (ret == SDRV_I2CDRV_TRANS_OK) {
317 sdrv_i2c_read(adap, addr, buf, bufc, 1000, true);
318 ret = sdrv_i2c_get_trans_stat(adap);
319 }
320
322
323 return (ret == SDRV_I2CDRV_TRANS_OK) ? 0 : -1;
324}
325
326// mutext
327typedef QueueHandle_t osMutexId_t;
328static inline osMutexId_t osMutexNew(void *p)
329{
330 (void)p;
331 return xQueueCreateMutex(queueQUEUE_TYPE_MUTEX);
332}
333
334static inline void osMutexDelete(void *p)
335{
336 if (p)
337 vQueueDelete(p);
338}
339
340static inline void osMutexAcquire(void *p, int t)
341{
342 (void)p;
343 (void)t;
344 xQueueTakeMutexRecursive(p, t);
345}
346
347static inline void osMutexRelease(void *p)
348{
349 (void)p;
350 xQueueGiveMutexRecursive(p);
351}
352
353#endif /* __SDRV_CAM_OS_DEF_H__ */
Interrupt interface hearder file.
void * osMutexId_t
Definition: sdrv-cam-baremetal-def.h:250
paddr_t reg_addr_t
Definition: sdrv-cam-baremetal-def.h:78
uint32_t osEventFlagsId_t
Definition: sdrv-cam-baremetal-def.h:87
static osMutexId_t osMutexNew(void *p)
Definition: sdrv-cam-os-def.h:328
static void gpio_set(void *dev, unsigned int pin, bool level)
Definition: sdrv-cam-os-def.h:261
static void usleep_range(uint32_t min, uint32_t max)
Definition: sdrv-cam-os-def.h:110
static uint32_t reg_read(reg_addr_t base, uint32_t addr)
Definition: sdrv-cam-os-def.h:99
static int wait_completion_timeout(completion_t *com, uint32_t timeout)
Definition: sdrv-cam-os-def.h:177
static void wait_idle_and_set_busy(void *ctrl)
Definition: sdrv-cam-os-def.h:269
#define EVENT_FLAGS_INVALID_BITS
Definition: sdrv-cam-os-def.h:48
static void completion_init(completion_t *com)
Definition: sdrv-cam-os-def.h:149
static uint32_t IRQ_Context(void)
Definition: sdrv-cam-os-def.h:123
static void osMutexRelease(void *p)
Definition: sdrv-cam-os-def.h:347
void * spinlock_t
Definition: sdrv-cam-os-def.h:245
static void completion_destroy(completion_t *com)
Definition: sdrv-cam-os-def.h:164
osStatus_t
Definition: sdrv-cam-os-def.h:72
@ osErrorISR
Not allowed in ISR context: the function cannot be called from interrupt service routines.
Definition: sdrv-cam-os-def.h:79
@ osStatusReserved
Prevents enum down-size compiler optimization.
Definition: sdrv-cam-os-def.h:80
@ osErrorResource
Resource not available.
Definition: sdrv-cam-os-def.h:76
@ osErrorTimeout
Operation not completed within the timeout period.
Definition: sdrv-cam-os-def.h:75
@ osOK
Operation completed successfully.
Definition: sdrv-cam-os-def.h:73
@ osError
Unspecified RTOS error: run-time error but no other error message fits.
Definition: sdrv-cam-os-def.h:74
@ osErrorParameter
Parameter error.
Definition: sdrv-cam-os-def.h:77
@ osErrorNoMemory
System is out of memory: it was impossible to allocate or reserve memory for the operation.
Definition: sdrv-cam-os-def.h:78
static int i2c_read(void *adap, uint8_t addr, uint8_t *buf, int count)
Definition: sdrv-cam-os-def.h:295
static void osMutexDelete(void *p)
Definition: sdrv-cam-os-def.h:334
static int i2c_write(void *adap, uint8_t addr, uint8_t *buf, int count)
Definition: sdrv-cam-os-def.h:283
static void reg_write(reg_addr_t base, uint32_t addr, uint32_t val)
Definition: sdrv-cam-os-def.h:104
QueueHandle_t osMutexId_t
Definition: sdrv-cam-os-def.h:327
static void completion_done(completion_t *com)
Definition: sdrv-cam-os-def.h:210
static int i2c_write_read(void *adap, uint8_t addr, uint8_t *reg, int regc, uint8_t *buf, int bufc)
Definition: sdrv-cam-os-def.h:307
paddr_t reg_addr_t
Definition: sdrv-cam-os-def.h:84
void * osEventFlagsId_t
Definition: sdrv-cam-os-def.h:93
static void osMutexAcquire(void *p, int t)
Definition: sdrv-cam-os-def.h:340
#define CSI_COMPLETE_EVENT_FLAG
Definition: sdrv-cam-os-def.h:91
paddr_t dma_addr_t
Definition: sdrv-cam-os-def.h:88
#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