📄 sfruart.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) 2003-2004 by Platform Development Center * RICOH COMPANY,LTD. JAPAN * Copyright (C) 2003-2004 by Naoki Saito * Nagoya Municipal Industrial Research Institute, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: sfruart.c,v 1.4 2005/11/24 12:41:23 honda Exp $ *//* * OAKS32 UART脱シリアルI/Oモジュ〖ル */#include <s_services.h>#include "oaks32.h"#include <sfruart.h>/* * デバイスオ〖プンのリトライカウント * * 500搀リトライすれば、浇尸に姜位するˉ */#define SFRUART_COUNT 500/* * シリアルコントロ〖ルレジスタの肋年猛 */#define MR_DEF 0x05 /* 柒婶クロック、润票袋、8ビット、パリティなし、スリ〖プなし */#define MR_DISABLE_DEF 0x00 /* シリアルモジュ〖ル痰跟 */#define C0_DEF 0x10 /* RTS/CTS踏蝗脱, カウントソ〖スf1, 流慨充哈み妥傍は≈流慨バッファ鄂∽ */#define C1_DEF 0x00 /* シリアル流减慨敦贿 */#define BRG1_DEF 48 /* 30000000/{(UxBRG+1)*16} = 38400 */#define BRG2_DEF 97 /* 30000000/{(UxBRG+1)*16} = 19200 */#define TB_LEVEL 4 /* 流慨充哈みレベル */#define RB_LEVEL 5 /* 减慨充哈みレベル */#define DISABLE_LEVEL 0 /* 充哈み敦贿レベル *//* * シリアルI/Oポ〖ト介袋步ブロックの年盗 */typedef struct sio_port_initialization_block { UH cntrl_addr; /* 扩告レジスタの戎孟 */ UH tic_addr; /* 流慨充哈み扩告レジスタの戎孟 */ UH ric_addr; /* 减慨充哈み扩告レジスタの戎孟 */ UB mr_def; /* デフォルトの肋年猛 (MR) */ UB c0_def; /* デフォルトの肋年猛 (C0) */ UB brg_def; /* デフォルトの肋年猛 (BRG) */} SIOPINIB;/* * シリアルI/Oポ〖ト瓷妄ブロックの年盗 */typedef struct sio_port_control_block { const SIOPINIB *siopinib; /* シリアルI/Oポ〖ト介袋步ブロック */ VP_INT exinf; /* 橙磨攫鼠 */ UB uc1; /* 流减慨扩告レジスタUiC1の肋年猛 */};/* * シリアルI/Oポ〖ト介袋步ブロック * * ID = 1 をuart0·ID = 2 をuart1に滦炳させているˉ */static const SIOPINIB siopinib_table[TNUM_SIOP] = { { TADR_SFR_UART0_BASE, (TADR_SFR_INT_BASE+TADR_SFR_S0TIC_OFFSET), (TADR_SFR_INT_BASE+TADR_SFR_S0RIC_OFFSET), MR_DEF, C0_DEF, BRG1_DEF },#if TNUM_SIOP>1 { TADR_SFR_UART1_BASE, (TADR_SFR_INT_BASE+TADR_SFR_S1TIC_OFFSET), (TADR_SFR_INT_BASE+TADR_SFR_S1RIC_OFFSET), MR_DEF, C0_DEF, BRG1_DEF }#endif};/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */static SIOPCB siopcb_table[TNUM_SIOP];/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))/* * SIOドライバの介袋步ル〖チン */voidsfruart_initialize(void){ SIOPCB *siopcb; UINT i; /* * シリアルI/Oポ〖ト瓷妄ブロックの介袋步 */ for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { siopcb->siopinib = &(siopinib_table[i]); siopcb->uc1 = C1_DEF; /* * 汤绩弄にポ〖トを稍宠拉步しておく */ /* 充り哈み敦贿 */ sil_wrb_mem((VP)(siopcb->siopinib->tic_addr), DISABLE_LEVEL); sil_wrb_mem((VP)(siopcb->siopinib->ric_addr), DISABLE_LEVEL); /* 流减慨敦贿 */ sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); }}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *sfruart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; int i; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* 流减慨敦贿 */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET))&~(TBIT_UiC1_TE | TBIT_UiC1_RE)); /* ポ〖ト肋年(瓢侯モ〖ド、奶慨庐刨) */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), siopinib->mr_def); sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC0_OFFSET), siopinib->c0_def); sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UBRG_OFFSET), siopinib->brg_def); /* * シリアル充哈みの肋年 */ sil_wrb_mem((VP)(siopinib->tic_addr), TB_LEVEL); sil_wrb_mem((VP)(siopinib->ric_addr), RB_LEVEL); /* オ〖プン箕はコ〖ルバック敦贿 */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); /* * ダミ〖デ〖タ减慨 */ sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET)); sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET)); for(i = 0 ; i < SFRUART_COUNT ; i++){ /* オ〖プン箕流慨READYまで略ち */ if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI) break; } siopcb->exinf = exinf; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidsfruart_cls_por(SIOPCB *siopcb){ const SIOPINIB *siopinib; siopinib = siopcb->siopinib; /* 充り哈み敦贿 */ sil_wrb_mem((VP)(siopinib->tic_addr), DISABLE_LEVEL); sil_wrb_mem((VP)(siopinib->ric_addr), DISABLE_LEVEL); /* 流减慨敦贿 */ siopcb->uc1 = C1_DEF; sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); /* シリアルモジュ〖ルを痰跟にする */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), MR_DISABLE_DEF);}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLsfruart_snd_chr(SIOPCB *siopcb, char c){ if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI){ sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UTB_OFFSET), c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTsfruart_rcv_chr(SIOPCB *siopcb){ if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_RI){ return((INT)sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_URB_OFFSET))); } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsfruart_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: siopcb->uc1 |= TBIT_UiC1_TE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; case SIO_ERDY_RCV: siopcb->uc1 |= TBIT_UiC1_RE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; default: break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsfruart_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: siopcb->uc1 &= ~TBIT_UiC1_TE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; case SIO_ERDY_RCV: siopcb->uc1 &= ~TBIT_UiC1_RE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; default: break; }}/* * uart0からの减慨充哈み */void serial_in_handler1(void){ SIOPCB *siopcb = &siopcb_table[0]; if((siopcb->uc1 & TBIT_UiC1_RE) != 0) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ sfruart_ierdy_rcv(siopcb->exinf); }}/* * uart0からの流慨充哈み */void serial_out_handler1(void){ SIOPCB *siopcb = &siopcb_table[0]; if((siopcb->uc1 & TBIT_UiC1_TE) != 0) { /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ sfruart_ierdy_snd(siopcb->exinf); }}#if TNUM_SIOP > 1/* * uart1からの减慨充哈み */void serial_in_handler2(void){ SIOPCB *siopcb = &siopcb_table[1]; if((siopcb->uc1 & TBIT_UiC1_RE) != 0){ /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ sfruart_ierdy_rcv(siopcb->exinf); }}/* * uart1からの流慨充哈み */void serial_out_handler2(void){ SIOPCB *siopcb = &siopcb_table[1]; if((siopcb->uc1 & TBIT_UiC1_TE) != 0) { /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ sfruart_ierdy_snd(siopcb->exinf); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -