#ifndef __UART_ELCORE_HEADER #define __UART_ELCORE_HEADER typedef struct { union { struct { unsigned char erbi:1; unsigned char etbei:1; unsigned char erlsi:1; unsigned char emsi:1; unsigned char reserv:4; } detail; unsigned char raw8; } ier; union { struct { unsigned char ip:1; unsigned char iid:3; unsigned char reserv:2; unsigned char fe:2; } detail; unsigned char raw8; } iir; union { struct { unsigned char fewo:1; unsigned char rfr:1; unsigned char tfr:1; unsigned char dms:1; unsigned char reserv:2; unsigned char rftl:2; } detail; unsigned char raw8; } fcr; union { struct { unsigned char wls:2; unsigned char stb:1; unsigned char pen:1; unsigned char eps:1; unsigned char stp:1; unsigned char sbc:1; unsigned char dlab:1; } detail; unsigned char raw8; } lcr; union { struct { unsigned char dtr:1; unsigned char rts:1; unsigned char out1:1; unsigned char out2:1; unsigned char loop:1; unsigned char reserv:3; } detail; unsigned char raw8; } mcr; union { struct { unsigned char rdr:1; unsigned char oe:1; unsigned char pe:1; unsigned char fe:1; unsigned char bi:1; unsigned char thre:1; unsigned char temt:1; unsigned char eirf:1; } detail; unsigned char raw8; } lsr; union { struct { unsigned char dcts:1; unsigned char ddsr:1; unsigned char teri:1; unsigned char ddcd:1; unsigned char cts:1; unsigned char dsr:1; unsigned char ri:1; unsigned char dcd:1; } detail; unsigned char raw8; } msr; unsigned char spr; unsigned char dll; unsigned char dlm; unsigned char sclr; } TUARTCtrl; typedef struct { unsigned int uart_no; int lock; TUARTCtrl* ctrl; TRoundBuffer rec_buffer; int mode; } TUART; extern TUART* UARTOpen(unsigned int sport_no, TUARTCtrl* you_settings, unsigned int baud_rate); extern void UARTClose(TUART*); extern int UARTRead(TUART*, unsigned int size, void* data); extern int UARTWrite(TUART*, unsigned int size, void* data); /* макросы для RAW режима */ /* вспомогательные сокращения для работы с регистром LCR */ /* установка длины символа в битах */ #define set_lcr_wls(p, v) ((p) = ( p | ( (v) & 0x3 ))) #define get_lcr_wls(p) ((p) & 0x3) #define clear_lcr_wls(p) ((p) ^=((p) & 0x3)) /* количество стоп-бит, для 5-битного символа стоп-бит имеет длину 1,5 бита * приёмник анализирует только первый стоп-бит */ #define set_lcr_stb(p, v) ((p) = ( p | (( (v) & 0x1 )<<2) )) #define get_lcr_stb(p) (((p) >> 2) & 0x1) #define clear_lcr_stb(p) ((p) ^=((p) & 0x4)) /* разрешение генерации или проверки контрольного бита*/ #define set_lcr_pen(p, v) ( (p) = ( p | (((v) & 0x1)<<3) ) ) #define get_lcr_pen(p) (((p) >> 3) & 0x1) #define clear_lcr_pen(p) ((p) ^=((p) & 0x8)) /* выбор типа контроля (при PEN == 1) */ #define set_lcr_eps(p, v) ( (p) = ( p | (((v) & 0x1)<<4) ) ) #define get_lcr_eps(p) (((p) >> 4) & 0x1) #define clear_lcr_eps(p) ((p) ^=((p) & 0x10)) /* принудительное формирование бита паритета */ #define set_lcr_stp(p, v) ( (p) = ( p | (((v) & 0x1)<<5) ) ) #define get_lcr_stp(p) (((p) >> 5) & 0x1) #define clear_lcr_stp(p) ((p) ^=((p) & 0x20)) /* формирование бита обрыва*/ #define set_lcr_sbc(p, v) ( (p) = ( p | (((v) & 0x1)<<6) ) ) #define get_lcr_sbc(p) (((p) >> 6) & 0x1) #define clear_lcr_sbc(p) ((p) ^=((p) & 0x40)) /* управление доступом к регистрам */ #define set_lcr_dlab(p, v) ( (p) = ( p | (((v) & 0x1)<<7) ) ) #define get_lcr_dlab(p) (((p) >> 7) & 0x1) #define clear_lcr_dlab(p) ((p) ^= ((p) & 0x80)) /* для регистра FCR */ /* разрешение работы XMIT и RCVR FIFO */ #define set_fcr_fewo(p, v) ( (p) = ( p | ((v) & 0x1) ) ) #define get_fcr_fewo(p) ((p) & 0x1) #define clear_fcr_fewo(p) ((p) ^=((p) & 0x1)) /* установка RCVR FIFO в исходное состояние. регистр RSR не обнуляется */ #define set_fcr_rfr(p, v) ( (p) = ( p | (((v) & 0x1)<<1) ) ) #define get_fcr_rfr(p) (((p)>>1) & 0x1 ) #define clear_fcr_rfr(p) ((p) ^=((p) & 0x2)) /* установка XMIT FIFO в исходное состояние. регистр TSR не обнуляется */ #define set_fcr_tfr(p, v) ( (p) = ( p | (((v) & 0x1)<<2) ) ) #define get_fcr_tfr(p) (((p)>>2) & 0x1 ) #define clear_fcr_tfr(p) ((p) ^=((p) & 0x4)) /* режим работы DMA */ #define set_fcr_dms(p, v) ( (p) = ( p | (((v) & 0x1)<<3) ) ) #define get_fcr_dms(p) (((p)>>3) & 0x1 ) #define clear_fcr_dms(p) ((p) ^=((p) & 0x8)) /* порог заполнения RCVR FIFO (в байтах), при котором формируется прерывание.*/ #define set_fcr_rftl(p, v) ( (p) = ( p | (((v) & 0x3)<<6) ) ) #define get_fcr_rftl(p) (((p)>>6) & 0x3 ) #define clear_fcr_rftl(p) ((p) ^=((p) & 0xC0)) /* для регистра LSR */ /* готовность данных. устанавливается после приёма символа данных и передачи его в регистр RBR FIFO. сбрасывается после чтения RBR или чтения всего содержимого RCVR FIFO(в режиме FIFO */ #define get_lsr_rdr(p) ((p) & 0x1 ) /* ошибка переполнения */ #define get_lsr_oe(p) (((p)>>1) & 0x1 ) /* ошибка контрольного бита */ #define get_lsr_pe(p) (((p)>>2) & 0x1 ) /* ошибка кадра */ #define get_lsr_fe(p) (((p)>>3) & 0x1 ) /* ошибка обрыв линии */ #define get_lsr_bi(p) (((p)>>4) & 0x1 ) /* передающий буферный регистр пустю показывает что порт готов принять следующий символ для передачи. */ #define get_lsr_thre(p) (((p)>>5) & 0x1 ) /* передатчик пуст */ #define get_lsr_temt(p) (((p)>>6) & 0x1 ) /* наличие ошибок в FIFO */ #define get_lsr_eirf(p) (((p)>>7) & 0x1 ) /* регистр IER(регистр разрешения прерывания */ /* разрешение прерывания по наличию принятых данных, а также по таймауту*/ #define set_ier_erbi(p, v) ( (p) = ( p | ((v) & 0x1) ) ) #define get_ier_erbi(p) ((p) & 0x1 ) #define clear_ier_erbi(p) ((p) ^=((p) & 0x1)) /* разрешение прерывания по отсутствию данных в регистрах передачи */ #define set_ier_etbei(p, v) ( (p) = ( p | (((v) & 0x1)<<1) ) ) #define get_ier_etbei(p) (((p)>>1) & 0x1 ) #define clear_ier_etbei(p) ((p) ^=((p) & 0x2)) /* разрешение прерывания по статусу приёма данных */ #define set_ier_erlsi(p, v) ( (p) = ( p | (((v) & 0x1)<<2) ) ) #define get_ier_erlsi(p) (((p)>>2) & 0x1 ) #define clear_ier_erlsi(p) ((p) ^=((p) & 0x4)) /* разрешение прерывания по статусу модема */ #define set_ier_emsi(p, v) ( (p) = ( p | (((v) & 0x1)<<3) ) ) #define get_ier_emsi(p) (((p)>>3) & 0x1 ) #define clear_ier_emsi(p) ((p) ^=((p) & 0x8)) /* регистр IIR (идентификации прерываний)*/ /* признак наличия прерывания */ #define get_iir_ip(p) ((p) & 0x1) /* код идентификации прерывания */ #define get_iir_iid(p) (((p)>>1) & 0x7) /* признак разрешения работы RCVR и XMIT FIFO */ #define get_iir_fe(p) (((p)>>6) & 0x3) /* регистр MCR */ /* управление выходом nDTR */ #define set_mcr_dtr(p, v) ( (p) = ( p | ((v) & 0x1) ) ) #define get_mcr_dtr(p) ((p) & 0x1 ) #define clear_mcr_dtr(p) ((p) ^=((p) & 0x1)) /* управление выходом nRTS */ #define set_mcr_rts(p, v) ( (p) = ( p | (((v) & 0x1)<<1) ) ) #define get_mcr_rts(p) (((p)>>1) & 0x1 ) #define clear_mcr_rts(p) ((p) ^=((p) & 0x2)) /* управление выходом OUT1 */ #define set_mcr_out1(p, v) ( (p) = ( p | (((v) & 0x1)<<2) ) ) #define get_mcr_out1(p) (((p)>>2) & 0x1 ) #define clear_mcr_out1(p) ((p) ^=((p) & 0x4)) /* управление выходом OUT2 */ #define set_mcr_out2(p, v) ( (p) = ( p | (((v) & 0x1)<<3) ) ) #define get_mcr_out2(p) (((p)>>3) & 0x1 ) #define clear_mcr_out2(p) ((p) ^=((p) & 0x8)) /* режим петли */ #define set_mcr_loop(p, v) ( (p) = ( p | (((v) & 0x1)<<4) ) ) #define get_mcr_loop(p) (((p)>>4) & 0x1 ) #define clear_mcr_loop(p) ((p) ^=((p) & 0x10)) /* регистр MSR */ /* признак изменения состояния входного сигнала CTS*/ #define get_msr_dcts(p) ( (p) & 0x1 ) /* признак изменения состояния входного сигнала DSR*/ #define get_msr_ddsr(p) ( ((p)>>1) & 0x1 ) /* признак перехода входного сигнала RI с низкого уровн на высокий */ #define get_msr_teri(p) ( ((p)>>2) & 0x1 ) /* признак изменения состояния входного сигнала DCD */ #define get_msr_ddcd(p) ( ((p)>>3) & 0x1 ) /* состояние на входе nCTS */ #define get_msr_cts(p) ( ((p)>>4) & 0x1 ) /* состояние на входе nDSR */ #define get_msr_dsr(p) ( ((p)>>5) & 0x1 ) /* состояние на входе nRI */ #define get_msr_ri(p) ( ((p)>>6) & 0x1 ) /* состояние на входе nDCD */ #define get_msr_dcd(p) ( ((p)>>7) & 0x1 ) #endif /* __UART_ELCORE_HEADER */