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