|
|
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 によって生成されました。 |