437 lines
11 KiB
C
437 lines
11 KiB
C
/* Copyright 2018 Canaan Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
#ifndef _FREERTOS_DRIVER_H
|
|
#define _FREERTOS_DRIVER_H
|
|
|
|
#include <FreeRTOS.h>
|
|
#include <semphr.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
typedef struct tag_driver_base
|
|
{
|
|
void* userdata;
|
|
void (*install)(void* userdata);
|
|
int (*open)(void* userdata);
|
|
void (*close)(void* userdata);
|
|
} driver_base_t;
|
|
|
|
typedef enum
|
|
{
|
|
DRIVER_UART,
|
|
DRIVER_GPIO,
|
|
DRIVER_I2C,
|
|
DRIVER_I2C_DEVICE,
|
|
DRIVER_I2S,
|
|
DRIVER_SPI,
|
|
DRIVER_SPI_DEVICE,
|
|
DRIVER_DVP,
|
|
DRIVER_SCCB,
|
|
DRIVER_SCCB_DEVICE,
|
|
DRIVER_FFT,
|
|
DRIVER_AES,
|
|
DRIVER_SHA256,
|
|
DRIVER_TIMER,
|
|
DRIVER_PWM,
|
|
DRIVER_RTC,
|
|
DRIVER_PIC,
|
|
DRIVER_DMAC,
|
|
DRIVER_DMA,
|
|
DRIVER_CUSTOM
|
|
} driver_type;
|
|
|
|
typedef struct tag_driver_registry
|
|
{
|
|
const char* name;
|
|
const void* driver;
|
|
driver_type type;
|
|
} driver_registry_t;
|
|
|
|
typedef enum
|
|
{
|
|
UART_STOP_1,
|
|
UART_STOP_1_5,
|
|
UART_STOP_2
|
|
} uart_stopbit;
|
|
|
|
typedef enum
|
|
{
|
|
UART_PARITY_NONE,
|
|
UART_PARITY_ODD,
|
|
UART_PARITY_EVEN
|
|
} uart_parity;
|
|
|
|
typedef struct tag_uart_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*config)(size_t baud_rate, size_t data_width, uart_stopbit stopbit, uart_parity parity, void* userdata);
|
|
int (*read)(char* buffer, size_t len, void* userdata);
|
|
int (*write)(const char* buffer, size_t len, void* userdata);
|
|
} uart_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
GPIO_DM_INPUT,
|
|
GPIO_DM_INPUT_PULL_DOWN,
|
|
GPIO_DM_INPUT_PULL_UP,
|
|
GPIO_DM_OUTPUT,
|
|
GPIO_DM_OUTPUT_OPEN_DRAIN,
|
|
GPIO_DM_OUTPUT_OPEN_DRAIN_PULL_UP,
|
|
GPIO_DM_OUTPUT_OPEN_SOURCE,
|
|
GPIO_DM_OUTPUT_OPEN_SOURCE_PULL_DOWN
|
|
} gpio_drive_mode;
|
|
|
|
typedef enum
|
|
{
|
|
GPIO_PE_NONE,
|
|
GPIO_PE_FALLING,
|
|
GPIO_PE_RISING,
|
|
GPIO_PE_BOTH
|
|
} gpio_pin_edge;
|
|
|
|
typedef enum
|
|
{
|
|
GPIO_PV_LOW,
|
|
GPIO_PV_HIGH
|
|
} gpio_pin_value;
|
|
|
|
typedef void (*gpio_onchanged)(size_t pin, void* userdata);
|
|
|
|
typedef struct tag_gpio_driver
|
|
{
|
|
driver_base_t base;
|
|
size_t pin_count;
|
|
void (*set_drive_mode)(void* userdata, size_t pin, gpio_drive_mode mode);
|
|
void (*set_pin_edge)(void* userdata, size_t pin, gpio_pin_edge edge);
|
|
void (*set_onchanged)(void* userdata, size_t pin, gpio_onchanged callback, void* callback_data);
|
|
void (*set_pin_value)(void* userdata, size_t pin, gpio_pin_value value);
|
|
gpio_pin_value (*get_pin_value)(void* userdata, size_t pin);
|
|
} gpio_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
I2C_BS_STANDARD,
|
|
I2C_BS_FAST,
|
|
I2C_BS_HIGH_SPEED
|
|
} i2c_bus_speed_mode;
|
|
|
|
typedef struct tag_i2c_device_driver
|
|
{
|
|
driver_base_t base;
|
|
int (*read)(char* buffer, size_t len, void* userdata);
|
|
int (*write)(const char* buffer, size_t len, void* userdata);
|
|
int (*transfer_sequential)(const char* write_buffer, size_t write_len, char* read_buffer, size_t read_len, void* userdata);
|
|
} i2c_device_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
I2C_EV_START,
|
|
I2C_EV_RESTART,
|
|
I2C_EV_STOP
|
|
} i2c_event;
|
|
|
|
typedef struct
|
|
{
|
|
void (*on_receive)(uint32_t data);
|
|
uint32_t (*on_transmit)();
|
|
void (*on_event)(i2c_event event);
|
|
} i2c_slave_handler;
|
|
|
|
typedef struct tag_i2c_driver
|
|
{
|
|
driver_base_t base;
|
|
i2c_device_driver_t* (*get_device)(size_t slave_address, size_t address_width, i2c_bus_speed_mode bus_speed_mode, void* userdata);
|
|
void (*config_as_slave)(size_t slave_address, size_t address_width, i2c_bus_speed_mode bus_speed_mode, i2c_slave_handler* handler, void* userdata);
|
|
} i2c_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
I2S_AM_STANDARD,
|
|
I2S_AM_RIGHT,
|
|
I2S_AM_LEFT
|
|
} i2s_align_mode;
|
|
|
|
typedef enum
|
|
{
|
|
AUDIO_FMT_PCM
|
|
} audio_format_type;
|
|
|
|
typedef struct tag_audio_format
|
|
{
|
|
audio_format_type type;
|
|
size_t bits_per_sample;
|
|
size_t sample_rate;
|
|
size_t channels;
|
|
} audio_format_t;
|
|
|
|
typedef struct tag_i2s_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*config_as_render)(const audio_format_t* format, size_t delay_ms, i2s_align_mode align_mode, size_t channels_mask, void* userdata);
|
|
void (*config_as_capture)(const audio_format_t* format, size_t delay_ms, i2s_align_mode align_mode, size_t channels_mask, void* userdata);
|
|
void (*get_buffer)(char** buffer, size_t* frames, void* userdata);
|
|
void (*release_buffer)(size_t frames, void* userdata);
|
|
void (*start)(void* userdata);
|
|
void (*stop)(void* userdata);
|
|
} i2s_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
SPI_Mode_0,
|
|
SPI_Mode_1,
|
|
SPI_Mode_2,
|
|
SPI_Mode_3,
|
|
} spi_mode;
|
|
|
|
typedef enum
|
|
{
|
|
SPI_FF_STANDARD,
|
|
SPI_FF_DUAL,
|
|
SPI_FF_QUAD,
|
|
SPI_FF_OCTAL
|
|
} spi_frame_format;
|
|
|
|
typedef enum
|
|
{
|
|
SPI_AITM_STANDARD,
|
|
SPI_AITM_ADDR_STANDARD,
|
|
SPI_AITM_AS_FRAME_FORMAT
|
|
} spi_addr_inst_trans_mode;
|
|
|
|
typedef struct tag_spi_device_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*config)(size_t instruction_length, size_t address_length, size_t wait_cycles, spi_addr_inst_trans_mode trans_mode, void* userdata);
|
|
double (*set_speed)(double speed, void* userdata);
|
|
int (*read)(char* buffer, size_t len, void* userdata);
|
|
int (*write)(const char* buffer, size_t len, void* userdata);
|
|
int (*transfer_full_duplex)(const char* write_buffer, size_t write_len, char* read_buffer, size_t read_len, void* userdata);
|
|
int (*transfer_sequential)(const char* write_buffer, size_t write_len, char* read_buffer, size_t read_len, void* userdata);
|
|
void (*fill)(size_t instruction, size_t address, uint32_t value, size_t count, void* userdata);
|
|
} spi_device_driver_t;
|
|
|
|
typedef struct tag_spi_driver
|
|
{
|
|
driver_base_t base;
|
|
spi_device_driver_t* (*get_device)(spi_mode mode, spi_frame_format frame_format, size_t chip_select_line, size_t data_bit_length, void* userdata);
|
|
} spi_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
VIDEO_FMT_RGB565,
|
|
VIDEO_FMT_RGB24Planar
|
|
} video_format;
|
|
|
|
typedef struct tag_sccb_device_driver
|
|
{
|
|
driver_base_t base;
|
|
uint8_t (*read_byte)(uint16_t reg_address, void* userdata);
|
|
void (*write_byte)(uint16_t reg_address, uint8_t value, void* userdata);
|
|
} sccb_device_driver_t;
|
|
|
|
typedef struct tag_sccb_driver
|
|
{
|
|
driver_base_t base;
|
|
sccb_device_driver_t* (*get_device)(size_t slave_address, size_t address_width, void* userdata);
|
|
} sccb_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
VIDEO_FE_BEGIN,
|
|
VIDEO_FE_END
|
|
} video_frame_event;
|
|
|
|
typedef enum
|
|
{
|
|
DVP_SIG_POWER_DOWN,
|
|
DVP_SIG_RESET
|
|
} dvp_signal_type;
|
|
|
|
typedef void (*dvp_on_frame_event)(video_frame_event event, void* userdata);
|
|
|
|
typedef struct tag_dvp_driver
|
|
{
|
|
driver_base_t base;
|
|
size_t output_num;
|
|
void (*config)(size_t width, size_t height, int auto_enable, void* userdata);
|
|
void (*enable_frame)(void* userdata);
|
|
void (*set_signal)(dvp_signal_type type, int value, void* userdata);
|
|
void (*set_output_enable)(size_t index, int enable, void* userdata);
|
|
void (*set_output_attributes)(size_t index, video_format format, void* output_buffer, void* userdata);
|
|
void (*set_frame_event_enable)(video_frame_event event, int enable, void* userdata);
|
|
void (*set_on_frame_event)(dvp_on_frame_event callback, void* callback_data, void* userdata);
|
|
} dvp_driver_t;
|
|
|
|
typedef struct
|
|
{
|
|
int16_t I1;
|
|
int16_t R1;
|
|
int16_t I2;
|
|
int16_t R2;
|
|
} fft_data;
|
|
|
|
typedef enum
|
|
{
|
|
FFT_512,
|
|
FFT_256,
|
|
FFT_128,
|
|
FFT_64
|
|
} fft_point;
|
|
|
|
typedef enum
|
|
{
|
|
FFT_DIR_BACKWARD,
|
|
FFT_DIR_FORWARD
|
|
} fft_direction;
|
|
|
|
typedef struct tag_fft_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*complex_uint16)(fft_point point, fft_direction direction, uint32_t shifts_mask, const uint16_t* input, uint16_t* output, void* userdata);
|
|
} fft_driver_t;
|
|
|
|
typedef enum
|
|
{
|
|
AES_CIPHER_ECB = 0,
|
|
AES_CIPHER_CBC = 1,
|
|
AES_CIPHER_GCM = 2
|
|
} aes_cipher_mod;
|
|
|
|
typedef enum
|
|
{
|
|
AES_128 = 16,
|
|
AES_192 = 24,
|
|
AES_256 = 32,
|
|
} aes_kmode;
|
|
|
|
typedef enum
|
|
{
|
|
AES_MODE_ENCRYPTION = 0,
|
|
AES_MODE_DECRYPTION = 1,
|
|
} aes_encrypt_sel;
|
|
|
|
typedef struct tag_aes_parameter
|
|
{
|
|
uint8_t* aes_in_data;
|
|
uint8_t* key_addr;
|
|
uint8_t key_length;
|
|
uint8_t* gcm_iv;
|
|
uint8_t iv_length;
|
|
uint8_t* aes_aad;
|
|
uint32_t add_size;
|
|
aes_cipher_mod cipher_mod;
|
|
uint32_t data_size;
|
|
uint8_t* aes_out_data;
|
|
uint8_t* tag;
|
|
} aes_parameter;
|
|
|
|
typedef struct tag_aes_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*decrypt)(aes_parameter* aes_param, void* userdata);
|
|
void (*encrypt)(aes_parameter* aes_param, void* userdata);
|
|
} aes_driver_t;
|
|
|
|
typedef struct tag_sha256_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*sha_str)(const char* str, size_t length, uint8_t* hash, void* userdata);
|
|
} sha256_driver_t;
|
|
|
|
typedef void (*timer_ontick)(void* userdata);
|
|
|
|
typedef struct tag_timer_driver
|
|
{
|
|
driver_base_t base;
|
|
size_t (*set_interval)(size_t nanoseconds, void* userdata);
|
|
void (*set_ontick)(timer_ontick ontick, void* ontick_data, void* userdata);
|
|
void (*set_enable)(int enable, void* userdata);
|
|
} timer_driver_t;
|
|
|
|
typedef struct tag_pwm_driver
|
|
{
|
|
driver_base_t base;
|
|
size_t pin_count;
|
|
double (*set_frequency)(double frequency, void* userdata);
|
|
double (*set_active_duty_cycle_percentage)(size_t pin, double duty_cycle_percentage, void* userdata);
|
|
void (*set_enable)(size_t pin, int enable, void* userdata);
|
|
} pwm_driver_t;
|
|
|
|
typedef struct tag_datetime
|
|
{
|
|
uint32_t year;
|
|
uint32_t month;
|
|
uint32_t day;
|
|
uint32_t hour;
|
|
uint32_t minute;
|
|
uint32_t second;
|
|
} datetime_t;
|
|
|
|
typedef struct tag_rtc_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*get_datetime)(datetime_t* datetime, void* userdata);
|
|
void (*set_datetime)(const datetime_t* datetime, void* userdata);
|
|
} rtc_driver_t;
|
|
|
|
typedef struct tag_custom_driver
|
|
{
|
|
driver_base_t base;
|
|
int (*io_control)(size_t control_code, const char* write_buffer, size_t write_len, char* read_buffer, size_t read_len, void* userdata);
|
|
} custom_driver_t;
|
|
|
|
/* ===== internal drivers ======*/
|
|
|
|
typedef void (*pic_irq_handler)(void* userdata);
|
|
void kernel_iface_pic_on_irq(size_t irq);
|
|
|
|
typedef struct tag_pic_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*set_irq_enable)(size_t irq, int enable, void* userdata);
|
|
void (*set_irq_priority)(size_t irq, size_t priority, void* userdata);
|
|
} pic_driver_t;
|
|
|
|
typedef struct tag_dmac_driver
|
|
{
|
|
driver_base_t base;
|
|
} dmac_driver_t;
|
|
|
|
typedef void (*dma_stage_completion_handler)(void* userdata);
|
|
|
|
typedef struct tag_dma_driver
|
|
{
|
|
driver_base_t base;
|
|
void (*set_select_request)(uint32_t request, void* userdata);
|
|
void (*config)(uint32_t priority, void* userdata);
|
|
void (*transmit_async)(const volatile void* src, volatile void* dest, int src_inc, int dest_inc, size_t element_size, size_t count, size_t burst_size, SemaphoreHandle_t completion_event, void* userdata);
|
|
void (*loop_async)(const volatile void** srcs, size_t src_num, volatile void** dests, size_t dest_num, int src_inc, int dest_inc, size_t element_size, size_t count, size_t burst_size, dma_stage_completion_handler stage_completion_handler, void* stage_completion_handler_data, SemaphoreHandle_t completion_event, int* stop_signal, void* userdata);
|
|
} dma_driver_t;
|
|
|
|
extern driver_registry_t g_hal_drivers[];
|
|
extern driver_registry_t g_dma_drivers[];
|
|
extern driver_registry_t g_system_drivers[];
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _FREERTOS_DRIVER_H */
|