📄 sci_int.c
字号:
/*""FILE COMMENT""************************************************************** System Name : RENESAS T-Engine/micro T-Engine* File Name : sci_int.c* Version : 1.00.00* Contents : Interrupt Handling* Model : SH7145 micro T-Engine* CPU : SH7145F* Compiler : GNU/Renesas SH-C* OS : T-Kernel* note : The Software is being delivered to you "AS IS" * : and Renesas,whether explicitly or implicitly makes * : no warranty as to its Use or performance. * : RENESAS AND ITS SUPPLIER DO NOT AND CANNOT WARRANT * : THE PERFORMANCE OR RESULTS YOU MAY OBTAIN BY USING * : THE SOFTWARE. AS TO ANY MATTER INCLUDING WITHOUT * : LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS,* : MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, * : OR FITNESS FOR ANY PARTICULAR PURPOSE.** Copyright (c) 2005 RENESAS TECHNOLOGY CORP. All Rights Reserved.* AND RENESAS SOLUTIONS CORP. All Rights Reserved.* history : 2005.01.11 ver1.00.00*""FILE COMMENT END""*********************************************************/#include "sci_common.h"#include "sci_cpudef.h"IMPORT SCI_STAT *sci_stat;LOCAL void sci_rxi_main(INT port);LOCAL void sci_txi_main(INT port);LOCAL void sci_eri_main(INT port);/*""FUNC COMMENT""******************************************************* * ID : * Outline : Interrupt entry function for "PORT" *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : sci_rxi0(UINT) *----------------------------------------------------------------------- * Function : Interrupt entry function for "PORT" *----------------------------------------------------------------------- * Argument : UINT dintno *----------------------------------------------------------------------- * Return : None *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : sci_rxi_main() * : sci_txi_main() * : sci_eri_main() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/LOCAL void sci_rxi0(UINT dintno) { sci_rxi_main(0); }LOCAL void sci_txi0(UINT dintno) { sci_txi_main(0); }LOCAL void sci_eri0(UINT dintno) { sci_eri_main(0); }LOCAL void sci_rxi1(UINT dintno) { sci_rxi_main(1); }LOCAL void sci_txi1(UINT dintno) { sci_txi_main(1); }LOCAL void sci_eri1(UINT dintno) { sci_eri_main(1); }LOCAL void sci_rxi2(UINT dintno) { sci_rxi_main(2); }LOCAL void sci_txi2(UINT dintno) { sci_txi_main(2); }LOCAL void sci_eri2(UINT dintno) { sci_eri_main(2); }LOCAL void sci_rxi3(UINT dintno) { sci_rxi_main(3); }LOCAL void sci_txi3(UINT dintno) { sci_txi_main(3); }LOCAL void sci_eri3(UINT dintno) { sci_eri_main(3); }/*""FUNC COMMENT""******************************************************* * ID : * Outline : Receive interrupt handler *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : void sci_rxi_main(INT) *----------------------------------------------------------------------- * Function : Handling receive interrupt *----------------------------------------------------------------------- * Argument : INT port *----------------------------------------------------------------------- * Return : None *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : put_buf() * : tk_wup_tsk() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/LOCAL void sci_rxi_main(INT port){ UB c; SCI_STAT *stat; { // for buggy KPIT VP adr; adr = (VP)&sci_stat; stat = (SCI_STAT*)adr; stat += port; } c = REG_RDR(port); put_buf(&(stat->rcv), &c, 1); if ((stat->rwait_tid > 0) && (-- stat->rwait_cnt <= 0)) { tk_wup_tsk(stat->rwait_tid); stat->rwait_tid = 0; } REG_SSR(port) &= ~SSR_RDRF;}/*""FUNC COMMENT""******************************************************* * ID : * Outline : Transmit interrupt handler *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : void sci_txi_main(INT) *----------------------------------------------------------------------- * Function : Handling transmit interrupt *----------------------------------------------------------------------- * Argument : INT port *----------------------------------------------------------------------- * Return : None *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : get_buf() * : tk_wup_tsk() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/LOCAL void sci_txi_main(INT port){ UB c; INT size; SCI_STAT *stat; { // for buggy KPIT VP adr; adr = (VP)&sci_stat; stat = (SCI_STAT*)adr; stat += port; } size = get_buf(&(stat->snd), &c, 1); if ((-- stat->wwait_cnt < 0) || (size <= 0)) { REG_SCR(port) &= ~SCR_TIE; while (! (REG_SSR(port) & SSR_TEND)); tk_wup_tsk(stat->wwait_tid); goto EXIT; } while (! (REG_SSR(port) & SSR_TDRE)); REG_TDR(port) = c; REG_SSR(port) &= ~SSR_TDRE; EXIT: return;}/*""FUNC COMMENT""******************************************************* * ID : * Outline : Receive error interrupt handler *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : void sci_eri_main(INT) *----------------------------------------------------------------------- * Function : Handling receive error interrupt(clear error bit) *----------------------------------------------------------------------- * Argument : INT port *----------------------------------------------------------------------- * Return : None *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : None *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/LOCAL void sci_eri_main(INT port){ REG_SSR(port) &= ~(SSR_ORER | SSR_PER | SSR_FER);}/*""FUNC COMMENT""******************************************************* * ID : * Outline : enable SCI interrupt by port *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : void set_inthdr(INT) *----------------------------------------------------------------------- * Function : Define interrupt handler and set port *----------------------------------------------------------------------- * Argument : INT port *----------------------------------------------------------------------- * Return : error code *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : tk_def_int() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/EXPORT ER set_inthdr(INT port){ T_DINT cint_rxi, cint_txi, cint_eri; cint_rxi.intatr = TA_HLNG; cint_txi.intatr = TA_HLNG; cint_eri.intatr = TA_HLNG; switch (port) { case 0: cint_rxi.inthdr = (FP)sci_rxi0; cint_txi.inthdr = (FP)sci_txi0; cint_eri.inthdr = (FP)sci_eri0; break; case 1: cint_rxi.inthdr = (FP)sci_rxi1; cint_txi.inthdr = (FP)sci_txi1; cint_eri.inthdr = (FP)sci_eri1; break; case 2: cint_rxi.inthdr = (FP)sci_rxi2; cint_txi.inthdr = (FP)sci_txi2; cint_eri.inthdr = (FP)sci_eri2; break; case 3: cint_rxi.inthdr = (FP)sci_rxi3; cint_txi.inthdr = (FP)sci_txi3; cint_eri.inthdr = (FP)sci_eri3; break; } tk_def_int(INT_RXI(port), &cint_rxi); tk_def_int(INT_TXI(port), &cint_txi); tk_def_int(INT_ERI(port), &cint_eri); SET_INTLV(port, SCI_INT_LEVEL); REG_SCR(port) |= SCR_RIE; return E_OK;} /*""FUNC COMMENT""******************************************************* * ID : * Outline : disable SCI interrupt by port *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : void clear_inthdr(INT) *----------------------------------------------------------------------- * Function : Disable interrupt handler and clear port *----------------------------------------------------------------------- * Argument : INT port *----------------------------------------------------------------------- * Return : error code *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : tk_def_int() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/EXPORT ER clear_inthdr(INT port){ REG_SCR(port) &= ~SCR_RIE; SET_INTLV(port, 0); tk_def_int(INT_ERI(port), NULL); tk_def_int(INT_TXI(port), NULL); tk_def_int(INT_RXI(port), NULL); return E_OK;}/*""FUNC COMMENT""******************************************************* * ID : * Outline : start writing data *----------------------------------------------------------------------- * Include : sci_common.h *----------------------------------------------------------------------- * Definition : ER write_start(INT port, INT size, TMO tmout) *----------------------------------------------------------------------- * Function : start writing data *----------------------------------------------------------------------- * Argument : INT port * : INT size * : TMO tmout *----------------------------------------------------------------------- * Return : error code *----------------------------------------------------------------------- * Input : None * Output : None *----------------------------------------------------------------------- * Used Func : tk_get_tid() * : tk_dis_dsp() * : sci_txi_main() * : tk_slp_tsk() *----------------------------------------------------------------------- * Notice : None *""FUNC COMMENT END""***************************************************/EXPORT ER write_start(INT port, INT size, TMO tmout){ ER ercd; UINT intsts; SCI_STAT *stat; ercd = tk_get_tid(); if (ercd <= 0) goto EXIT; { // for buggy KPIT VP adr; adr = (VP)&sci_stat; stat = (SCI_STAT*)adr; stat += port; } stat->wwait_tid = ercd; stat->wwait_cnt = size; tk_dis_dsp(); DI(intsts); REG_SCR(port) |= SCR_TIE; sci_txi_main(port); EI(intsts); tk_ena_dsp(); ercd = tk_slp_tsk(tmout); if (ercd != E_OK) { stat->wwait_cnt = 0; } EXIT: return ercd;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -