⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci_int.c

📁 T-Kernel Driver Sample
💻 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 + -