📄 h8s_sci.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering * Tomakomai National College of Technology, JAPAN * Copyright (C) 2001-2004 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 <h8s_sci.h>/* * H8S柒垄SCI脱 词白SIOドライバ * ˇ布淡は、2チャンネル脱に淡揭している。H8Sシリ〖ズの面には、2チャンネル * 笆惧サポ〖トしているチップもあるが、そのときの滦炳は推白である。 *//* TNUM_SIOP : サポ〖トするシリアルポ〖トの眶 (デフォルト猛 2) TNUM_PORT : サポ〖トするシリアルI/Oポ〖トの眶 (デフォルト猛 2) (sys_config.h に淡很) *//* 笆布で、レジスタのアドレスを、UW 房へキャストをしている。これは、ベ〖ス アドレスにオフセット猛を裁えて、呵姜弄なレジスタのアドレスを滇めている ためである。艰评稿に、呵姜弄に VP 房にキャストされている。(h8s_sci.h) *//* * シリアルI/Oポ〖ト介袋步ブロックの年盗 */typedef struct sio_port_initialization_block { UW reg_base; /* レジスタのベ〖スアドレス */ UB smr_def; /* SMR 肋年猛 b6-b3; (流减慨ビット眶、ストップビット·パリティ) */ UB boud_brr_def; /* BRR 肋年猛∈ボ〖レ〖トの肋年猛∷ */} SIOPINIB;/* * シリアルI/Oポ〖ト瓷妄ブロックの年盗 */struct sio_port_control_block { const SIOPINIB *siopinib; /* シリアルI/Oポ〖ト介袋步ブロック */ VP_INT exinf; /* 橙磨攫鼠 */ BOOL openflag; /* オ〖プン貉みフラグ */ BOOL getready; /* 矢机を减慨した觉轮 */ BOOL putready; /* 矢机を流慨できる觉轮 */};/* * シリアルI/Oポ〖ト介袋步ブロック */const SIOPINIB siopinib_table[TNUM_SIOP] = { { (UW) SCI0_BASE_ADDR, (UB) 0, (UB) BRR_RATE /* N 猛 */ },#if TNUM_SIOP >= 2 { (UW) SCI1_BASE_ADDR, (UB) 0, (UB) BRR_RATE /* N 猛 */ }#endif /* TNUM_SIOP >= 2 */};/* * シリアル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)]))/* * SCI脱レジスタ拎侯簇眶 */Inline voidh8s_sci_or( const SIOPINIB *siopinib, UW reg, UB val ){ h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) | val );}Inline voidh8s_sci_and( const SIOPINIB *siopinib, UW reg, UB val ){ h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) & val );}/* * 矢机を减慨できるか々 */Inline BOOLh8s_sci_getready(SIOPCB *siopcb){ siopcb->getready = FALSE; if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & RDRF ) siopcb->getready = TRUE; return( siopcb->getready );}/* * 矢机を流慨できるか々 */Inline BOOLh8s_sci_putready(SIOPCB *siopcb){ siopcb->putready = FALSE; if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TDRE ) siopcb->putready = TRUE; return( siopcb->putready );}/* * 减慨した矢机の艰叫し */Inline charh8s_sci_getchar(SIOPCB *siopcb){ /* RDRFクリア */ h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~RDRF ); return( (char) h8s_sci_reb( siopcb->siopinib->reg_base, (UW) RDR ) );}/* * 流慨する矢机の今哈み */Inline voidh8s_sci_putchar(SIOPCB *siopcb, char c){#ifndef GDB_STUB h8s_sci_wrb( siopcb->siopinib->reg_base, (UW) TDR, c ); /* TDREクリア */ h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~TDRE );#else stub_putc( c );#endif}/* * SIOドライバの介袋步ル〖チン */voidh8s_sci_initialize(){ SIOPCB *siopcb; UINT i; /* * シリアルI/Oポ〖ト瓷妄ブロックの介袋步 */ for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { siopcb->siopinib = &(siopinib_table[i]); siopcb->openflag = FALSE; }}/* * SIOレジスタ介袋步ル〖チン */voidh8s_sci_init_siopinib( const SIOPINIB *siopinib ){ /* * SCIレジスタの介袋步 */ /* 流减慨匿贿 */ h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TE | RE ) ); /* ビット墓など肋年 */ h8s_sci_wrb( siopinib->reg_base, (UW) SMR, siopinib->smr_def ); /* ボ〖レ〖ト肋年 */ h8s_sci_wrb( siopinib->reg_base, (UW) BRR, siopinib->boud_brr_def ); /* 充哈み敦贿とクロックソ〖ス联买 */ h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TIE | RIE | MPIE | TEIE | CKE1 | CKE0 ) ); /* ボ〖レ〖トの奥年步(1bit尸の略ち) */ sil_dly_nse( 1/BAUD_RATE ); /* エラ〖フラグをクリア */ h8s_sci_and( siopinib, (UW) SSR, ~( ORER | FER | PER ) ); /* 流减慨钓材、减慨充哈み钓材 */ h8s_sci_or( siopinib, (UW) SCR, ( RIE | TE | RE ) );}/* * カ〖ネル弹瓢箕のバ〖ナ〖叫蜗脱の介袋步 */voidh8s_sci_init(void){ h8s_sci_init_siopinib( get_siopinib(1) );#if TNUM_SIOP >= 2 h8s_sci_init_siopinib( get_siopinib(2) );#endif /* TNUM_SIOP >= 2 */}/* * オ〖プンしているポ〖トがあるか々 */BOOLh8s_sci_openflag(void){#if TNUM_SIOP < 2 return( siopcb_table[0].openflag );#else /* TNUM_SIOP < 2 */ return( siopcb_table[0].openflag || siopcb_table[1].openflag );#endif /* TNUM_SIOP < 2 */}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *h8s_sci_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb = get_siopcb(siopid); const SIOPINIB *siopinib = siopcb->siopinib;#ifndef GDB_STUB /* SCIレジスタの介袋步 */ h8s_sci_init_siopinib( siopinib );#endif /* GDB_STUB */ /* 充哈みレベル肋年、充哈み妥滇クリアは、sio_opn_por で乖う。 */ siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidh8s_sci_cls_por(SIOPCB *siopcb){ /* TEND が 1 になるまで略つ */ while ( !(h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TEND ) ); h8s_sci_and( siopcb->siopinib, (UW) SCR, ~( TE | RE ) ); siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLh8s_sci_snd_chr(SIOPCB *siopcb, char c){ if( h8s_sci_putready(siopcb) ) { h8s_sci_putchar(siopcb, c); siopcb->putready = FALSE; return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTh8s_sci_rcv_chr(SIOPCB *siopcb){ if( h8s_sci_getready(siopcb) ) { siopcb->getready = FALSE; return( (INT)(UB) h8s_sci_getchar(siopcb) ); /* UB のキャストは、射规橙磨松贿するため */ } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidh8s_sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: h8s_sci_or( siopcb->siopinib, (UW) SCR, TIE ); return; case SIO_ERDY_RCV: h8s_sci_or( siopcb->siopinib, (UW) SCR, RIE ); return; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidh8s_sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch( cbrtn ) { case SIO_ERDY_SND: h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~TIE ); return; case SIO_ERDY_RCV: h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~RIE ); return; }}/* * SIOの充哈みサ〖ビスル〖チン (SCI0漓脱) */voidh8s_sci0_isr_in(){ SIOPCB *siopcb = get_siopcb(1); /* 减慨奶梦コ〖ルバックル〖チンの钙び叫し */ if( siopcb->openflag ) { h8s_sci_ierdy_rcv( siopcb->exinf ); }}voidh8s_sci0_isr_out(){ SIOPCB *siopcb = get_siopcb(1); /* 流慨材墙コ〖ルバックル〖チンの钙び叫し */ if( siopcb->openflag ) { h8s_sci_ierdy_snd( siopcb->exinf ); }}/* * SIOの减慨エラ〖充哈みサ〖ビスル〖チン (SCI0漓脱) * * エラ〖借妄は、布淡エラ〖フラグのクリアのみ。 * ˇオ〖バ〖ランエラ〖、フレ〖ミングエラ〖、パリティエラ〖 */voidh8s_sci0_isr_error(void){ SIOPCB *siopcb = get_siopcb(1); if( siopcb->openflag ) { /* エラ〖フラグクリア */ h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) ); }}/* * SIOの充哈みサ〖ビスル〖チン (SCI1漓脱) */voidh8s_sci1_isr_in(){ SIOPCB *siopcb = get_siopcb(2); /* 减慨奶梦コ〖ルバックル〖チンの钙び叫し */ if( siopcb->openflag ) { h8s_sci_ierdy_rcv( siopcb->exinf ); }}voidh8s_sci1_isr_out(){ SIOPCB *siopcb = get_siopcb(2); /* 流慨材墙コ〖ルバックル〖チンの钙び叫し */ if( siopcb->openflag ) { h8s_sci_ierdy_snd( siopcb->exinf ); }}/* * SIOの减慨エラ〖充哈みサ〖ビスル〖チン (SCI1漓脱) * * エラ〖借妄は、布淡エラ〖フラグのクリアのみ。 * ˇオ〖バ〖ランエラ〖、フレ〖ミングエラ〖、パリティエラ〖 */voidh8s_sci1_isr_error(void){ SIOPCB *siopcb = get_siopcb(2); if( siopcb->openflag ) { /* エラ〖フラグクリア */ h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) ); }}/* * H8S 柒垄 SCI 脱ポ〖リング叫蜗 (LOGTASK_PORTID漓脱、sys_putcで网脱) */voidh8s_sci0_putchar_pol( char c ){ const SIOPINIB *siopinib = get_siopinib( LOGTASK_PORTID ); /* TDRE が 1 になるまで略つ */ while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TDRE ) ); h8s_sci_wrb( siopinib->reg_base, (UW) TDR, (UB) c ); /* TDREクリア */ h8s_sci_and( siopinib, (UW) SSR, (UB) ~TDRE ); /* TEND が 1 になるまで略つ */ while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TEND ) );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -