📄 uart.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2006 by Witz Corporation, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: uart.c,v 1.1 2006/04/10 08:19:25 honda Exp $ *//* * 润票袋奶慨 (UART)シリアルチャンネルデバイス∈SIO∷ドライバ * ∈Zup-F16橙磨ボ〖ド脱∷ */#include <s_services.h>#include <sil.h>#include <tmp91cy22.h>#include <uart.h>/* * シリアルI/O扩告レジスタへのオフセット年盗 */#define TOFFSET_SC0BUF 0x0000#define TOFFSET_SC0CR 0x0001#define TOFFSET_SC0MOD0 0x0002#define TOFFSET_BR0CR 0x0003#define TOFFSET_BR0ADD 0x0004#define TOFFSET_SC0MOD1 0x0005 /* * シリアルI/Oポ〖ト觉轮フラグの年盗 */#define TBIT_STS_DEF 0x00#define TBIT_TXB_EMPTY 0x01#define TBIT_ENE_TXCBR 0x02#define TBIT_ENE_RXCBR 0x04#define TBIT_LOG_PORT 0x80/* * シリアルI/Oポ〖ト介袋步ブロック * * ID = 1 をuart1·ID = 2 をuart0に滦炳させているˉ */static const SIOPINIB siopinib_table[TNUM_PORT] = { { TADR_SFR_SC1BUF, TADR_SFR_INTES1, 0x08, (TBIT_SIOSMU8 | TBIT_SIORXE | TBIT_SIOSCBRG), 0x00, BRCR_19200, BRADD_19200, TBIT_RX1_CLR } /* ID1脱 UART1 19200bps *//* { TADR_SFR_SC1BUF, TADR_SFR_INTES1, 0x08, (TBIT_SIOSMU8 | TBIT_SIORXE | TBIT_SIOSCBRG), 0x00, BRCR_38400, BRADD_38400, TBIT_RX1_CLR }*/ /* ID1脱 UART1 38400bps *//* { TADR_SFR_SC0BUF, TADR_SFR_INTES0, 0x01, (TBIT_SIOSMU8 | TBIT_SIORXE | TBIT_SIOSCBRG), 0x00, BRCR_19200, BRADD_19200, TBIT_RX0_CLR }*/ /* ID2脱 UART0 19200bps */};/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */static SIOPCB siopcb_table[TNUM_PORT];/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))/* * SIOドライバの介袋步ル〖チン */voiduart_initialize(){ SIOPCB *siopcb; UINT i; /* * シリアルI/Oポ〖ト瓷妄ブロックの介袋步 */ for (siopcb = siopcb_table, i = 0; i < TNUM_PORT; siopcb++, i++) { siopcb->siopinib = &(siopinib_table[i]); siopcb->sts_flag = TBIT_STS_DEF; siopcb->rxb = -1; }}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *uart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; int i; /* ポ〖トIDから瓷妄ブロックを艰评 */ siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* 瓷妄ブロックに攫鼠肋年 */ siopcb->sts_flag |= TBIT_TXB_EMPTY; siopcb->exinf = exinf; if( siopid == LOGTASK_PORTID ){ /* システムログ脱のポ〖トの眷圭 */ siopcb->sts_flag |= TBIT_LOG_PORT; if( log_io_busy == TRUE ){ /* 流慨面の眷圭は窗位まで略つ */ while( (sil_reb_mem((VP)(siopinib->hint)) & TBIT_INTC_H) == 0 ); } log_io_busy = FALSE; /* 介袋步なので汤绩弄に乖っている */ } /* 减慨匿贿 */ sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_SC0MOD0), 0x00 ); /* ポ〖ト肋年(TXDとして蝗脱) */ sil_wrb_mem((VP)(TADR_SFR_P9FC), siopinib->pcrfc_def ); sil_wrb_mem((VP)(TADR_SFR_P9CR), siopinib->pcrfc_def ); /* 瓢侯モ〖ド肋年 */ sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_SC0MOD0), siopinib->scmod0_def ); sil_reb_mem((VP)(siopinib->cntrl+TOFFSET_SC0CR)); /* 粕叫しによりエラ〖フラグクリア */ sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_SC0CR), siopinib->sccr_def ); sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_BR0CR), siopinib->brcr_def); sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_BR0ADD), siopinib->bradd_def); sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_SC0MOD1), TBIT_SIOI2S); /* シリアル充哈みの肋年および妥滇フラグクリア */ sil_wrb_mem((VP)TADR_SFR_INTCLR, (siopinib->int_clr) ); /* 减慨妥滇クリア */ sil_wrb_mem((VP)TADR_SFR_INTCLR, (VB)(siopinib->int_clr + 1) ); /* 流慨妥滇クリア */ sil_wrb_mem((VP)(siopinib->hint), (VB)((INT_LEVEL_UART << 4) | INT_LEVEL_UART) ); /* * ダミ〖デ〖タ减慨 */ sil_reb_mem((VP)(siopinib->cntrl+TOFFSET_SC0BUF)); sil_reb_mem((VP)(siopinib->cntrl+TOFFSET_SC0BUF)); return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voiduart_cls_por(SIOPCB *siopcb){ const SIOPINIB *siopinib; siopinib = siopcb->siopinib; /* 减慨匿贿 */ sil_wrb_mem((VP)(siopinib->cntrl+TOFFSET_SC0MOD0), 0x00 ); /* システムログ脱ポ〖トの借妄 */ if( (siopcb->sts_flag & TBIT_LOG_PORT) == TBIT_LOG_PORT ){ if( log_io_busy == TRUE ){ /* 流慨面の眷圭は窗位まで略つ */ while( (sil_reb_mem((VP)(TADR_SFR_INTES0)) & TBIT_INTC_H) == 0 ); } log_io_busy = FALSE; } /* シリアル充哈みの敦贿および妥滇フラグクリア */ sil_wrb_mem((VP)(siopinib->hint), 0x00 ); sil_wrb_mem((VP)TADR_SFR_INTCLR, (siopinib->int_clr) ); /* 减慨妥滇クリア */ sil_wrb_mem((VP)TADR_SFR_INTCLR, (VB)(siopinib->int_clr + 1) ); /* 流慨妥滇クリア */ /* ポ〖ト肋年(ポ〖トとして蝗脱) */ sil_wrb_mem((VP)(TADR_SFR_P9FC), 0x00 ); sil_wrb_mem((VP)(TADR_SFR_P9CR), 0x00 ); siopcb->sts_flag = TBIT_STS_DEF;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLuart_snd_chr(SIOPCB *siopcb, char c){ if( (siopcb->sts_flag & TBIT_TXB_EMPTY) == TBIT_TXB_EMPTY ){ siopcb->sts_flag &= (UB)~TBIT_TXB_EMPTY; sil_wrb_mem((VP)(siopcb->siopinib->cntrl+TOFFSET_SC0BUF), c); /* システムログ脱ポ〖トの借妄 */ if( (siopcb->sts_flag & TBIT_LOG_PORT) == TBIT_LOG_PORT ){ log_io_busy = TRUE; /* 流慨面 */ } return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTuart_rcv_chr(SIOPCB *siopcb){ return(siopcb->rxb);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voiduart_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case UART_ERDY_SND: siopcb->sts_flag |= TBIT_ENE_TXCBR; break; case UART_ERDY_RCV: siopcb->sts_flag |= TBIT_ENE_RXCBR; break; default: break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voiduart_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case UART_ERDY_SND: siopcb->sts_flag &= (UB)~TBIT_ENE_TXCBR; break; case UART_ERDY_RCV: siopcb->sts_flag &= (UB)~TBIT_ENE_RXCBR; break; default: break; }}/* * ポ〖トID=1に回年されているSIOチャンネル(uart1)からの减慨充哈み */void serial_in_handler1(){ SIOPCB *siopcb = &siopcb_table[0]; /* エラ〖の眷圭借妄しない */ if( ( sil_reb_mem((VP)(siopcb->siopinib->cntrl+TOFFSET_SC0CR)) & 0x1c ) == 0 ){ /* デ〖タ减慨 */ siopcb->rxb = (INT)sil_reb_mem((VP)(siopcb->siopinib->cntrl+TOFFSET_SC0BUF)); /* コ〖ルバックが钓材されている眷圭 */ if( (siopcb->sts_flag & TBIT_ENE_RXCBR) == TBIT_ENE_RXCBR ){ /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_rcv(siopcb->exinf); } }}/* * ポ〖トID=1に回年されているSIOチャンネル(uart1)からの流慨充哈み */void serial_out_handler1(){ SIOPCB *siopcb = &siopcb_table[0]; /* デ〖タ流慨窗位フラグON */ siopcb->sts_flag |= TBIT_TXB_EMPTY; /* システムログ脱ポ〖トの借妄 */ if( (siopcb->sts_flag & TBIT_LOG_PORT) == TBIT_LOG_PORT ){ log_io_busy = FALSE; /* 流慨窗位 */ } /* コ〖ルバックが钓材されている眷圭 */ if( (siopcb->sts_flag & TBIT_ENE_TXCBR) == TBIT_ENE_TXCBR ){ /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_snd(siopcb->exinf); }}#if TNUM_PORT >= 2/* * ポ〖トID=2に回年されているSIOチャンネル(uart0)からの减慨充哈み */void serial_in_handler2(){ SIOPCB *siopcb = &siopcb_table[1]; /* エラ〖の眷圭借妄しない */ if( ( sil_reb_mem((VP)(siopcb->siopinib->cntrl+TOFFSET_SC0CR)) & 0x1c ) == 0 ){ /* デ〖タ减慨 */ siopcb->rxb = (INT)sil_reb_mem((VP)(siopcb->siopinib->cntrl+TOFFSET_SC0BUF)); /* コ〖ルバックが钓材されている眷圭 */ if( (siopcb->sts_flag & TBIT_ENE_RXCBR) == TBIT_ENE_RXCBR ){ /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_rcv(siopcb->exinf); } }}/* * ポ〖トID=2に回年されているSIOチャンネル(uart0)からの流慨充哈み */void serial_out_handler2(){ SIOPCB *siopcb = &siopcb_table[1]; /* デ〖タ流慨窗位フラグON */ siopcb->sts_flag |= TBIT_TXB_EMPTY; /* システムログ脱ポ〖トの借妄 */ if( (siopcb->sts_flag & TBIT_LOG_PORT) == TBIT_LOG_PORT ){ log_io_busy = FALSE; /* 流慨窗位 */ } /* コ〖ルバックが钓材されている眷圭 */ if( (siopcb->sts_flag & TBIT_ENE_TXCBR) == TBIT_ENE_TXCBR ){ /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_snd(siopcb->exinf); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -