nios2.c

説明を見る。
00001 /*
00002  *  TOPPERS/FDMP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Function Distributed Multiprocessor Kernel
00005  * 
00006  *  Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory
00007  *              Graduate School of Information Science, Nagoya Univ., JAPAN  
00008  * 
00009  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
00010  *  によって公表されている GNU General Public License の Version 2 に記
00011  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00012  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00013  *  利用と呼ぶ)することを無償で許諾する.
00014  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00015  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00016  *      スコード中に含まれていること.
00017  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00018  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00019  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00020  *      の無保証規定を掲載すること.
00021  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00022  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00023  *      と.
00024  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00025  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00026  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00027  *        報告すること.
00028  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00029  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00030  * 
00031  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00032  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00033  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00034  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00035  * 
00036  *  @(#) $Id: nios2.c,v 1.3 2006/03/14 04:37:25 honda Exp $
00037  */
00038 
00039 /*
00040  * Nios2 標準ペリフェラル用ドライバ
00041  */
00042 #include <s_services.h>
00043 #include <nios2.h>
00044 
00045 
00046 /*
00047  * UART 用 簡易ドライバ
00048  */
00049 
00050 /*
00051  * シリアルI/Oポート初期化ブロック
00052  */
00053 const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};
00054 
00055 /*
00056  *  シリアルI/Oポート管理ブロックのエリア
00057  */
00058 SIOPCB  siopcb_table[TNUM_SIOP];
00059 
00060 /*
00061  *  シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
00062  */
00063 #define INDEX_SIOP(siopid)  ((UINT)((siopid) - 1))
00064 #define get_siopcb(siopid)  (&(siopcb_table[INDEX_SIOP(siopid)]))
00065 
00066 #ifdef USE_JTAG_UART
00067 /*
00068  *  JTAG_UART はステータスとデータを同時に取得するため,ステータスを
00069  *  チェックするとデータを読み込んでしまう.そのため,uart_getready()
00070  *  を実行した後のデータを入れる.  
00071  */ 
00072 B jtag_uart_buf = -1;
00073 #endif /* USE_JTAG_UART */
00074 
00075 /*
00076  * 文字を受信したか?
00077  */
00078 Inline BOOL
00079 uart_getready(SIOPCB *siopcb)
00080 {
00081 #ifndef USE_JTAG_UART
00082     return((sil_rew_mem((VP)UART_STATUS) &
00083             UART_STATUS_RRDY) != 0);
00084 #else
00085     UW tmp = sil_rew_mem((VP)JTAG_UART_DATA);
00086     jtag_uart_buf = (UB)tmp;    
00087     return ((tmp & JTAG_UART_DATA_RVALID) != 0);
00088 #endif /* USE_JTAG_UART */
00089 }
00090 
00091 /*
00092  * 文字を送信できるか?
00093  */
00094 Inline BOOL
00095 uart_putready(SIOPCB *siopcb)
00096 {
00097 #ifndef USE_JTAG_UART
00098     return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_TRDY) != 0);
00099 #else
00100     return((sil_rew_mem(
00101         (VP)JTAG_UART_CONTROL) & JTAG_UART_CONTROL_WSAPCE) > 0);
00102 #endif /* USE_JTAG_UART */
00103 }
00104 
00105 /*
00106  *  受信した文字の取り出し
00107  */
00108 Inline UB
00109 uart_getchar(SIOPCB *siopcb)
00110 {
00111 #ifndef USE_JTAG_UART
00112     return((UB)(sil_rew_mem((VP)UART_RXDATA)));
00113 #else
00114     return((UB)(sil_rew_mem((VP)JTAG_UART_DATA)));
00115 #endif /* USE_JTAG_UART */
00116 }
00117 
00118 /*
00119  *  送信する文字の書き込み
00120  */
00121 Inline void
00122 uart_putchar(SIOPCB *siopcb, UB c)
00123 {
00124 #ifndef USE_JTAG_UART
00125     sil_wrw_mem((VP)UART_TXDATA, c);
00126 #else
00127     sil_wrw_mem((VP)JTAG_UART_DATA,c);
00128 #endif /* USE_JTAG_UART */
00129 }
00130 
00131 /*
00132  * 送信制御関数
00133  */
00134 /*
00135  *  送信割込み許可
00136  */
00137 Inline void
00138 uart_enable_send(SIOPCB *siopcb)
00139 {
00140 #ifndef USE_JTAG_UART
00141     sil_wrw_mem((VP)UART_CONTROL,
00142                 sil_rew_mem((VP)UART_CONTROL)|UART_CONTROL_ITRD);
00143 #else
00144     sil_wrw_mem((VP)JTAG_UART_CONTROL,
00145                 sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_WIE);
00146 #endif /* USE_JTAG_UART */
00147 }
00148 
00149 /*
00150  *  送信割込み禁止
00151  */
00152 Inline void
00153 uart_disable_send(SIOPCB *siopcb)
00154 {
00155 #ifndef USE_JTAG_UART
00156     sil_wrw_mem((VP)UART_CONTROL,
00157                 sil_rew_mem((VP)UART_CONTROL)&~UART_CONTROL_ITRD);
00158 #else
00159     sil_wrw_mem((VP)JTAG_UART_CONTROL,
00160                 sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_WIE);
00161 #endif /* USE_JTAG_UART */
00162 }
00163 
00164 /*
00165  * 受信制御関数
00166  */
00167 /*
00168  *  受信割込み許可
00169  */
00170 Inline void
00171 uart_enable_rcv(SIOPCB *siopcb)
00172 {
00173 #ifndef USE_JTAG_UART
00174     sil_wrw_mem((VP)UART_CONTROL,
00175                 sil_rew_mem((VP)UART_CONTROL)|UART_STATUS_RRDY);
00176 #else
00177     sil_wrw_mem((VP)JTAG_UART_CONTROL,
00178                 sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_RIE);
00179 #endif /* USE_JTAG_UART */
00180 }
00181 
00182 /*
00183  *  受信割込み禁止
00184  */
00185 Inline void
00186 uart_disable_rcv(SIOPCB *siopcb)
00187 {
00188 #ifndef USE_JTAG_UART
00189     sil_wrw_mem((VP)UART_CONTROL,
00190                 sil_rew_mem((VP)UART_CONTROL)&~UART_STATUS_RRDY);
00191 #else
00192     sil_wrw_mem((VP)JTAG_UART_CONTROL,
00193                 sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_RIE);
00194 #endif /* USE_JTAG_UART */
00195 }
00196 
00197 /*
00198  *  SIOドライバの初期化ルーチン
00199  *  1ポートしかないため,あまり意味はない
00200  */
00201 void
00202 uart_initialize()
00203 {
00204     SIOPCB  *siopcb;
00205     UINT    i;
00206 
00207     /*
00208      *  シリアルI/Oポート管理ブロックの初期化
00209      */
00210     for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
00211         siopcb->siopinib = &(siopinib_table[i]);
00212         siopcb->openflag = FALSE;
00213         siopcb->sendflag = FALSE;
00214     }
00215 }
00216 
00217 SIOPCB   *
00218 uart_opn_por(ID siopid, VP_INT exinf){
00219 
00220     SIOPCB  *siopcb;
00221     const SIOPINIB  *siopinib;
00222 
00223     siopcb = get_siopcb(siopid);
00224     siopinib = siopcb->siopinib;
00225 
00226 #ifndef USE_JTAG_UART
00227 //  sil_wrw_mem(UART_DIVISOR, UART_DIVISOR_VAL);
00228     sil_wrw_mem((VP)UART_STATUS, 0x00);
00229     
00230     /*
00231      *  受信割り込み許可
00232      */
00233     sil_wrw_mem((VP)UART_CONTROL, UART_STATUS_RRDY);
00234 #else
00235     sil_wrw_mem((VP)JTAG_UART_CONTROL,JTAG_UART_CONTROL_RIE);
00236 #endif /* USE_JTAG_UART */
00237     
00238     siopcb->exinf = exinf;
00239     siopcb->getready = siopcb->putready = FALSE;
00240     siopcb->openflag = TRUE;
00241 
00242     return(siopcb);
00243 }
00244 
00245 void
00246 uart_cls_por(SIOPCB *siopcb){
00247 #ifndef USE_JTAG_UART
00248     /* 割込み禁止 */
00249     sil_wrw_mem((VP)UART_CONTROL, 0x00);
00250 #else
00251     sil_wrw_mem((VP)JTAG_UART_CONTROL,0x00);
00252 #endif /* USE_JTAG_UART */
00253     siopcb->openflag = FALSE;
00254     siopcb->sendflag = FALSE;
00255 }
00256 
00257 /*
00258  *  シリアルI/Oポートへの文字送信
00259  */
00260 BOOL
00261 uart_snd_chr(SIOPCB *siopcb, INT chr)
00262 {
00263     if(uart_putready(siopcb)){
00264         uart_putchar(siopcb, (UB) chr);
00265         return(TRUE);
00266     }
00267     return(FALSE);
00268 }
00269 
00270 /*
00271  *  シリアルI/Oポートからの文字受信
00272  */
00273 INT
00274 uart_rcv_chr(SIOPCB *siopcb)
00275 {
00276 #ifndef USE_JTAG_UART
00277     if (uart_getready(siopcb)) {
00278         return((INT)(UB) uart_getchar(siopcb));
00279     }
00280     return(-1);
00281 #else
00282      UB tmp;
00283     
00284     if (jtag_uart_buf != -1) {
00285         tmp = jtag_uart_buf;
00286         jtag_uart_buf = -1;
00287         return tmp;
00288     }
00289     return(-1);
00290 #endif /* USE_JTAG_UART */
00291 }
00292 
00293 /*
00294  *  シリアルI/Oポートからのコールバックの許可
00295  */
00296 void
00297 uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
00298 {
00299     switch (cbrtn) {
00300       case SIO_ERDY_SND:
00301         uart_enable_send(siopcb);
00302         break;
00303       case SIO_ERDY_RCV:
00304         uart_enable_rcv(siopcb);
00305         break;
00306     }
00307 
00308 }
00309 
00310 /*
00311  *  シリアルI/Oポートからのコールバックの禁止
00312  */
00313 void
00314 uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
00315 {
00316     switch (cbrtn) {
00317       case SIO_ERDY_SND:
00318         uart_disable_send(siopcb);
00319         break;
00320       case SIO_ERDY_RCV:
00321         uart_disable_rcv(siopcb);
00322         break;
00323     }
00324 }
00325 
00326 /*
00327  *  シリアルI/Oポートに対する割込み処理
00328  */
00329 static void
00330 uart_isr_siop(SIOPCB *siopcb)
00331 {
00332     if (uart_getready(siopcb)) {
00333         /*
00334          *  受信通知コールバックルーチンを呼び出す.
00335          */
00336         uart_ierdy_rcv(siopcb->exinf);
00337     }
00338 
00339     if (uart_putready(siopcb)) {
00340         /*
00341          *  送信可能コールバックルーチンを呼び出す.
00342          */
00343         uart_ierdy_snd(siopcb->exinf);
00344     }
00345 }
00346 
00347 /*
00348  *  SIOの割込みサービスルーチン
00349  */
00350 void
00351 uart_isr()
00352 {
00353     if (siopcb_table[0].openflag) {
00354         uart_isr_siop(&(siopcb_table[0]));
00355     }
00356 }
00357 

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:12 2006 に Doxygen によって生成されました。