176 lines
5.5 KiB
C
176 lines
5.5 KiB
C
#ifndef _UART_DEV_H_
|
||
#define _UART_DEV_H_
|
||
|
||
#include "typedef.h"
|
||
#include "os/os_api.h"
|
||
#include "jiffies.h"
|
||
#include "irq.h"
|
||
/* #include "jtime.h" */
|
||
|
||
#define CONFIG_ENABLE_UART_SEM 1
|
||
#define SET_INTERRUPT ___interrupt
|
||
#define irq_disable(x) bit_clr_ie(x)
|
||
#define irq_enable(x) bit_set_ie(x)
|
||
|
||
#ifndef time_after
|
||
#define time_after(a,b) (((long)(b) - (long)(a)) < 0)
|
||
#endif
|
||
|
||
#ifndef time_before
|
||
#define time_before(a,b) time_after(b,a)
|
||
#endif
|
||
|
||
#ifndef MIN
|
||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||
#endif
|
||
|
||
#ifndef MAX
|
||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||
#endif
|
||
|
||
static inline u32 ut_get_jiffies(void)
|
||
{
|
||
#if 1
|
||
return jiffies;
|
||
#endif
|
||
#if 0
|
||
return Jtime_updata_jiffies();
|
||
#endif
|
||
}
|
||
|
||
static inline u32 ut_msecs_to_jiffies(u32 msecs)
|
||
{
|
||
if (msecs >= 10) {
|
||
msecs /= 10;
|
||
} else if (msecs) {
|
||
msecs = 1;
|
||
}
|
||
return msecs;
|
||
}
|
||
|
||
#if CONFIG_ENABLE_UART_SEM
|
||
typedef OS_SEM UT_Semaphore ;
|
||
static inline void UT_OSSemCreate(UT_Semaphore *sem, u32 count)
|
||
{
|
||
os_sem_create(sem, count);
|
||
}
|
||
static inline void UT_OSSemPost(UT_Semaphore *sem)
|
||
{
|
||
os_sem_post(sem);
|
||
}
|
||
static inline u32 UT_OSSemPend(UT_Semaphore *sem, u32 timeout)
|
||
{
|
||
return os_sem_pend(sem, timeout);
|
||
}
|
||
static inline void UT_OSSemSet(UT_Semaphore *sem, u32 count)
|
||
{
|
||
os_sem_set(sem, count);
|
||
}
|
||
static inline void UT_OSSemClose(UT_Semaphore *sem)
|
||
{
|
||
|
||
}
|
||
static inline void ut_sleep()
|
||
{
|
||
os_time_dly(1);
|
||
}
|
||
|
||
#else
|
||
typedef volatile u32 UT_Semaphore;
|
||
static inline void UT_OSSemCreate(UT_Semaphore *sem, u32 count)
|
||
{
|
||
*sem = count;
|
||
}
|
||
static inline void UT_OSSemPost(UT_Semaphore *sem)
|
||
{
|
||
(*sem)++;
|
||
}
|
||
static inline u32 UT_OSSemPend(UT_Semaphore *sem, u32 timeout)
|
||
{
|
||
u32 _timeout = timeout + ut_get_jiffies();
|
||
extern void clr_wdt();
|
||
while (1) {
|
||
if (*sem) {
|
||
(*sem) --;
|
||
break;
|
||
}
|
||
if ((timeout != 0) && time_before(_timeout, ut_get_jiffies())) {
|
||
return -1;
|
||
}
|
||
clr_wdt();
|
||
}
|
||
return 0;
|
||
}
|
||
static inline void UT_OSSemSet(UT_Semaphore *sem, u32 count)
|
||
{
|
||
*sem = count;
|
||
}
|
||
static inline void UT_OSSemClose(UT_Semaphore *sem)
|
||
{
|
||
|
||
}
|
||
static inline void ut_sleep()
|
||
{
|
||
extern void clr_wdt();
|
||
clr_wdt();
|
||
}
|
||
#endif
|
||
|
||
|
||
typedef void (*ut_isr_cbfun)(void *ut_bus, u32 status);
|
||
struct uart_platform_data_t {
|
||
u8 tx_pin; ///< 作为发送引脚的引脚号,可从参考gpio.h枚举中选,当引脚为空时,则填 -1
|
||
u8 rx_pin; ///< 作为接收引脚的引脚号,可从参考gpio.h枚举中选,当引脚为空时,则填 -1
|
||
void *rx_cbuf; ///< 如果使用中断DMA接收,则写入循环buf的首地址,ut中断使能;如果不使用,则写入NULL,无中断
|
||
u32 rx_cbuf_size; ///< 循环buf的大小,必须为2的多少几次幂,如果不用循环buf,该值无效,可写NULL
|
||
u32 frame_length; ///< 产生RT中断的字节数,如无中断,该值无效
|
||
u32 rx_timeout; ///< 产生OT中断的时间值,单位ms,如无中断,该值无效
|
||
ut_isr_cbfun isr_cbfun; ///< ut中断的回调函数句柄,不用回调函数则写入NULL,如无中断,句柄无效
|
||
void *argv; ///< ut中断的回调函数的一个扩展形参,可供用户设定,如无回调函数,此参数无效
|
||
u32 is_9bit: 1; ///< ut九位模式使能位,0:关闭;1:使能
|
||
u32 baud: 24; ///< ut的波特率
|
||
};
|
||
|
||
/**
|
||
* @brief 循环buf结构体类型定义
|
||
*/
|
||
typedef struct {
|
||
u8 *buffer; ///<循环buf的首地址
|
||
u32 buf_size; ///<循环buf的大小
|
||
u32 buf_in; ///<循环buf的写偏移量
|
||
u32 buf_out; ///<循环buf的读偏移量
|
||
} KFIFO;
|
||
|
||
enum {
|
||
UT_TX = 1,
|
||
UT_RX,
|
||
UT_RX_OT
|
||
};
|
||
|
||
/**
|
||
* @brief ut初始化函数的返回结构体,含各函数指针,供外部使用
|
||
*/
|
||
typedef struct {
|
||
ut_isr_cbfun isr_cbfun; ///< ut中断的回调函数句柄,不用回调函数则写入NULL,如无中断,句柄无效
|
||
void *argv; ///< ut中断的回调函数的一个扩展形参,在此返回
|
||
void (*putbyte)(char a); ///< ut发送一个byte
|
||
u8(*getbyte)(u8 *buf, u32 timeout); ///< ut接收一个byte,buf:字节存放地址;timeout:超时时间,单位ms;返回0:失败;返回1:成功
|
||
u32(*read)(u8 *inbuf, u32 len, u32 timeout); ///< ut接收一个字符串,inbuf:字符串存放首地址;len:预接收长度;timeout:超时时间,单位ms;返回实际接收的长度
|
||
void (*write)(const u8 *outbuf, u32 len); ///< ut发送一个字符串,outbuf:字符串首地址;len:发送的字符串长度;
|
||
void (*set_baud)(u32 baud); ///< ut设置波特率,baud:波特率值
|
||
u32 frame_length;
|
||
u32 rx_timeout;
|
||
KFIFO kfifo; ///< ut用的循环buf结构体的指针
|
||
UT_Semaphore sem_rx;
|
||
UT_Semaphore sem_tx;
|
||
} uart_bus_t;
|
||
|
||
|
||
const uart_bus_t *uart_dev_open(const struct uart_platform_data_t *arg);
|
||
u32 uart_dev_close(uart_bus_t *ut);
|
||
|
||
////////////////////////////////////////////////////////////////////////////////
|
||
#endif
|
||
|
||
|