📄 nios2.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory * Graduate School of Information Science, Nagoya Univ., JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: nios2.c,v 1.6 2005/07/17 14:24:04 honda Exp $ *//* * Nios2 筛洁ペリフェラル脱ドライバ */#include <s_services.h>#include <nios2.h>/* * UART 脱 词白ドライバ *//* * シリアルI/Oポ〖ト介袋步ブロック */const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */SIOPCB siopcb_table[TNUM_SIOP];/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))#ifdef USE_JTAG_UART/* * JTAG_UART はステ〖タスとデ〖タを票箕に艰评するため·ステ〖タスを * チェックするとデ〖タを粕み哈んでしまうˉそのため·uart_getready() * を悸乖した稿のデ〖タを掐れるˉ */ UB jtag_uart_buf = -1;#endif /* USE_JTAG_UART *//* * 矢机を减慨したか? */Inline BOOLuart_getready(SIOPCB *siopcb){#ifndef USE_JTAG_UART return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_RRDY) != 0);#else UW tmp = sil_rew_mem((VP)JTAG_UART_DATA); jtag_uart_buf = (UB)tmp; return ((tmp & JTAG_UART_DATA_RVALID) != 0);#endif /* USE_JTAG_UART */ }/* * 矢机を流慨できるか? */Inline BOOLuart_putready(SIOPCB *siopcb){#ifndef USE_JTAG_UART return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_TRDY) != 0);#else return((sil_rew_mem( (VP)JTAG_UART_CONTROL) & JTAG_UART_CONTROL_WSAPCE) > 0);#endif /* USE_JTAG_UART */}/* * 减慨した矢机の艰り叫し */Inline UBuart_getchar(SIOPCB *siopcb){#ifndef USE_JTAG_UART return((UB)(sil_rew_mem((VP)UART_RXDATA)));#else return((UB)(sil_rew_mem((VP)JTAG_UART_DATA)));#endif /* USE_JTAG_UART */}/* * 流慨する矢机の今き哈み */Inline voiduart_putchar(SIOPCB *siopcb, UB c){#ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_TXDATA, c);#else sil_wrw_mem((VP)JTAG_UART_DATA,c);#endif /* USE_JTAG_UART */}/* * 流慨扩告簇眶 *//* * 流慨充哈み钓材 */Inline voiduart_enable_send(SIOPCB *siopcb){#ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)|UART_CONTROL_ITRD);#else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_WIE);#endif /* USE_JTAG_UART */ }/* * 流慨充哈み敦贿 */Inline voiduart_disable_send(SIOPCB *siopcb){#ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)&~UART_CONTROL_ITRD);#else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_WIE);#endif /* USE_JTAG_UART */}/* * 减慨扩告簇眶 *//* * 减慨充哈み钓材 */Inline voiduart_enable_rcv(SIOPCB *siopcb){#ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)|UART_STATUS_RRDY);#else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_RIE);#endif /* USE_JTAG_UART */}/* * 减慨充哈み敦贿 */Inline voiduart_disable_rcv(SIOPCB *siopcb){#ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)&~UART_STATUS_RRDY);#else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_RIE);#endif /* USE_JTAG_UART */ }/* * SIOドライバの介袋步ル〖チン * 1ポ〖トしかないため·あまり罢蹋はない */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 *uart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib;#ifndef USE_JTAG_UART // sil_wrw_mem(UART_DIVISOR, UART_DIVISOR_VAL); sil_wrw_mem((VP)UART_STATUS, 0x00); /* * 减慨充り哈み钓材 */ sil_wrw_mem((VP)UART_CONTROL, UART_STATUS_RRDY);#else sil_wrw_mem((VP)JTAG_UART_CONTROL,JTAG_UART_CONTROL_RIE);#endif /* USE_JTAG_UART */ siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb);}voiduart_cls_por(SIOPCB *siopcb){#ifndef USE_JTAG_UART /* 充哈み敦贿 */ sil_wrw_mem((VP)UART_CONTROL, 0x00);#else sil_wrw_mem((VP)JTAG_UART_CONTROL,0x00);#endif /* USE_JTAG_UART */ siopcb->openflag = FALSE; siopcb->sendflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLuart_snd_chr(SIOPCB *siopcb, INT chr){ if(uart_putready(siopcb)){ uart_putchar(siopcb, (UB) chr); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTuart_rcv_chr(SIOPCB *siopcb){#ifndef USE_JTAG_UART if (uart_getready(siopcb)) { return((INT)(UB) uart_getchar(siopcb)); } return(-1);#else UB tmp; if (jtag_uart_buf != -1) { tmp = jtag_uart_buf; jtag_uart_buf = -1; return tmp; } return(-1);#endif /* USE_JTAG_UART */ }/* * シリアル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_isr_siop(SIOPCB *siopcb){ if (uart_getready(siopcb)) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_rcv(siopcb->exinf); } if (uart_putready(siopcb)) { /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ uart_ierdy_snd(siopcb->exinf); }}/* * SIOの充哈みサ〖ビスル〖チン */voiduart_isr(){ if (siopcb_table[0].openflag) { uart_isr_siop(&(siopcb_table[0])); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -