📄 ns9360.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) 2005-2007 by Y.D.K.Co.,LTD Technologies company * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: ns9360.c,v 1.2 2007/05/21 01:33:50 honda Exp $ *//* * 柒婶怠墙脱ドライバ */#include <s_services.h>#include <ns9360.h>/* * 柒婶UART脱 词白SIOドライバ *//* * シリアルI/Oポ〖ト介袋步ブロック */const SIOPINIB siopinib_table[TNUM_SIOP] = { { /* UART Channel A */ (VP)SC1SRA_REG , (VP)SC1FIFO_REG , (VP)SC1CRA_REG , (VP)SC1CRB_REG ,(VP)SC1RCT_REG , (VP)SC1RBT_REG , (VP)SC1BRG_REG ,(SCCRA_CE | SCCRA_WLS | SCCRA_DTR | SCCRA_RTS) ,0x08000000 ,0x80000008 ,0x80000008 ,(0xC0140000 | 7) /* 29.4912MHz /2/8 = 115200*16 */ ,BBBI_S1TX , BBBI_S1RX }#if TNUM_SIOP >= 2 , { /* UART Channel C */ (VP)SC3SRA_REG , (VP)SC3FIFO_REG , (VP)SC3CRA_REG , (VP)SC3CRB_REG ,(VP)SC3RCT_REG ,(VP)SC3RBT_REG , (VP)SC3BRG_REG ,(SCCRA_CE | SCCRA_WLS | SCCRA_DTR | SCCRA_RTS) ,0x08000000 ,0x80000008 ,0x80000008 ,(0xC0140000 | 7) /* 29.4912MHz /2/8 = 115200*16 */ ,BBBI_S3TX , BBBI_S3RX }#endif };/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */SIOPCB siopcb_table[TNUM_SIOP];/* * システム叫蜗脱シリアルポ〖ト攫鼠 */SIOPCB *sys_siopcb;/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))/* * 矢机を减慨したか? */ Inline BOOLuart_getready(SIOPCB *siopcb){ VW dt; if(0 != siopcb->rxfdb) return TRUE; dt = sil_rew_mem((VP)siopcb->siopinib->pSraReg); return(dt &(SCSRA_RFS | SCSRA_RRDY));}/* * 矢机を流慨できるか? */Inline BOOLuart_putready(SIOPCB *siopcb){ return(sil_rew_mem((VP)siopcb->siopinib->pSraReg)&(SCSRA_TRDY | SCSRA_THALF | SCSRA_TEMPTY));}/* * 减慨した矢机の艰り叫し */Inline UBuart_getchar(SIOPCB *siopcb){ UW dt; if(0 == siopcb->rxfdb) { siopcb->rxfdb = (sil_rew_mem((VP)siopcb->siopinib->pSraReg) >> 20) & 0x03; if(0 == siopcb->rxfdb) siopcb->rxfdb = 4; siopcb->rxbuf = sil_rew_mem((VP)siopcb->siopinib->pFifoReg); } --(siopcb->rxfdb); dt = (siopcb->rxbuf >> 24) & 0xff; siopcb->rxbuf <<= 8; return (UB)dt;}/* * 流慨する矢机の今き哈み */Inline voiduart_putchar(SIOPCB *siopcb, UB c){ sil_wrb_mem((VP)siopcb->siopinib->pFifoReg, (VB)c);}/* * 流慨充哈み钓材 */Inline voiduart_enable_send(SIOPCB *siopcb){ sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopcb->siopinib->BbbiTx);}/* * 流慨充哈み敦贿 */Inline voiduart_disable_send(SIOPCB *siopcb){ sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) & ~siopcb->siopinib->BbbiTx);}/* * 减慨充哈み钓材 */Inline voiduart_enable_rcv(SIOPCB *siopcb){ sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopcb->siopinib->BbbiRx);}/* * 减慨充哈み敦贿 */Inline voiduart_disable_rcv(SIOPCB *siopcb){ sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) & ~siopcb->siopinib->BbbiRx);}/* * カ〖ネル弹瓢箕のログ叫蜗脱の介袋步 */voiduart_init(ID siopid){ SIOPCB *siopcb; uart_initialize(); siopcb = get_siopcb(siopid); sys_siopcb = siopcb; /* UART Initialize */ sil_wrw_mem((VP)siopcb->siopinib->pCraReg,(VW)siopcb->siopinib->CraData); sil_wrw_mem((VP)siopcb->siopinib->pCrbReg,(VW)siopcb->siopinib->CrbData); sil_wrw_mem((VP)siopcb->siopinib->pRctReg,(VW)0); /* Set bound rate */ sil_wrw_mem((VP)siopcb->siopinib->pBrgReg,siopcb->siopinib->BrgData);}/* * オンチップのUARTからのポ〖リング叫蜗 */voiduart_putc(char c){ UW buf_level; do{ buf_level = sil_rew_mem((VP)sys_siopcb->siopinib->pSraReg) & SCSRA_TRDY; }while(buf_level == 0); sil_wrb_mem((VP)sys_siopcb->siopinib->pFifoReg,(VW)c);}/* * SIOドライバの介袋步ル〖チン */voiduart_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; siopcb->sendflag = FALSE; siopcb->rxfdb = 0; siopcb->rxbuf = 0; siopcb->siopid = i; }}/* * オ〖プンしているポ〖トがあるか */BOOLuart_openflag(ID siopid){ return(siopcb_table[siopid].openflag);}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *uart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; UW n; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* UART Initialize */ sil_wrw_mem((VP)siopinib->pCraReg,(VW)siopinib->CraData); sil_wrw_mem((VP)siopinib->pCrbReg,(VW)siopinib->CrbData); sil_wrw_mem((VP)siopinib->pRctReg,(VW)siopinib->RctData); sil_wrw_mem((VP)siopinib->pRbtReg,(VW)siopinib->RbtData); /* Set bound rate */ sil_wrw_mem((VP)siopinib->pBrgReg,siopinib->BrgData); /* 减慨RcvRdy,FIFO=Half、流慨TxEmpty,FIFO-Half充哈み钓材 */ n = sil_rew_mem((VP)siopinib->pCraReg); n &= (~(SCCRA_RIE | SCCRA_TIC)); n |= (0xe00 | 0x0c); sil_wrw_mem((VP)siopinib->pCraReg,(VW)n); /* BBUS充哈み钓材 */ sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopinib->BbbiRx); sil_wrw_mem((VP)INT_CFG8_11_REG,sil_rew_mem((VP)INT_CFG8_11_REG)|0x80000000); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; siopcb->rxfdb = 0; siopcb->rxbuf = 0; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voiduart_cls_por(SIOPCB *siopcb){ siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLuart_snd_chr(SIOPCB *siopcb, char c){ if (uart_putready(siopcb)){ uart_putchar(siopcb, c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTuart_rcv_chr(SIOPCB *siopcb){ if (uart_getready(siopcb)) { return((INT)(UB) uart_getchar(siopcb)); } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voiduart_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: uart_enable_send(siopcb); break; case SIO_ERDY_RCV: uart_enable_rcv(siopcb); break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voiduart_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: uart_disable_send(siopcb); break; case SIO_ERDY_RCV: uart_disable_rcv(siopcb); break; }}/* * シリアルI/Oポ〖トに滦する流慨充哈み借妄 */static voiduart_Txisr_siop(SIOPCB *siopcb){ /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_snd(siopcb->exinf);}/* * シリアルI/Oポ〖トに滦する减慨充哈み借妄 */static voiduart_Rxisr_siop(SIOPCB *siopcb){ /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ * 呵络4矢机(32bit)减慨しているのでここで链减慨矢机を借妄する */ while(1) { uart_ierdy_rcv(siopcb->exinf); if(0 == siopcb->rxfdb) break; /* 减慨貉みキャラクタなし */ }}/* * SIOのTx充哈みサ〖ビスル〖チン */voiduart_Tx_isr(){ uart_Txisr_siop(&(siopcb_table[0]));}/* * SIOのRx充哈みサ〖ビスル〖チン */voiduart_Rx_isr(){ uart_Rxisr_siop(&(siopcb_table[0])); sil_wrw_mem((VP)siopcb_table[0].siopinib->pSraReg , sil_rew_mem((VP)siopcb_table[0].siopinib->pSraReg) );}/* * SIO2のTx充哈みサ〖ビスル〖チン */voiduart2_Tx_isr(){ uart_Txisr_siop(&(siopcb_table[1]));}/* * SIO2のRx充哈みサ〖ビスル〖チン */voiduart2_Rx_isr(){ uart_Rxisr_siop(&(siopcb_table[1])); sil_wrw_mem((VP)siopcb_table[1].siopinib->pSraReg , sil_rew_mem((VP)siopcb_table[1].siopinib->pSraReg) );}/* * SIOの充哈み钓材ル〖チン */voiduart_TxRx_Enable(ID siopid){ sil_wrw_mem((VP)BBBIE_REG, sil_rew_mem((VP)BBBIE_REG) | siopcb_table[siopid].siopinib->BbbiTx | siopcb_table[siopid].siopinib->BbbiRx);}/* * SIOの充哈み敦贿ル〖チン */voiduart_TxRx_Disable(ID siopid){ sil_wrw_mem((VP)BBBIE_REG, sil_rew_mem((VP)BBBIE_REG) & ~(siopcb_table[siopid].siopinib->BbbiTx | siopcb_table[siopid].siopinib->BbbiRx) );}/* * 附哼のシリアルポ〖トの艰评 */IDuart_get_id(SIOPCB *siopcb){ return(siopcb->siopid);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -