📄 vr4131_dsiu.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2000-2003 by Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ */ #include <vr4131_dsiu.h>/* * VR4131柒垄DSIU脱 词白SIOドライバ *//* * シリアルI/Oポ〖ト介袋步ブロックの年盗 */typedef struct sio_port_initialization_block { UB lcr_def; /* LCR肋年猛 b0-b6; (流减慨ビット眶、ストップビット·パリティ) */ UB boud_hi_def; /* DLM肋年猛∈ボ〖レ〖ト惧疤の肋年猛∷ */ UB boud_lo_def; /* DLL肋年猛∈ボ〖レ〖ト布疤の肋年猛∷ */} SIOPINIB;/* * シリアルI/Oポ〖ト瓷妄ブロックの年盗 */struct sio_port_control_block { const SIOPINIB *siopinib; /* シリアルI/Oポ〖ト介袋步ブロック */ VP_INT exinf; /* 橙磨攫鼠 */ BOOL openflag; /* オ〖プン貉みフラグ */ BOOL getready; /* 矢机を减慨した觉轮 */ BOOL putready; /* 矢机を流慨できる觉轮 */};/* * シリアルI/Oポ〖ト介袋步ブロック * ∈ポ〖トは1つしかないが、戮のソ〖スコ〖ドとの科下拉から芹误で年盗する∷ */const SIOPINIB siopinib_table[TNUM_SIOP] = { { (UB) WORD_LENGTH_8 | STOP_BITS_1 | PARITY_NON, (UB) HI8(DIVISOR), (UB) LO8(DIVISOR) }};/* * シリアルI/Oポ〖ト介袋步ブロックの艰叫し */#define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */SIOPCB siopcb_table[TNUM_SIOP];/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))/* * 觉轮の粕叫し∈IIDの粕叫し∷ */static voidvr4131_dsiu_get_stat(SIOPCB *siopcb){ UB iid; iid = vr4131_reb_mem( (VP) DSIUIID ) & INT_MASK; switch( iid ) { case INT_TRANS_EMPTY : siopcb->putready = TRUE; break; case INT_RECEIVE_DATA : case INT_CHAR_TIME_OUT : siopcb->getready = TRUE; break; default : break; }}/* * 矢机を减慨できるか々 */Inline BOOLvr4131_dsiu_getready(SIOPCB *siopcb){ return(siopcb->getready);}/* * 矢机を流慨できるか々 */Inline BOOLvr4131_dsiu_putready(SIOPCB *siopcb){ return(siopcb->putready);}/* * 减慨した矢机の艰叫し */Inline charvr4131_dsiu_getchar(SIOPCB *siopcb){ siopcb->getready = FALSE; return((char) vr4131_reb_mem( (VP) DSIURB ));}/* * 流慨する矢机の今哈み */Inline voidvr4131_dsiu_putchar(SIOPCB *siopcb, char c){ siopcb->putready = FALSE;#ifndef GDB_STUB vr4131_wrb_mem( (VP) DSIUTH, c );#else /* GDB_STUB */ stub_putc( c );#endif /* GDB_STUB */}/* * SIOドライバの介袋步ル〖チン */voidvr4131_dsiu_initialize(){ SIOPCB *siopcb = siopcb_table; UINT i = 0; /* * シリアルI/Oポ〖ト瓷妄ブロックの介袋步 */ siopcb->siopinib = &(siopinib_table[i]); siopcb->openflag = FALSE;}/* * SIOレジスタ介袋步ル〖チン */voidvr4131_dsiu_init_siopinib( const SIOPINIB *siopinib ){ /* * DSIUレジスタの介袋步 */ /* 介袋借妄 */ vr4131_wrb_mem( (VP) DSIUIE, DIS_INT ); /* ボ〖レ〖トの肋年 */ vr4131_wrb_mem( (VP) DSIULC, siopinib->lcr_def | DIVISOR_LATCH_ACC ); vr4131_wrb_mem( (VP) DSIUDLL, siopinib->boud_lo_def ); vr4131_wrb_mem( (VP) DSIUDLM, siopinib->boud_hi_def ); /* モ〖ドの肋年 */ vr4131_wrb_mem( (VP) DSIULC, siopinib->lcr_def ); /* FIFOの肋年 */ vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE ); vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE | RECEIVE_FIFO_RESET | TRANS_FIFO_RESET | RECEIVE_TRIG_1_BYTE ); vr4131_wrb_mem( (VP) DSIUFC, FIFO_ENABLE | RECEIVE_TRIG_1_BYTE ); /* 姜位借妄 */ vr4131_wrb_mem( (VP) DSIUMC, RTS ); vr4131_wrb_mem( (VP) DSIUIE, RECEIVE_DATA_AVAILABLE);}/* * カ〖ネル弹瓢箕のバ〖ナ〖叫蜗脱の介袋步 */voidvr4131_dsiu_init(void){ vr4131_dsiu_init_siopinib( get_siopinib(1) );}/* * オ〖プンしているポ〖トがあるか々 */BOOLvr4131_dsiu_openflag(void){ return( siopcb_table[0].openflag );}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *vr4131_dsiu_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb = get_siopcb(siopid); const SIOPINIB *siopinib = siopcb->siopinib;#ifndef GDB_STUB /* DSIUレジスタの介袋步 */ vr4131_dsiu_init_siopinib( siopinib );#endif /* GDB_STUB */ /* 充哈みレベル肋年、充哈み妥滇クリアは、sio_opn_por(hw_serial.h)で乖う。 */ siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidvr4131_dsiu_cls_por(SIOPCB *siopcb){ vr4131_wrb_mem( (VP) DSIUIE, DIS_INT ); siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLvr4131_dsiu_snd_chr(SIOPCB *siopcb, char c){ if (vr4131_dsiu_putready(siopcb)) { vr4131_dsiu_putchar(siopcb, c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTvr4131_dsiu_rcv_chr(SIOPCB *siopcb){ if (vr4131_dsiu_getready(siopcb)) { return((INT)(UB) vr4131_dsiu_getchar(siopcb)); } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidvr4131_dsiu_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ UB ie_bit = 0; switch (cbrtn) { case SIO_ERDY_SND: ie_bit = TRANS_REG_EMPTY; break; case SIO_ERDY_RCV: ie_bit = RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS; break; } vr4131_orb( (VP) DSIUIE, ie_bit );}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidvr4131_dsiu_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ UB ie_bit = 0; switch (cbrtn) { case SIO_ERDY_SND: ie_bit = TRANS_REG_EMPTY; break; case SIO_ERDY_RCV: ie_bit = RECEIVE_DATA_AVAILABLE | RECEIVE_LINE_STATUS; break; } vr4131_andb( (VP) DSIUIE, ~ie_bit );}/* * シリアルI/Oポ〖トに滦する充哈み借妄 */static voidvr4131_dsiu_isr_siop(SIOPCB *siopcb){ vr4131_dsiu_get_stat(siopcb); if ( vr4131_dsiu_getready(siopcb) ) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ vr4131_dsiu_ierdy_rcv(siopcb->exinf); } if ( vr4131_dsiu_putready(siopcb) ) { /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ vr4131_dsiu_ierdy_snd(siopcb->exinf); }}/* * SIOの充哈みサ〖ビスル〖チン */voidvr4131_dsiu_isr(){ if (siopcb_table[0].openflag) { vr4131_dsiu_isr_siop(&(siopcb_table[0])); }}/* * VR4131 柒垄 DSIU 脱ポ〖リング叫蜗 (sys_putcで网脱) */voidvr4131_dsiu_putchar_pol( char val ) { /* 流慨婶エンプティになるまで略つ。 */ while( (vr4131_reb_mem( (VP)DSIULS ) & (TEMT) ) == 0 ); vr4131_wrb_mem( (VP)DSIUTH, (VB) val );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -