nios2.h

説明を見る。
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.h,v 1.1 2005/04/03 13:33:19 honda Exp $
00037  */
00038 
00039 #ifndef _NIOSII_H_
00040 #define _NIOSII_H_
00041 
00042 #ifndef _MACRO_ONLY
00043 #include <itron.h>
00044 #endif /* _MACRO_ONLY */
00045 
00046 /*
00047  *  割込みビット
00048  */
00049 #define STATUS_U   0x02
00050 #define STATUS_PIE 0x01
00051 
00052 /*
00053  * 割込みの数
00054  */
00055 #define MAX_INT_NUM 32
00056 
00057 /*
00058  * 例外の個数
00059  */
00060 #define MAX_EXC_NUM 32
00061 
00062 
00063 /*
00064  *  Timer
00065  *  Full-featuredをサポート
00066  */
00067 /*
00068  * オフセット値
00069  */
00070 #define TIM_STATUS_OFFSET  0x00
00071 #define TIM_CONTROL_OFFSET 0x04
00072 #define TIM_PERIODL_OFFSET 0x08
00073 #define TIM_PERIODH_OFFSET 0x0C
00074 #define TIM_SNAPL_OFFSET 0x10
00075 #define TIM_SNAPH_OFFSET 0x14
00076 
00077 #define TIM_STATUS_RUN 0x02
00078 #define TIM_STATUS_TO  0x01
00079 
00080 #define TIM_CONTROL_STOP  0x08
00081 #define TIM_CONTROL_START 0x04
00082 #define TIM_CONTROL_COUNT 0x02
00083 #define TIM_CONTROL_ITO   0x01
00084 
00085 #define TIM_STATUS  (TIM_BASE + TIM_STATUS_OFFSET)
00086 #define TIM_CONTROL (TIM_BASE + TIM_CONTROL_OFFSET)
00087 #define TIM_PERIODL (TIM_BASE + TIM_PERIODL_OFFSET)
00088 #define TIM_PERIODH (TIM_BASE + TIM_PERIODH_OFFSET)
00089 #define TIM_SNAPL   (TIM_BASE + TIM_SNAPL_OFFSET)
00090 #define TIM_SNAPH   (TIM_BASE + TIM_SNAPH_OFFSET)
00091 
00092 
00093 /*
00094  * UART
00095  */
00096 #define UART_RXDATA_OFFSET  0x00
00097 #define UART_TXDATA_OFFSET  0x04
00098 #define UART_STATUS_OFFSET  0x08
00099 #define UART_CONTROL_OFFSET 0x0C
00100 #define UART_DIVISOR_OFFSET 0x10
00101 #define UART_ENDOFPACKET_OFFSET 0x1C
00102 
00103 #define UART_STATUS_EOP   0x1000
00104 #define UART_STATUS_CTS   0x0800
00105 #define UART_STATUS_DCTS  0x0400
00106 #define UART_STATUS_E     0x0100
00107 #define UART_STATUS_RRDY  0x0080
00108 #define UART_STATUS_TRDY  0x0040
00109 #define UART_STATUS_TMT   0x0020
00110 #define UART_STATUS_TOE   0x0010
00111 #define UART_STATUS_ROE   0x0008
00112 #define UART_STATUS_BRK   0x0004
00113 #define UART_STATUS_FE    0x0002
00114 #define UART_STATUS_PE    0x0001
00115 
00116 #define UART_CONTROL_IEOP  0x1000
00117 #define UART_CONTROL_RTS   0x0800
00118 #define UART_CONTROL_IDCTS 0x0400
00119 #define UART_CONTROL_TRDK  0x0200
00120 #define UART_CONTROL_IE    0x0100
00121 #define UART_CONTROL_IRRDY 0x0080
00122 #define UART_CONTROL_ITRD  0x0040
00123 #define UART_CONTROL_ITMT  0x0020
00124 #define UART_CONTROL_ITOE  0x0010
00125 #define UART_CONTROL_IROE  0x0008
00126 #define UART_CONTROL_IBRK  0x0004
00127 #define UART_CONTROL_IFE   0x0002
00128 #define UART_CONTROL_IPE   0x0001
00129 
00130 #define UART_RXDATA  (UART_BASE + UART_RXDATA_OFFSET)
00131 #define UART_TXDATA  (UART_BASE + UART_TXDATA_OFFSET)
00132 #define UART_STATUS  (UART_BASE + UART_STATUS_OFFSET)
00133 #define UART_CONTROL (UART_BASE + UART_CONTROL_OFFSET)
00134 #define UART_DIVISOR (UART_BASE + UART_DIVISOR_OFFSET)
00135 #define UART_ENDOFPACKET (UART_BASE + UART_ENDOFPACKET_OFFSET)
00136 
00137 
00138 /*
00139  * JTAG UART関連
00140  */ 
00141 #define JTAG_UART_DATA_OFFSET    0x00
00142 #define JTAG_UART_CONTROL_OFFSET 0x04
00143 
00144 #define JTAG_UART_DATA_RVALID 0x8000
00145 
00146 #define JTAG_UART_CONTROL_RIE 0x01
00147 #define JTAG_UART_CONTROL_WIE 0x02
00148 #define JTAG_UART_CONTROL_RIP 0x04
00149 #define JTAG_UART_CONTROL_WIP 0x08
00150 #define JTAG_UART_CONTROL_WSAPCE 0x0ffff0000
00151 
00152 #define JTAG_UART_DATA    (UART_BASE + JTAG_UART_DATA_OFFSET)
00153 #define JTAG_UART_CONTROL (UART_BASE + JTAG_UART_CONTROL_OFFSET)
00154 
00155 
00156 /*
00157  * Mutex
00158  */ 
00159 #define MUTEX_MUTEX_OFFSET 0x00
00160 #define MUTEX_RESET_OFFSET 0x04
00161 
00162 #define MUTEX_MUTEX_OWNER_MASK   0xffff0000
00163 #define MUTEX_MUTEX_VALUE_MASK   0x0000ffff
00164 #define MUTEX_MUTEX_OWNER_OFFSET (16)
00165 
00166 #define MUTEX_RESET_RESET_MASK   0x01
00167 #define MUTEX_VALUE_DATA 0x1234
00168 
00169 #ifndef _MACRO_ONLY
00170 
00171 /*
00172  * 内蔵UART用 簡易SIOドライバ
00173  */
00174 
00175 /*
00176  *  シリアルI/Oポート初期化ブロック
00177  */
00178 typedef struct sio_port_initialization_block {
00179 
00180 } SIOPINIB;
00181 
00182 /*
00183  *  シリアルI/Oポート管理ブロック
00184  */
00185 typedef struct sio_port_control_block {
00186     const SIOPINIB  *siopinib;  /* シリアルI/Oポート初期化ブロック */
00187     VP_INT          exinf;      /* 拡張情報 */
00188     BOOL    openflag;           /* オープン済みフラグ */
00189     BOOL    sendflag;           /* 送信割込みイネーブルフラグ */
00190     BOOL    getready;           /* 文字を受信した状態 */
00191     BOOL    putready;           /* 文字を送信できる状態 */
00192 } SIOPCB;
00193 
00194 extern SIOPCB   siopcb_table[];
00195 
00196 #define uart_openflag   (siopcb_table[0].openflag)
00197 
00198 Inline void
00199 uart_putc(unsigned char c){
00200 #ifndef USE_JTAG_UART   
00201     while(!(sil_rew_mem((VP)UART_STATUS) & UART_STATUS_TRDY));
00202     sil_wrw_mem((VP)UART_TXDATA, c);
00203 #else
00204     while(!((sil_rew_mem((VP)JTAG_UART_CONTROL) & JTAG_UART_CONTROL_WSAPCE) > 0));
00205     sil_wrw_mem((VP)JTAG_UART_DATA, c); 
00206 #endif /* USE_JTAG_UART */  
00207     
00208 }
00209 
00210 Inline unsigned char
00211 uart_getc(void){
00212 #ifndef USE_JTAG_UART   
00213     while(!(sil_rew_mem((VP)UART_STATUS) & UART_STATUS_RRDY));
00214     return (char)(sil_rew_mem((VP)UART_RXDATA));
00215 #else
00216     int tmp;
00217     do{
00218         tmp = sil_rew_mem((VP)JTAG_UART_DATA);
00219     }while((tmp &JTAG_UART_DATA_RVALID) == 0);
00220 
00221     return (char)tmp;
00222 #endif /* USE_JTAG_UART */
00223 }
00224 
00225 /*
00226  *  コールバックルーチンの識別番号
00227  *  OPB_UARTLITE は,送受信割込みが分かれていないため,意味はない.
00228  */
00229 #define SIO_ERDY_SND    1u              /* 送信可能コールバック */
00230 #define SIO_ERDY_RCV    2u              /* 受信通知コールバック */
00231 
00232 /*
00233  *  SIOドライバの初期化ルーチン
00234  */
00235 extern void uart_initialize(void);
00236 
00237 /*
00238  *  シリアルI/Oポートのオープン
00239  */
00240 extern SIOPCB   *uart_opn_por(ID siopid, VP_INT exinf);
00241 
00242 /*
00243  *  シリアルI/Oポートのクローズ
00244  */
00245 extern void uart_cls_por(SIOPCB *siopcb);
00246 
00247 /*
00248  *  シリアルI/Oポートへの文字送信
00249  */
00250 extern BOOL uart_snd_chr(SIOPCB *siopcb, INT chr);
00251 
00252 /*
00253  *  シリアルI/Oポートからの文字受信
00254  */
00255 extern INT  uart_rcv_chr(SIOPCB *siopcb);
00256 
00257 
00258 /*
00259  *  シリアルI/Oポートからのコールバックの許可
00260  */
00261 extern void uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn);
00262 
00263 /*
00264  *  シリアルI/Oポートからのコールバックの禁止
00265  */
00266 extern void uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn);
00267 
00268 /*
00269  *  SIOの割込みサービスルーチン
00270  */
00271 extern void uart_isr(void);
00272 
00273 /*
00274  *  シリアルI/Oポートからの送信可能コールバック
00275  */
00276 extern void uart_ierdy_snd(VP_INT exinf);
00277 
00278 /*
00279  *  シリアルI/Oポートからの受信通知コールバック
00280  */
00281 extern void uart_ierdy_rcv(VP_INT exinf);
00282 
00283 
00284 /*
00285  * Mutex
00286  */
00287 
00288 /*
00289  * ミューテックスの取得
00290  *   取得できれば1を取得できなければ0を返す 
00291  */ 
00292 Inline int
00293 mutex_try_lock(unsigned int addr, unsigned int id){
00294     unsigned int data;
00295     unsigned int check;
00296     
00297     data = (id << MUTEX_MUTEX_OWNER_OFFSET) | MUTEX_VALUE_DATA;
00298 
00299     sil_wrw_mem((VP)(addr + MUTEX_MUTEX_OFFSET), data);
00300     check = sil_rew_mem((VP)(addr + MUTEX_MUTEX_OFFSET));
00301 
00302     if ( data == check ){
00303         return 1;
00304     }
00305     else {
00306         return 0;
00307     }
00308 }
00309 
00310 /*
00311  * ミューテックスの開放 
00312  */ 
00313 Inline void
00314 mutex_unlock(unsigned int addr, unsigned int id){
00315     sil_wrw_mem((VP)(addr + MUTEX_RESET_OFFSET), MUTEX_RESET_RESET_MASK);
00316     sil_wrw_mem((VP)(addr + MUTEX_MUTEX_OFFSET), (id << MUTEX_MUTEX_OWNER_OFFSET));
00317 }
00318 
00319 /*
00320  * ミューテクスの初期化
00321  */
00322 Inline void
00323 mutex_init(unsigned int addr, unsigned int id){
00324     unsigned int data;
00325     unsigned int check;
00326 
00327     check = sil_rew_mem((VP)(addr + MUTEX_RESET_OFFSET));
00328 
00329     //リセットがされたかのチェック
00330     if ( check == MUTEX_RESET_RESET_MASK ){
00331         sil_wrw_mem((VP)(addr + MUTEX_RESET_OFFSET), MUTEX_RESET_RESET_MASK);
00332     }
00333     else {
00334         data = sil_rew_mem((VP)(addr + MUTEX_MUTEX_OFFSET));
00335         sil_wrw_mem((VP)(addr + MUTEX_MUTEX_OFFSET), (data & MUTEX_MUTEX_OWNER_MASK));
00336         sil_wrw_mem((VP)(addr + MUTEX_MUTEX_OFFSET), (id << MUTEX_MUTEX_OWNER_OFFSET));
00337     }
00338 }
00339 
00340 #endif  /* _MACRO_ONLY */
00341 
00342 #endif /* _NIOSII_H_ */
00343 

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