📄 hw_serial.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 Industrial Technology Institute, * Miyagi Prefectural Government, JAPAN * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering * Tomakomai National College of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: hw_serial.c,v 1.6 2005/11/13 14:05:01 honda Exp $ *//* * タ〖ゲット巴赂シリアルI/Oモジュ〖ル∈H8脱∷ * ˇポ〖トが 1塑の眷圭は HWPORT1_ADDRに回年されたポ〖トを蝗脱し、 * 2塑の眷圭は、HWPORT1_ADDRをユ〖ザ脱、HWPORT2_ADDRをコンソ〖ル * 叫蜗として蝗脱する。 * HWPORTx_ADDRは タ〖ゲット巴赂の sys_config.h面で回年する。 * ˇ鼎奶婶のモジュ〖ルによって、XON/XOFFフロ〖扩告が乖わ * れているので、慨规俐はTxDとRxDの2塑でよい */#include "jsp_kernel.h"#include <hw_serial.h>/* * シリアルポ〖トの介袋步ブロック */const SIOPINIB siopinib_table[TNUM_PORT] = { { (UB*)SCI_PORT1_BASE, SCI_PORT1_BAUD_RATE, SCI_PORT1_SMR, { (UB*)SCI_PORT1_IPR, SCI_PORT1_IPR_BIT, SCI_PORT1_IPM } }#if TNUM_PORT == 2u ,{ (UB*)SCI_PORT2_BASE, SCI_PORT2_BAUD_RATE, SCI_PORT2_SMR, { (UB*)SCI_PORT2_IPR, SCI_PORT2_IPR_BIT, SCI_PORT2_IPM } }#endif /* of #if TNUM_PORT == 2u */};/* * シリアルポ〖トの扩告ブロック */SIOPCB siopcb_table[TNUM_PORT];/* * SIO ID から瓷妄ブロックへの恃垂 */Inline SIOPINIB *get_siopinib(ID sioid);Inline SIOPINIB*get_siopinib(ID sioid){ UINT index = INDEX_SIO(sioid); assert(index < TNUM_PORT); return(&(siopinib_table[index]));}/* * ボ〖レ〖トからBRRレジスタの肋年猛への恃垂 * 遍换の庞面でオ〖バ〖フロ〖しないようUW房を脱いている */Inline UB baud_to_brr(UW baud);Inline UB baud_to_brr(UW baud){ UB brr; if (baud > 38400ul) { brr = (UB)(((CPU_CLOCK+(16ul*baud)) / (32ul*baud))-1ul); } else { brr = (UB)((CPU_CLOCK / (32ul*baud))-1ul); } return brr;}/* * ボ〖レ〖ト肋年稿の略ち箕粗[nsec]を滇めるマクロ * 遍换の庞面でオ〖バ〖フロ〖しないようUW房にキャストしている */#define SCI_SETUP_TIME(b) (((1000000ul / (b)) + 1ul) * 1000ul)/* * SCI の介袋步 */voidSCI_initialize (ID sioid){ const SIOPINIB *inib = get_siopinib(sioid); assert(inib != (SIOPINIB*)NULL); SCI_cls_por(inib->base); sil_wrb_mem((VP)(inib->base + H8SMR), (VB)(inib->smr_init)); /* ボ〖レ〖ト肋年 */ sil_wrb_mem((VP)(inib->base + H8BRR), (VB)baud_to_brr(inib->baudrate)); /* 充哈み敦贿とクロックソ〖スの联买 */ h8_anb_reg(inib->base + H8SCR, (UB)~(H8SCR_TIE | H8SCR_RIE | H8SCR_MPIE | H8SCR_TEIE | H8SCR_CKE1 | H8SCR_CKE0 )); /* ボ〖レ〖トの肋年稿、1ビット尸略たなければならない。*/ sil_dly_nse_long(SCI_SETUP_TIME(inib->baudrate)); /* エラ〖フラグをクリア */ h8_anb_reg(inib->base + H8SSR, (UB)~(H8SSR_ORER | H8SSR_FER | H8SSR_PER)); /* * プライオリティレベルの肋年 * 塑碰は充哈みコントロ〖ラ巴赂婶尸を尸违すべき */ define_int_plevel(&(inib->irc)); /* 减慨充り哈みと流慨充哈みの钓材はシリアル I/O で乖う */ /* 流减慨钓材 */ h8_orb_reg(inib->base + H8SCR, (UB)(H8SCR_TE | H8SCR_RE));}/* * SCI のクロ〖ズ */voidSCI_cls_por (UB *base){ UB ssr; /* TDRE が 1 になるまで略つ */ do { ssr = sil_reb_mem((VP)(base + H8SSR)); ssr &= H8SSR_TDRE; } while(ssr == 0u); /* 11ビット流慨尸略つ。*/ /* * 妥浮皮¨腆1.2msec鄂搀りするので、戮の借妄にCPUを * 均った数が评忽だが、润タスクコンテキストで * 钙ばれる材墙拉があるので、そのままにしている。 */ sil_dly_nse_long(SCI_SETUP_TIME(H8_MIN_BAUD_RATE)*11ul); /* 流减慨匿贿 */ h8_anb_reg(base + H8SCR, (UB)(~(H8SCR_TIE | H8SCR_RIE | H8SCR_TE | H8SCR_RE))); }/* * SCI_in_handler -- SCI 掐蜗充哈みハンドラ */voidSCI_in_handler(ID sioid){ SIOPCB *pcb = get_siopcb(sioid); UB status = sil_reb_mem((VP)(pcb->inib->base + H8SSR)); UB flag = (UB)(status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)); if (flag != 0) { /* エラ〖借妄 */ /* エラ〖フラグをクリア */ sil_wrb_mem((VP)(pcb->inib->base + H8SSR), (VB)(status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER))); } flag = (UB)(status & H8SSR_RDRF); if (flag != 0) { if (pcb->openflag == TRUE) { /* 减慨材墙コ〖ルバックル〖チンを钙叫す。*/ SCI_ierdy_rcv(pcb->exinf); } else { sil_wrb_mem((VP)(pcb->inib->base + H8SSR), (VB)(status & ~H8SSR_RDRF)); } }}/* * SCI_out_handler -- SCI 叫蜗充哈みハンドラ */voidSCI_out_handler(ID sioid){ SIOPCB *pcb; pcb = get_siopcb(sioid); if (pcb->openflag == TRUE) { /* 流慨材墙コ〖ルバックル〖チンを钙叫す。*/ SCI_ierdy_snd(pcb->exinf); }}#ifdef H8_CFG_SCI_ERR_HANDLER/* * SCI_err_handler -- SCI エラ〖掐蜗充哈みハンドラ */voidSCI_err_handler(ID sioid){ SIOPCB *pcb; UB status; pcb = get_siopcb(sioid); status = sil_reb_mem((VP)(pcb->inib->base + H8SSR)); if (status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)) { /* エラ〖借妄 */ /* エラ〖フラグをクリア */ sil_wrb_mem((VP)(pcb->inib->base + H8SSR), status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER)); }}#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER *//* * sio_initialize -- シリアルポ〖トドライバの介袋步 */voidsio_initialize(void){ INT ix; /* SIO 瓷妄ブロックの介袋步 */ for (ix = 0; ix < TNUM_PORT; ix++) { siopcb_table[ix].inib = &siopinib_table[ix]; siopcb_table[ix].openflag = FALSE; }}/* * sio_ena_cbr -- シリアル I/O からのコ〖ルバックの钓材 */voidsio_ena_cbr(SIOPCB *pcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: SCI_enable_send(pcb); break; case SIO_ERDY_RCV: SCI_enable_recv(pcb); break; default: assert(FALSE); }}/* * sio_dis_cbr -- シリアル I/O からのコ〖ルバックの敦贿 */voidsio_dis_cbr(SIOPCB *pcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: SCI_disable_send(pcb); break; case SIO_ERDY_RCV: SCI_disable_recv(pcb); break; default: assert(FALSE); }}/* * SCI 充り哈み */voidsio_in_handler (void){ SCI_in_handler(SCI_PORTID1);}voidsio_out_handler (void){ SCI_out_handler(SCI_PORTID1);}#ifdef H8_CFG_SCI_ERR_HANDLERvoidsio_err_handler (void){ SCI_err_handler(SCI_PORTID1);}#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */#if TNUM_PORT >= 2uvoidsio_in2_handler (void){ SCI_in_handler(SCI_PORTID2);}voidsio_out2_handler (void){ SCI_out_handler(SCI_PORTID2);}#ifdef H8_CFG_SCI_ERR_HANDLERvoidsio_err2_handler (void){ SCI_err_handler(SCI_PORTID2);}#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */#endif /* of #if TNUM_PORT >= 2u */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -