inwudriver-weibo/bsp/drivers/uart/uart_drv.h

168 lines
5.1 KiB
C
Raw Normal View History

/*
* Copyright (c) CompanyNameMagicTag 2012-2019. All rights reserved.
* Description: Adjust the directory structure to prepare for compiling the SDK. uart_drv.h code
* Author: CompanyName
* Create: 2012-07-14
*/
#ifndef __UART_DRV_H__
#define __UART_DRV_H__
#include <soc_mdm_uart.h>
#include "los_typedef.h"
#include "los_event.h"
#ifdef __cplusplus
extern "C" {
#endif
#define UART_RD_EVENT 0x1
#define UART_WD_EVENT 0x2
#define BUF_CIRCLED (1 << 0)
#define BUF_OVERFLOWED (1 << 1)
#define BUF_EMPTIED (1 << 2)
#define UART_FLG_RD_BLOCK (1 << 0)
#define UART_FLG_WD_BLOCK (1 << 1)
#define DATA_BIT_5 0x00
#define DATA_BIT_6 0x01
#define DATA_BIT_7 0x02
#define DATA_BIT_8 0x03
#define STOP_BIT_1 0x00
#define STOP_BIT_1P5 0x04
#define STOP_BIT_2 0x04
#define PARITY_NONE 0x00
#define PARITY_ODD 0x08
#define PARITY_EVEN 0x18
#define UART_DEBUG_INFO
#define GPIO_SEL_UART 0
#define GPIO_SEL_GPIO 1
#define UART_ERR_PARA_INVALID 1
#define UART_ERR_INIT_CIRC_FAILED 2
#define UART_ERR_START_FAILED 3
#define UART_ERR_IOCTL_FAILED 4
#define UART_ERR_PTR_NULL 5
#define UART_ERR_OPEN_AGAIN 6
#define UART_ERR_NOT_OPENED 7
typedef struct uart_circ_buf {
unsigned int rp;
unsigned int wp;
unsigned int flags;
char *data;
unsigned int size;
} uart_circ_buf_t;
typedef enum uart_status {
UART_STATE_NOT_OPENED = 0,
UART_STATE_USEABLE
} uart_status;
typedef enum uart_mode {
UART_232 = 0
} uart_mode;
typedef struct uart_attr {
unsigned int baudrate;
unsigned char data_bits;
unsigned char stop_bits;
unsigned char parity;
unsigned char rsv;
} uart_attr_t;
typedef struct uart_driver_data uart_driver_data_t;
typedef struct uart_ops {
int (*startup)(uart_driver_data_t *udd);
void (*shutdown)(const uart_driver_data_t *udd);
int (*start_tx)(uart_driver_data_t *udd, const char *buf, size_t count);
int (*ioctl)(uart_driver_data_t *udd);
} uart_ops_t;
typedef int (*recv_notify)(uart_circ_buf_t *transfer, const char *buf, size_t count);
typedef int (*send_buf)(uart_circ_buf_t *transfer, char *buf, size_t count);
#ifdef UART_DEBUG_INFO
#define uart_set_err_no(err) (udd->uart_stat_info.uart_errno = (err))
#else
#define uart_set_err_no(err)
#endif
typedef struct {
unsigned char data[EXT_UART_LAST_RECORD_BYTE_COUNT]; /* Stores the last data sent and received by the UART */
unsigned int num; /* The subscript of the last stored data */
} uart_recv_send_last_data_t; /* Record the last data sent and received by the UART */
typedef struct uart_drv_stat_info {
unsigned int uart_errno;
unsigned int recv_irq_cnt;
unsigned int recv_irq_data_cnt;
unsigned int recv_irq_data_suc_cnt;
unsigned int recv_buf_overflow_cnt;
unsigned int read_circ_cnt;
unsigned int send_irq_cnt;
unsigned int send_irq_data_cnt;
unsigned int write_circ_cnt;
unsigned int recv_irq_err_overrun;
unsigned int recv_irq_err_parity;
unsigned int recv_irq_err_frame;
unsigned int recv_irq_err_break;
unsigned int recv_irq_err_busy;
unsigned int recv_irq_err_emptyfifo_cnt;
uart_recv_send_last_data_t recv_last_context;
uart_recv_send_last_data_t send_last_context;
} uart_drv_stat_info_t;
struct uart_driver_data {
#ifdef UART_DEBUG_INFO
uart_drv_stat_info_t uart_stat_info;
#endif
unsigned int num;
uart_mode type;
unsigned int phys_base;
unsigned int irq_num;
uart_circ_buf_t *rx_transfer;
uart_circ_buf_t *tx_transfer;
unsigned short flags;
unsigned short usr_flag; /* Used for user layer to pass information for drive control */
EVENT_CB_S uart_event;
int count;
int state;
recv_notify rx_recv;
send_buf tx_send;
uart_ops_t *ops;
uart_attr_t attr;
};
#define uart_error(msg...) \
do { \
dprintf("\n"); \
dprintf("<uart,err>:%s,%d: ", __func__, __LINE__); \
dprintf(msg); \
dprintf("\n"); \
} while (0)
void uart_tx_interrupt_enable(EXT_CONST uart_driver_data_t *udd);
int uart_circ_buf_empty(EXT_CONST uart_circ_buf_t *transfer);
unsigned int uart_init_circ_buf(uart_driver_data_t *udd, unsigned int rx_fifo_size, unsigned int tx_fifo_size);
void uart_deinit_circ_buf(uart_driver_data_t *udd);
int uart_read_circ_buf(uart_circ_buf_t *transfer, char *buf, size_t count);
int uart_write_circ_buf(uart_circ_buf_t *transfer, const char *buf, size_t count);
void uart_set_tx_mode(uart_driver_data_t *udd);
unsigned char uart_rx_fifo_num(EXT_CONST uart_driver_data_t *udd);
void uart_tx_interrupt_disable(EXT_CONST uart_driver_data_t *udd);
void uart_tf_interrupt_disable(EXT_CONST uart_driver_data_t *udd);
void uart_rx_interrupt_disable(EXT_CONST uart_driver_data_t *udd);
extern uart_ops_t g_uart_driver_uops;
#ifdef __cplusplus
}
#endif
#endif /* __UART_DRV_H__ */