📄 hw_serial.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2005 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * *//* * シリアルI/Oデバイス∈SIO∷ドライバ∈Xstormy16脱∷ */#include <kernel.h>#include <s_services.h>#include <hw_serial.h>#include <cpu_sfrs.h>/* * 润票袋流慨でのTxReadyのタイムアウト */#define TXREADY_TIMEOUT 400/* * SIOPCB*チェックのためのマジック猛 */#define MAGIC_SIOPCB 0xabcd/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */static SIOPCB siopcb_table[TNUM_PORT] = { { MAGIC_SIOPCB, __U0CR, 0x1400 }, { MAGIC_SIOPCB, __U1CR, 0x4800 },} ;/* * SIOドライバの介袋步ル〖チン */void sio_initialize(void){ /* nothing to do here */}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *sio_opn_por(ID siopid, VP_INT exinf){ SIOPCB* siopcb ; UH uhBase ; /* * オ〖プン叫丸るポ〖トかのチェック */ if ( siopid < 1 || siopid > TNUM_PORT ) return NULL ; siopcb = &siopcb_table[siopid-1] ; if ( siopcb->bNotExist ) return NULL ; /* * 贷にオ〖プン貉みの眷圭 */ if ( siopcb->bOpened ) { siopcb->vpiExinf = exinf ; return siopcb ; } /* * SIOの介袋步と赂哼のチェック */ uhBase = siopcb->uhBase ; __SFR(uhBase) = __UxCR_RUN|__UxCR_TXEMPTY ; if ( ( __SFR(uhBase) & ( __UxCR_RUN|__UxCR_BAUDRATE|__UxCR_PARITY|__UxCR_TXIE| __UxCR_RXIE) ) != __UxCR_RUN ) { siopcb->bNotExist = TRUE ; return NULL ; } /* * 瓷妄テ〖ブルの介袋步 */ siopcb->vpiExinf = exinf ; siopcb->bOpened = TRUE ; siopcb->bTxIe = FALSE ; siopcb->bRxIe = FALSE ; siopcb->bLastIsCr = FALSE ; /* * 充り哈みハンドラの判峡と钓材 */ define_inh( INHNO_SIO, sio_handler ) ; __UNLOCK_EXCP() ; __SFRW(__EXCPL) |= siopcb->uhExcpMask ; __LOCK_EXCP() ; return siopcb ;}/* * シリアルI/Oポ〖トのクロ〖ズ */void sio_cls_por(SIOPCB *siopcb){ /* * クロ〖ズ叫丸るポ〖トかのチェック */ if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB || siopcb->bNotExist || !siopcb->bOpened ) return ; /* * 瓷妄テ〖ブルの恃构 */ siopcb->bOpened = FALSE ; /* * 充り哈みの敦贿 */ __UNLOCK_EXCP() ; __SFRW(__EXCPL) &= ~siopcb->uhExcpMask ; __LOCK_EXCP() ; /* * SIOの匿贿 */ __SFR(siopcb->uhBase) = 0 ;}/* * SIOの充哈みハンドラ */void sio_handler(void){ /* * 链てのポ〖トについてチェック */ ID portid ; for ( portid = 0 ; portid < TNUM_PORT ; portid++ ) { SIOPCB *siopcb = &siopcb_table[portid] ; UH uhBase = siopcb->uhBase ; /* * 流慨窗位充り哈みか */ if ( ( __SFR(uhBase) & ( __UxCR_TXIE | __UxCR_TXEMPTY ) ) == ( __UxCR_TXIE | __UxCR_TXEMPTY ) ) { sio_ierdy_snd( siopcb->vpiExinf ) ; } /* * 减慨充り哈みか */ if ( ( __SFR(uhBase) & ( __UxCR_RXIE | __UxCR_RXREADY ) ) == ( __UxCR_RXIE | __UxCR_RXREADY ) ) { sio_ierdy_rcv( siopcb->vpiExinf ) ; } }}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOL sio_snd_chr(SIOPCB *siopcb, char c){ UH uhBase ; /* * 铜跟なポ〖トかどうかのチェック */ if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB || siopcb->bNotExist || !siopcb->bOpened ) return FALSE ; uhBase = siopcb->uhBase ; /* * 流慨材墙かどうかのチェック */ if ( ! ( __SFR(uhBase) & __UxCR_TXEMPTY ) ) return FALSE ; /* * 流慨デ〖タの今き哈み */ __SFRW(uhBase+4) = __UxTX_STOPBIT | c ; return TRUE ;}/* * シリアルI/Oポ〖トからの矢机减慨 */INT sio_rcv_chr(SIOPCB *siopcb){ UH uhBase ; /* * 铜跟なポ〖トかどうかのチェック */ if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB || siopcb->bNotExist || !siopcb->bOpened ) return -1 ; uhBase = siopcb->uhBase ; /* * 减慨デ〖タ铜痰のチェック */ if ( ! ( __SFR(uhBase) & __UxCR_RXREADY ) ) return -1 ; /* * 减慨デ〖タの艰り叫し */ return __SFRW(uhBase+2) & 0xff ;}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */void sio_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ UH uhBase ; /* * 铜跟なポ〖トかどうかのチェック */ if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB || siopcb->bNotExist || !siopcb->bOpened ) return ; uhBase = siopcb->uhBase ; /* * 流慨充り哈みの钓材 */ if ( cbrtn == SIO_ERDY_SND ) { __SFR(uhBase) |= __UxCR_TXIE ; siopcb->bTxIe = TRUE ; } /* * 减慨充り哈みの钓材 */ if ( cbrtn == SIO_ERDY_RCV ) { __SFR(uhBase) |= __UxCR_RXIE ; siopcb->bRxIe = TRUE ; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */void sio_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ UH uhBase ; /* * 铜跟なポ〖トかどうかのチェック */ if ( !siopcb || siopcb->uhMagic != MAGIC_SIOPCB || siopcb->bNotExist || !siopcb->bOpened ) return ; uhBase = siopcb->uhBase ; /* * 流慨充り哈みの敦贿 */ if ( cbrtn == SIO_ERDY_SND ) { __SFR(uhBase) &= ~__UxCR_TXIE ; siopcb->bTxIe = FALSE ; } /* * 减慨充り哈みの敦贿 */ if ( cbrtn == SIO_ERDY_RCV ) { __SFR(uhBase) &= ~__UxCR_RXIE ; siopcb->bRxIe = FALSE ; }}/* * デフォルトの流慨材墙コ〖ルバック */void sio_ierdy_snd(VP_INT exinf) __attribute__((__weak__)) ;void sio_ierdy_snd(VP_INT exinf){}/* * デフォルトの减慨奶梦コ〖ルバック */void sio_ierdy_rcv(VP_INT exinf) __attribute__((__weak__)) ;void sio_ierdy_rcv(VP_INT exinf){}/* * シリアルI/Oポ〖トへの润票袋矢机叫蜗 */void sio_asnd_chr( INT c ){ SIOPCB* siopcb ; UH uhBase ; int i ; /* * CPUロック觉轮にする */ BOOL bLocked ; if ( sns_loc() ) bLocked = TRUE ; else { bLocked = FALSE ; if ( sns_ctx() ) iloc_cpu() ; else loc_cpu() ; } /* * 润票袋脱ポ〖トを倡く */ if ( ( siopcb = sio_opn_por( LOGTASK_PORTID, siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) { uhBase = siopcb->uhBase ; /* * LFならまずCRを流叫 */ if ( c == '\n' ) { for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) { if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ; } if ( i < TXREADY_TIMEOUT ) { __SFRW(uhBase+4) = __UxTX_STOPBIT | '\r' ; } } /* * デ〖タ流叫 */ for ( i = 0 ; i < TXREADY_TIMEOUT ; i++ ) { if ( __SFR(uhBase) & __UxCR_TXEMPTY ) break ; } if ( i < TXREADY_TIMEOUT ) { __SFRW(uhBase+4) = __UxTX_STOPBIT | c ; } } /* * CPUロックを傅に提す */ if ( !bLocked ) { if ( sns_ctx() ) iunl_cpu() ; else unl_cpu() ; }}/* * シリアルI/Oポ〖トからの润票袋矢机掐蜗 */INT sio_arcv_chr( void ){ SIOPCB* siopcb ; UH uhBase ; INT c = -1 ; /* * タスクコンテキストからのみ蝗脱材 */ if ( sns_ctx() || sns_loc() || sns_dsp() ) return -1 ; /* * CPUロック觉轮にする */ loc_cpu() ; /* * 润票袋脱ポ〖トを倡く */ if ( ( siopcb = sio_opn_por( LOGTASK_PORTID, siopcb_table[LOGTASK_PORTID-1].vpiExinf ) ) != NULL ) { uhBase = siopcb->uhBase ; /* * 减慨略ち */ while(1) { if ( __SFR(uhBase) & __UxCR_RXREADY ) { c = __SFRW(uhBase+2) & 0xff ; if ( c == '\r' ) { c = '\n' ; siopcb->bLastIsCr = TRUE ; } else { if ( c == '\n' && siopcb->bLastIsCr ) c = -1 ; siopcb->bLastIsCr = FALSE ; } } if ( c != -1 ) break ; unl_cpu() ; dly_tsk( 50 ) ; loc_cpu() ; } } /* * CPUロックを豺近 */ unl_cpu() ; return c ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -