Changeset 167 for UsbWattMeter/trunk/asp_dcre/pdic/rx600/rx630_uart.c
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/asp_dcre/pdic/rx600/rx630_uart.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=SHIFT_JIS
r164 r167 7 7 * Copyright (C) 2013 by Mitsuhiro Matsuura 8 8 * 9 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 10 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 11 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 12 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 13 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 14 * XR[hÉÜÜêĢ鱯D 15 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 16 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 17 gip 18 * Ò}j 19 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 20 * Ì³ÛØKèðfÚ·é±ÆD 21 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 22 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 23 * ÆD 24 * (a) Äzzɺ¤hL 25 gipÒ}j 26 AÈÇjÉCãLÌ 27 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 28 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 29 * ñ·é±ÆD 30 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 31 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 32 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 33 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 34 * ÆÓ·é±ÆD 9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 21 * と. 22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 23 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 25 * 報告すること. 26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 30 * 免責すること. 35 31 * 36 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨37 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI38 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF39 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»40 * ÌÓCðíÈ¢D32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 36 * の責任を負わない. 41 37 * 42 38 * @(#) $Id$ … … 45 41 46 42 /* 47 * UART p ÈÕSIOhCo43 * UART用 簡易SIOドライバ 48 44 */ 49 45 … … 54 50 #include "rx630_uart.h" 55 51 56 /* VA[hWX^iSMR) */52 /* シリアルモードレジスタ(SMR) */ 57 53 #define CKS UINT_C(0x03) 58 54 #define STOP UINT_C(0x08) … … 64 60 #define ASYNC_8BIT UINT_C(0x40) 65 61 66 /* VARg[WX^iSCR) */62 /* シリアルコントロールレジスタ(SCR) */ 67 63 #define CKE UINT_C(0x03) 68 64 #define TEIE UINT_C(0x04) … … 72 68 #define TIE UINT_C(0x80) 73 69 74 /* VAXe[^XWX^iSSRj*/70 /* シリアルステータスレジスタ(SSR) */ 75 71 #define TEND UINT_C(0x04) 76 72 #define PER UINT_C(0x08) … … 78 74 #define ORER UINT_C(0x20) 79 75 80 /* VAg£[hWX^iSEMR) */76 /* シリアル拡張モードレジスタ(SEMR) */ 81 77 #define ACS0 UINT_C(0x01) 82 78 #define ABCS UINT_C(0x10) … … 86 82 87 83 /* 88 * VAI/O|[gú»ubNÌè`84 * シリアルI/Oポート初期化ブロックの定義 89 85 */ 90 86 typedef struct sio_port_initialization_block { 91 volatile uint8_t *ctlreg; /* VARg[WX^iSCR) */ 92 volatile uint8_t *modereg; /* VA[hWX^iSMR) */ 93 volatile uint8_t *extmodereg; /* VAg£[hWX^iSEMR) */ 94 volatile uint8_t *statusreg; /* VAXe[^XWX^iSSRj */ 95 volatile uint8_t *tdreg; /* gX~bgf[^WX^iTDR)*/ 96 volatile uint8_t *rdreg; /* V[uf[^WX^iRDR) */ 97 volatile uint8_t *bitratereg; /* rbg[gWX^iBRR) */ 98 volatile uint32_t *mstpcrreg; /* W 99 [XgbvRg[WX^iMSTPCRj */ 100 volatile uint8_t *ssrreg; /* Xe[^XWX^ */ 101 volatile uint8_t *rxiirreg; /* RXIpÝvWX^ */ 102 uint8_t tx_intno; /* Mif[^GveBjèÝÔ */ 103 uint8_t rx_intno; /* óMif[^tjèÝÔ */ 104 uint8_t te_intno; /* MiI¹jèÝÔ */ 105 uint8_t sci_no; /* SCIÌÔ(SCI0`SCI6) */ 106 uint32_t mstpcr_offset; /* MSTPCRÌηérbgItZbg */ 87 volatile uint8_t *ctlreg; /* シリアルコントロールレジスタ(SCR) */ 88 volatile uint8_t *modereg; /* シリアルモードレジスタ(SMR) */ 89 volatile uint8_t *extmodereg; /* シリアル拡張モードレジスタ(SEMR) */ 90 volatile uint8_t *statusreg; /* シリアルステータスレジスタ(SSR) */ 91 volatile uint8_t *tdreg; /* トランスミットデータレジスタ(TDR)*/ 92 volatile uint8_t *rdreg; /* レシーブデータレジスタ(RDR) */ 93 volatile uint8_t *bitratereg; /* ビットレートレジスタ(BRR) */ 94 volatile uint32_t *mstpcrreg; /* モジュールストップコントロールレジスタ(MSTPCR) */ 95 volatile uint8_t *ssrreg; /* ステータスレジスタ */ 96 volatile uint8_t *rxiirreg; /* RXI用割込み要求レジスタ */ 97 uint8_t tx_intno; /* 送信(データエンプティ)割り込み番号 */ 98 uint8_t rx_intno; /* 受信(データフル)割り込み番号 */ 99 uint8_t te_intno; /* 送信(終了)割り込み番号 */ 100 uint8_t sci_no; /* SCIの番号(SCI0〜SCI6) */ 101 uint32_t mstpcr_offset; /* MSTPCRの対応するビットオフセット */ 107 102 } SIOPINIB; 108 103 109 104 /* 110 * VAI/O|[gÇubNÌè`105 * シリアルI/Oポート管理ブロックの定義 111 106 */ 112 107 struct sio_port_control_block { 113 const SIOPINIB *p_siopinib; /* VAI/O|[gú»ubN*/114 intptr_t exinf; /* g£îñ*/115 bool_t openflag; /* I[vÏÝtO*/116 bool_t sendflag; /* MÝCl[utO*/117 bool_t getready; /* ¶ðóMµ½óÔ*/118 bool_t putready; /* ¶ðMÅ«éóÔ*/119 bool_t is_initialized; /* foCXú»ÏÝtO*/108 const SIOPINIB *p_siopinib; /* シリアルI/Oポート初期化ブロック */ 109 intptr_t exinf; /* 拡張情報 */ 110 bool_t openflag; /* オープン済みフラグ */ 111 bool_t sendflag; /* 送信割込みイネーブルフラグ */ 112 bool_t getready; /* 文字を受信した状態 */ 113 bool_t putready; /* 文字を送信できる状態 */ 114 bool_t is_initialized; /* デバイス初期化済みフラグ */ 120 115 }; 121 116 122 117 /* 123 * VAI/O|[gÇubNÌGA118 * シリアルI/Oポート管理ブロックのエリア 124 119 */ 125 120 static SIOPCB siopcb_table[TNUM_SIOP]; 126 121 127 /* WX^e[u*/122 /* レジスタテーブル */ 128 123 static const SIOPINIB siopinib_table[TNUM_SIOP] = 129 124 { … … 167 162 168 163 /* 169 * VAI/O|[gID©çÇubNðæèo·½ßÌ}N164 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ 170 165 */ 171 166 #define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1)) … … 175 170 176 171 /* 177 * SIO hCoÌVA[hWX^(SMR)172 * SIOドライバのシリアルモードレジスタ(SMR) 178 173 */ 179 174 static void … … 183 178 184 179 /* 185 * SCI hCoÌú»[`186 */ 187 188 /* 189 * èÝvæWX^ÌÝè(ISELRi)180 * SCIドライバの初期化ルーチン 181 */ 182 183 /* 184 * 割り込み要求先レジスタの設定(ISELRi) 190 185 * 191 * ZbglƯ¶lðÝè·é±ÆÉÈé½ß, 192 * ÍȪ·é. 193 */ 194 195 /* 196 * W 197 [Xgbv@\ÌÝè 198 */ 199 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* Ý */ 186 * リセット値と同じ値を設定することになるため, 187 * 処理は省略する. 188 */ 189 190 /* 191 * モジュールストップ機能の設定 192 */ 193 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */ 200 194 sil_wrw_mem((uint32_t *)p_siopinib->mstpcrreg, 201 195 sil_rew_mem((uint32_t *)p_siopinib->mstpcrreg) & ~p_siopinib->mstpcr_offset); 202 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* ÝÖ~*/203 204 /* óMÖ~, SCKn[qÍüoÍ|[gƵÄgp*/196 sil_wrh_mem((uint16_t *)SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */ 197 198 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 205 199 sil_wrb_mem((uint8_t *)p_siopinib->ctlreg, 0x00U); 206 200 207 /* NbNIðrbg(SMR.CKS[1:0]rbgðÝè) */201 /* クロック選択ビット(SMR.CKS[1:0]ビットを設定) */ 208 202 sil_wrb_mem((uint8_t *)p_siopinib->modereg, 209 203 sil_reb_mem((uint8_t *)p_siopinib->modereg) | clksrc); 210 204 211 /* SMR ÉM^ óMtH[}bgðÝè) */205 /* SMRに送信/ 受信フォーマットを設定) */ 212 206 sil_wrb_mem((uint8_t *)p_siopinib->modereg, 213 207 sil_reb_mem((uint8_t *)p_siopinib->modereg) & (~SCI_SMR_FLG_ENABLE)); 214 208 215 /* rbg[gðÝè*/209 /* ビットレートを設定 */ 216 210 sil_wrb_mem((uint8_t *)p_siopinib->bitratereg, bitrate); 217 211 218 /* rbgúÔ(î{NbN16TCNÌúÔª1rbgúÔÆÈé) */212 /* ビット期間(基本クロック16サイクルの期間が1ビット期間となる) */ 219 213 for(i = 0; i < 16; i++) { } 220 214 221 /* óMÂ*/215 /* 送受信許可 */ 222 216 sil_wrb_mem((uint8_t *)p_siopinib->ctlreg, 223 217 (sil_reb_mem((uint8_t *)p_siopinib->ctlreg) | SCI_SCR_FLG_ENABLE)); … … 226 220 227 221 /* 228 * SIO hCoÌú»[`222 * SIOドライバの初期化ルーチン 229 223 */ 230 224 void … … 235 229 236 230 /* 237 * VAI/O|[gÇubNÌú»231 * シリアルI/Oポート管理ブロックの初期化 238 232 */ 239 233 for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++){ … … 245 239 246 240 /* 247 * J[lN®Ìoi[oÍpÌú»241 * カーネル起動時のバナー出力用の初期化 248 242 */ 249 243 void … … 252 246 SIOPCB *p_siopcb = get_siopcb(siopid); 253 247 const SIOPINIB *p_siopinib = get_siopinib(siopid); 254 /* ±Ì_ÅÍAp_siopcb->p_siopinibÍú»³êĢȢ*/255 256 /* ñdú»Ìh~*/248 /* この時点では、p_siopcb->p_siopinibは初期化されていない */ 249 250 /* 二重初期化の防止 */ 257 251 p_siopcb->is_initialized = true; 258 252 259 /* n[hEFAÌú»ÆMÂ*/253 /* ハードウェアの初期化処理と送信許可 */ 260 254 rx630_uart_setmode(p_siopinib , bitrate, clksrc); 261 255 sil_wrb_mem((uint8_t *)p_siopinib->ctlreg, … … 264 258 265 259 /* 266 * VAI/O|[gÖÌ|[OÅÌoÍ260 * シリアルI/Oポートへのポーリングでの出力 267 261 */ 268 262 void … … 274 268 275 269 /* 276 * MWX^ªóÉÈéÜÅÒÂ270 * 送信レジスタが空になるまで待つ 277 271 */ 278 272 while((sil_reb_mem((uint8_t *)p_siopinib->ssrreg) & SCI_SSR_TEND_BIT) == 0U); … … 282 276 283 277 /* 284 * VAI/O|[gÌI[v278 * シリアルI/Oポートのオープン 285 279 */ 286 280 SIOPCB * … … 295 289 296 290 /* 297 * n[hEFAÌú»291 * ハードウェアの初期化 298 292 * 299 * ùÉú»µÄ¢éêÍ, ñdÉú»µÈ¢.293 * 既に初期化している場合は, 二重に初期化しない. 300 294 */ 301 295 if(!(p_siopcb->is_initialized)){ … … 312 306 313 307 /* 314 * VAI/O|[gÌN[Y308 * シリアルI/Oポートのクローズ 315 309 */ 316 310 void … … 318 312 { 319 313 /* 320 * UART â~314 * UART停止 321 315 */ 322 316 sil_wrh_mem((uint16_t *)p_siopcb->p_siopinib->ctlreg, 0x00U); … … 326 320 327 321 /* 328 * VAI/O|[gÖ̶M322 * シリアルI/Oポートへの文字送信 329 323 */ 330 324 bool_t … … 343 337 344 338 /* 345 * VAI/O|[g©ç̶óM339 * シリアルI/Oポートからの文字受信 346 340 */ 347 341 int_t … … 351 345 352 346 /* 353 * óMtOªONÌÆ«ÌÝóMobt@©ç¶ðæ¾·é.354 * ±êÍ, |[OóMÉηé½ßÅ é.355 * µ©µ, RX600V[YÅÍóMtOªÈ¢±Æ, VXeT[rX356 * ÅÍóMÝ̩絩f[^ðóMµÉÈ¢±Æ©ç, íÉ357 * óMobt@©ç¶ðæ¾·é.347 * 受信フラグがONのときのみ受信バッファから文字を取得する. 348 * これは, ポーリング受信に対応するためである. 349 * しかし, RX600シリーズでは受信フラグがないこと, システムサービス 350 * では受信割込みの中からしかデータを受信しに来ないことから, 常に 351 * 受信バッファから文字を取得する. 358 352 */ 359 353 c = (int)(sil_reb_mem((uint8_t *)p_siopcb->p_siopinib->rdreg)); … … 363 357 364 358 /* 365 * VAI/O|[g©çÌR[obNÌÂ359 * シリアルI/Oポートからのコールバックの許可 366 360 */ 367 361 void … … 384 378 385 379 /* 386 * VAI/O|[g©çÌR[obNÌÖ~380 * シリアルI/Oポートからのコールバックの禁止 387 381 */ 388 382 void … … 405 399 406 400 /* 407 * SIO ÌÝT[rX[`401 * SIOの割込みサービスルーチン 408 402 */ 409 403 void … … 415 409 (void *)p_siopcb->p_siopinib->ssrreg) & SCI_SSR_TEND_BIT) != 0U){ 416 410 /* 417 * MÂ\R[obN[`ðÄÑo·D411 * 送信可能コールバックルーチンを呼び出す. 418 412 */ 419 413 rx630_uart_irdy_snd(p_siopcb->exinf); … … 427 421 428 422 /* 429 * óMtOªONÌÆ«ÌÝóMÊmR[obN[`ðÄÑo·.430 * µ©µ, RX600V[YÅÍóMtOªÈ¢½ß, íÉóMÊm431 * R[obN[`ðÄÑo·.432 * ±±ÅÍóMÝ̶ðM¶é.433 */ 434 /* 435 * óMÊmR[obN[`ðÄÑo·D423 * 受信フラグがONのときのみ受信通知コールバックルーチンを呼び出す. 424 * しかし, RX600シリーズでは受信フラグがないため, 常に受信通知 425 * コールバックルーチンを呼び出す. 426 * ここでは受信割込みの発生を信じる. 427 */ 428 /* 429 * 受信通知コールバックルーチンを呼び出す. 436 430 */ 437 431 rx630_uart_irdy_rcv(p_siopcb->exinf); … … 440 434 441 435 /* 442 * |[gÔ©çÇubNÌæªÔnÖÌÏ·436 * ポート番号から管理ブロックの先頭番地への変換 443 437 */ 444 438 SIOPCB * … … 449 443 450 444 /* 451 * ÇubNÌæªÔn©çóMÝÔÖÌÏ·445 * 管理ブロックの先頭番地から受信割込み番号への変換 452 446 */ 453 447 INTNO … … 458 452 459 453 /* 460 * ÇubNÌæªÔn©çMÝÔÖÌÏ·454 * 管理ブロックの先頭番地から送信割込み番号への変換 461 455 */ 462 456 INTNO -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.