Changeset 364 for asp3_tinet_ecnl_rx/trunk/ntshell/src/mbed_api.c
- Timestamp:
- Feb 1, 2019, 9:57:09 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_rx/trunk/ntshell/src/mbed_api.c
r337 r364 1 1 /* 2 2 * TOPPERS ECHONET Lite Communication Middleware 3 * 4 * Copyright (C) 2014-201 7Cores Co., Ltd. Japan5 * 3 * 4 * Copyright (C) 2014-2018 Cores Co., Ltd. Japan 5 * 6 6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 7 7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 … … 26 26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 27 27 * 免責すること. 28 * 28 * 29 29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 30 30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 … … 32 32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 33 33 * の責任を負わない. 34 * 34 * 35 35 * @(#) $Id$ 36 36 */ … … 42 42 #include "rx630.h" 43 43 #include "ff.h" 44 #include "target_stddef.h" 45 #include "target_kernel_impl.h" 46 #include "scif.h" 44 47 45 48 /* PWM出力(490Hz) */ … … 64 67 void gpio_init(gpio_t *obj, PinName pin) 65 68 { 69 obj->pin = pin; 70 obj->dir = PIN_INPUT; 71 obj->mode = PullDefault; 66 72 } 67 73 … … 83 89 /* 汎用入出力ポートに設定 */ 84 90 switch (pin) { 85 case 0:91 case D0: 86 92 /* P21 */ 87 93 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B1_BIT); 88 94 break; 89 case 1:95 case D1: 90 96 /* P20 */ 91 97 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B0_BIT); 92 98 break; 93 case 2:99 case D2: 94 100 /* P22 */ 95 101 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B2_BIT); 96 102 break; 97 case 3:103 case D3: 98 104 /* P23 */ 99 105 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B3_BIT); 100 106 break; 101 case 4:107 case D4: 102 108 /* P24 */ 103 109 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B4_BIT); 104 110 break; 105 case 5:111 case D5: 106 112 /* P25 */ 107 113 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) & ~PORT_PMR_B5_BIT); 108 114 break; 109 case 6:115 case D6: 110 116 /* P32 */ 111 117 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B2_BIT); 112 118 break; 113 case 7:119 case D7: 114 120 /* P33 */ 115 121 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) & ~PORT_PMR_B3_BIT); 122 break; 123 default: 116 124 break; 117 125 } … … 124 132 switch (pin) { 125 133 /* P21/TIOCA3 */ 126 case 0:134 case D0: 127 135 if (gpio) { 128 136 /* P21端子機能制御レジスタ P21とする */ … … 136 144 break; 137 145 /* P20/TIOCB3 */ 138 case 1:146 case D1: 139 147 if (gpio) { 140 148 /* P20端子機能制御レジスタ P20とする */ … … 148 156 break; 149 157 /* P22/TIOCC3 */ 150 case 2:158 case D2: 151 159 if (gpio) { 152 160 /* P22端子機能制御レジスタ P22とする */ … … 160 168 break; 161 169 /* P23/TIOCD3 */ 162 case 3:170 case D3: 163 171 if (gpio) { 164 172 /* P23端子機能制御レジスタ P23とする */ … … 172 180 break; 173 181 /* P24/TIOCB4 */ 174 case 4:182 case D4: 175 183 if (gpio) { 176 184 /* P24端子機能制御レジスタ P24とする */ … … 184 192 break; 185 193 /* P25/TIOCA4 */ 186 case 5:194 case D5: 187 195 if (gpio) { 188 196 /* P25端子機能制御レジスタ P25とする */ … … 196 204 break; 197 205 /* P32/TIOCC0 */ 198 case 6:206 case D6: 199 207 if (gpio) { 200 208 /* P32端子機能制御レジスタ P32とする */ … … 208 216 break; 209 217 /* P33/TIOCD0 */ 210 case 7:218 case D7: 211 219 if (gpio) { 212 220 /* P33端子機能制御レジスタ P33とする */ … … 218 226 } 219 227 result = E_OK; 228 break; 229 default: 220 230 break; 221 231 } … … 228 238 switch (pin) { 229 239 /* P21/TIOCA3 */ 230 case 0:240 case D0: 231 241 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B1_BIT); 232 242 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B1_BIT); 233 243 break; 234 244 /* P20/TIOCB3 */ 235 case 1:245 case D1: 236 246 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT); 237 247 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT); 238 248 break; 239 249 /* P22/TIOCC3 */ 240 case 2:250 case D2: 241 251 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B2_BIT); 242 252 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B2_BIT); 243 253 break; 244 254 /* P23/TIOCD3 */ 245 case 3:255 case D3: 246 256 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B3_BIT); 247 257 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B3_BIT); 248 258 break; 249 259 /* P24/TIOCB4 */ 250 case 4:260 case D4: 251 261 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B4_BIT); 252 262 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B4_BIT); 253 263 break; 254 264 /* P25/TIOCA4 */ 255 case 5:265 case D5: 256 266 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B5_BIT); 257 267 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B5_BIT); 258 268 break; 259 269 /* P32/TIOCC0 */ 260 case 6:270 case D6: 261 271 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT); 262 272 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT); 263 273 break; 264 274 /* P33/TIOCD0 */ 265 case 7:275 case D7: 266 276 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B3_BIT); 267 277 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B3_BIT); 268 278 break; 279 default: 280 break; 269 281 } 270 282 } … … 280 292 281 293 switch (obj->pin) { 282 case 0:294 case D0: 283 295 /* P21 */ 284 296 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B1_BIT; 285 297 break; 286 case 1:298 case D1: 287 299 /* P20 */ 288 300 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B0_BIT; 289 301 break; 290 case 2:302 case D2: 291 303 /* P22 */ 292 304 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B2_BIT; 293 305 break; 294 case 3:306 case D3: 295 307 /* P23 */ 296 308 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B3_BIT; 297 309 break; 298 case 4:310 case D4: 299 311 /* P24 */ 300 312 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B4_BIT; 301 313 break; 302 case 5:314 case D5: 303 315 /* P25 */ 304 316 pdr = PORT2_PDR_ADDR; bit = PORT_PDR_B5_BIT; 305 317 break; 306 case 6:318 case D6: 307 319 /* P32 */ 308 320 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B2_BIT; 309 321 break; 310 case 7:322 case D7: 311 323 /* P33 */ 312 324 pdr = PORT3_PDR_ADDR; bit = PORT_PDR_B3_BIT; 313 325 break; 314 case 8:326 case D8: 315 327 /* PC2 */ 316 328 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B2_BIT; 317 329 break; 318 case 9:330 case D9: 319 331 /* PC3 */ 320 332 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B3_BIT; 321 333 break; 322 case 10:334 case D10: 323 335 /* PC4 */ 324 336 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B4_BIT; 325 337 break; 326 case 11:338 case D11: 327 339 /* PC6 */ 328 340 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B6_BIT; 329 341 break; 330 case 12:342 case D12: 331 343 /* PC7 */ 332 344 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B7_BIT; 333 345 break; 334 case 13:346 case D13: 335 347 /* PC5 */ 336 348 pdr = PORTC_PDR_ADDR; bit = PORT_PDR_B5_BIT; … … 349 361 sil_wrb_mem(pdr, sil_reb_mem(pdr) | bit); 350 362 break; 363 default: 364 break; 351 365 } 352 366 … … 387 401 388 402 switch (obj->pin) { 389 case 0:403 case D0: 390 404 /* P21 */ 391 405 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B1_BIT; 392 406 break; 393 case 1:407 case D1: 394 408 /* P20 */ 395 409 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B0_BIT; 396 410 break; 397 case 2:411 case D2: 398 412 /* P22 */ 399 413 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B2_BIT; 400 414 break; 401 case 3:415 case D3: 402 416 /* P23 */ 403 417 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B3_BIT; 404 418 break; 405 case 4:419 case D4: 406 420 /* P24 */ 407 421 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B4_BIT; 408 422 break; 409 case 5:423 case D5: 410 424 /* P25 */ 411 425 podr = PORT2_PODR_ADDR; bit = PORT_PODR_B5_BIT; 412 426 break; 413 case 6:427 case D6: 414 428 /* P32 */ 415 429 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B2_BIT; 416 430 break; 417 case 7:431 case D7: 418 432 /* P33 */ 419 433 podr = PORT3_PODR_ADDR; bit = PORT_PODR_B3_BIT; 420 434 break; 421 case 8:435 case D8: 422 436 /* PC2 */ 423 437 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B2_BIT; 424 438 break; 425 case 9:439 case D9: 426 440 /* PC3 */ 427 441 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B3_BIT; 428 442 break; 429 case 10:443 case D10: 430 444 /* PC4 */ 431 445 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B4_BIT; 432 446 break; 433 case 11:447 case D11: 434 448 /* PC6 */ 435 449 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B6_BIT; 436 450 break; 437 case 12:451 case D12: 438 452 /* PC7 */ 439 453 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B7_BIT; 440 454 break; 441 case 13:455 case D13: 442 456 /* PC5 */ 443 457 podr = PORTC_PODR_ADDR; bit = PORT_PODR_B5_BIT; … … 463 477 464 478 switch (obj->pin) { 465 case 0:479 case D0: 466 480 /* P21 */ 467 481 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B1_BIT; 468 482 break; 469 case 1:483 case D1: 470 484 /* P20 */ 471 485 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B0_BIT; 472 486 break; 473 case 2:487 case D2: 474 488 /* P22 */ 475 489 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; 476 490 break; 477 case 3:491 case D3: 478 492 /* P23 */ 479 493 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; 480 494 break; 481 case 4:495 case D4: 482 496 /* P24 */ 483 497 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B4_BIT; 484 498 break; 485 case 5:499 case D5: 486 500 /* P25 */ 487 501 pidr = PORT2_PIDR_ADDR; bit = PORT_PIDR_B5_BIT; 488 502 break; 489 case 6:503 case D6: 490 504 /* P32 */ 491 505 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; 492 506 break; 493 case 7:507 case D7: 494 508 /* P33 */ 495 509 pidr = PORT3_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; 496 510 break; 497 case 8:511 case D8: 498 512 /* PC2 */ 499 513 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B2_BIT; 500 514 break; 501 case 9:515 case D9: 502 516 /* PC3 */ 503 517 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B3_BIT; 504 518 break; 505 case 10:519 case D10: 506 520 /* PC4 */ 507 521 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B4_BIT; 508 522 break; 509 case 11:523 case D11: 510 524 /* PC6 */ 511 525 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B6_BIT; 512 526 break; 513 case 12:527 case D12: 514 528 /* PC7 */ 515 529 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B7_BIT; 516 530 break; 517 case 13:531 case D13: 518 532 /* PC5 */ 519 533 pidr = PORTC_PIDR_ADDR; bit = PORT_PIDR_B5_BIT; … … 581 595 582 596 switch (obj->pin) { 583 case 14:597 case A0: 584 598 /* *value = sil_reh_mem(S12AD_ADDR0_ADDR); */ 585 599 result = (arduino_ad_avelage[0] / (arduino_ad_table_count)); 586 600 break; 587 case 15:601 case A1: 588 602 /* *value = sil_reh_mem(S12AD_ADDR1_ADDR); */ 589 603 result = (arduino_ad_avelage[1] / (arduino_ad_table_count)); 590 604 break; 591 case 16:605 case A2: 592 606 /* *value = sil_reh_mem(S12AD_ADDR2_ADDR); */ 593 607 result = (arduino_ad_avelage[2] / (arduino_ad_table_count)); 594 608 break; 595 case 17:609 case A3: 596 610 /* *value = sil_reh_mem(S12AD_ADDR3_ADDR); */ 597 611 result = (arduino_ad_avelage[3] / (arduino_ad_table_count)); 598 612 break; 599 case 18:613 case A4: 600 614 /* *value = sil_reh_mem(S12AD_ADDR4_ADDR); */ 601 615 result = (arduino_ad_avelage[4] / (arduino_ad_table_count)); 602 616 break; 603 case 19:617 case A5: 604 618 /* *value = sil_reh_mem(S12AD_ADDR5_ADDR); */ 605 619 result = (arduino_ad_avelage[5] / (arduino_ad_table_count)); 606 620 break; 607 case 20:621 case A6: 608 622 /* *value = sil_reh_mem(S12AD_ADDR6_ADDR); */ 609 623 result = (arduino_ad_avelage[6] / (arduino_ad_table_count)); 610 624 break; 611 case 21:625 case A7: 612 626 /* *value = sil_reh_mem(S12AD_ADDR7_ADDR); */ 613 627 result = (arduino_ad_avelage[7] / (arduino_ad_table_count)); 614 628 break; 629 default: 630 return 0; 615 631 } 616 632 … … 677 693 /* 波形出力レベルの選択 */ 678 694 sil_wrb_mem(TPU0_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET)); 679 sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIOR L_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));695 sil_wrb_mem(TPU3_TIORH_ADDR, (5 << TPU_TIORH_IOA_OFFSET) | (5 << TPU_TIORH_IOB_OFFSET)); 680 696 sil_wrb_mem(TPU3_TIORL_ADDR, (5 << TPU_TIORL_IOC_OFFSET) | (5 << TPU_TIORL_IOD_OFFSET)); 681 sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIOR L_IOA_OFFSET) | (5 << TPU_TIORL_IOB_OFFSET));697 sil_wrb_mem(TPU4_TIOR_ADDR, (5 << TPU_TIOR_IOA_OFFSET) | (5 << TPU_TIOR_IOB_OFFSET)); 682 698 /* TGRyの設定 */ 683 699 sil_wrh_mem(TPU0_TGRA_ADDR, TPU_BASE_COUNTER); … … 714 730 } 715 731 732 typedef enum { 733 sciSerial, 734 sciI2C, 735 sciSPIM, 736 sciSPIS, 737 } sci_mode_t; 738 739 void sci_enable(void *base_address, sci_mode_t mode) 740 { 741 /* 742 * モジュールストップ機能の設定 743 */ 744 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */ 745 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR, 746 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) & ~SCI_MSTPCRB_BIT(base_address)); 747 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */ 748 749 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 750 sil_wrb_mem(SCI_SCR(base_address), 0x00U); 751 752 switch ((uint32_t)base_address) { 753 /* TXD/SDA/MOSI:P20, RXD/SCL/MISO:P21, SCK:P22 */ 754 case SCI0_BASE: 755 switch (mode) { 756 case sciSerial: 757 /* HIGH状態に設定 */ 758 sil_wrb_mem(PORT2_PODR_ADDR, 759 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT); 760 /* TX出力/RX入力ポート設定 */ 761 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT) & ~PORT_PDR_B1_BIT); 762 /* プルアップ無効 */ 763 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT)); 764 /* RX CMOS */ 765 sil_wrb_mem(PORT2_ODR0_ADDR, 766 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK)) 767 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET)); 768 /* 周辺機能として使用 */ 769 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT); 770 break; 771 case sciI2C: 772 /* HIGH状態に設定 */ 773 sil_wrb_mem(PORT2_PODR_ADDR, 774 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT); 775 /* SCL,SDA 出力ポート設定 */ 776 sil_wrb_mem(PORT2_PDR_ADDR, sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B1_BIT); 777 /* プルアップ有効 */ 778 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) | PORT_PCR_B0_BIT | PORT_PCR_B1_BIT); 779 /* Nチャネルオープンドレイン */ 780 sil_wrb_mem(PORT2_ODR0_ADDR, 781 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK)) 782 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm1_OFFSET)); 783 /* 周辺機能として使用 */ 784 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT); 785 break; 786 case sciSPIM: 787 /* HIGH状態に設定 */ 788 sil_wrb_mem(PORT2_PODR_ADDR, 789 sil_reb_mem(PORT2_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT | PORT_PODR_B2_BIT); 790 /* MOSI出力/MISO入力/SCK入出力ポート設定 */ 791 sil_wrb_mem(PORT2_PDR_ADDR, (sil_reb_mem(PORT2_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B2_BIT) & ~PORT_PDR_B1_BIT); 792 /* プルアップ無効 */ 793 sil_wrb_mem(PORT2_PCR_ADDR, sil_reb_mem(PORT2_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT | PORT_PCR_B2_BIT)); 794 /* MISO CMOS */ 795 sil_wrb_mem(PORT2_ODR0_ADDR, 796 (sil_reb_mem(PORT2_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK | PORT_ODR_Pm2_MASK)) 797 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET)); 798 /* 周辺機能として使用 */ 799 sil_wrb_mem(PORT2_PMR_ADDR, sil_reb_mem(PORT2_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT | PORT_PMR_B2_BIT); 800 break; 801 } 802 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */ 803 sil_wrb_mem(MPC_PWPR_ADDR, 0x00); 804 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */ 805 sil_wrb_mem(MPC_PWPR_ADDR, 0x40); 806 807 /* P20端子機能制御レジスタ TXD0/SMOSI0/SSDA0とする */ 808 sil_wrb_mem(MPC_P20PFS_ADDR, 0x0A); 809 /* P21端子機能制御レジスタ RXD0/SMISO0/SSCL0とする */ 810 sil_wrb_mem(MPC_P21PFS_ADDR, 0x0A); 811 if (mode == sciSPIM) { 812 /* P22端子機能制御レジスタ SCK0とする */ 813 sil_wrb_mem(MPC_P22PFS_ADDR, 0x0A); 814 } 815 816 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */ 817 sil_wrb_mem(MPC_PWPR_ADDR, 0x80); 818 break; 819 /* TXD/SDA/MOSI:P50, RXD/SCL/MISO:P52, SCK:P51 */ 820 case SCI2_BASE: 821 switch (mode) { 822 case sciSerial: 823 /* HIGH状態に設定 */ 824 sil_wrb_mem(PORT5_PODR_ADDR, 825 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B2_BIT); 826 /* TX出力/RX入力ポート設定 */ 827 sil_wrb_mem(PORT5_PDR_ADDR, (sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT) & ~PORT_PDR_B2_BIT); 828 /* プルアップ無効 */ 829 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B2_BIT)); 830 /* RX CMOS */ 831 sil_wrb_mem(PORT5_ODR0_ADDR, 832 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm2_MASK)) 833 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET)); 834 /* 周辺機能として使用 */ 835 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B2_BIT); 836 break; 837 case sciI2C: 838 /* HIGH状態に設定 */ 839 sil_wrb_mem(PORT5_PODR_ADDR, 840 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B2_BIT); 841 /* SCL,SDA 出力ポート設定 */ 842 sil_wrb_mem(PORT5_PDR_ADDR, sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B2_BIT); 843 /* プルアップ有効 */ 844 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) | PORT_PCR_B0_BIT | PORT_PCR_B2_BIT); 845 /* Nチャネルオープンドレイン */ 846 sil_wrb_mem(PORT5_ODR0_ADDR, 847 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm2_MASK)) 848 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm2_OFFSET)); 849 /* 周辺機能として使用 */ 850 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B2_BIT); 851 break; 852 case sciSPIM: 853 /* HIGH状態に設定 */ 854 sil_wrb_mem(PORT5_PODR_ADDR, 855 sil_reb_mem(PORT5_PODR_ADDR) | PORT_PODR_B0_BIT | PORT_PODR_B1_BIT | PORT_PODR_B2_BIT); 856 /* MOSI出力/MISO入力/SCK入出力ポート設定 */ 857 sil_wrb_mem(PORT5_PDR_ADDR, (sil_reb_mem(PORT5_PDR_ADDR) | PORT_PDR_B0_BIT | PORT_PDR_B1_BIT) & ~PORT_PDR_B2_BIT); 858 /* プルアップ無効 */ 859 sil_wrb_mem(PORT5_PCR_ADDR, sil_reb_mem(PORT5_PCR_ADDR) & ~(PORT_PCR_B0_BIT | PORT_PCR_B1_BIT | PORT_PCR_B2_BIT)); 860 /* MISO CMOS */ 861 sil_wrb_mem(PORT5_ODR0_ADDR, 862 (sil_reb_mem(PORT5_ODR0_ADDR) & ~(PORT_ODR_Pm0_MASK | PORT_ODR_Pm1_MASK | PORT_ODR_Pm2_MASK)) 863 | (PORT_ODR_CMOS << PORT_ODR_Pm0_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm1_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET)); 864 /* 周辺機能として使用 */ 865 sil_wrb_mem(PORT5_PMR_ADDR, sil_reb_mem(PORT5_PMR_ADDR) | PORT_PMR_B0_BIT | PORT_PMR_B1_BIT | PORT_PMR_B1_BIT | PORT_PMR_B2_BIT); 866 break; 867 } 868 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */ 869 sil_wrb_mem(MPC_PWPR_ADDR, 0x00); 870 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */ 871 sil_wrb_mem(MPC_PWPR_ADDR, 0x40); 872 873 /* P50端子機能制御レジスタ SSDA2とする */ 874 sil_wrb_mem(MPC_P50PFS_ADDR, 0x0A); 875 /* P52端子機能制御レジスタ SSCL2とする */ 876 sil_wrb_mem(MPC_P52PFS_ADDR, 0x0A); 877 if (mode == sciSPIM) { 878 /* P51端子機能制御レジスタ SCK2とする */ 879 sil_wrb_mem(MPC_P51PFS_ADDR, 0x0A); 880 } 881 882 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */ 883 sil_wrb_mem(MPC_PWPR_ADDR, 0x80); 884 break; 885 /* TXD/SDA/MOSI:P32, RXD/SCL/MISO:P33, SCK:P34 */ 886 case SCI6_BASE: 887 switch (mode) { 888 case sciSerial: 889 /* HIGH状態に設定 */ 890 sil_wrb_mem(PORT3_PODR_ADDR, 891 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT); 892 /* TX出力/RX入力ポート設定 */ 893 sil_wrb_mem(PORT3_PDR_ADDR, (sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT) & ~PORT_PDR_B3_BIT); 894 /* プルアップ無効 */ 895 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) & ~(PORT_PCR_B2_BIT | PORT_PCR_B3_BIT)); 896 /* RX CMOS */ 897 sil_wrb_mem(PORT3_ODR0_ADDR, 898 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK)) 899 | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET)); 900 /* 周辺機能として使用 */ 901 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT); 902 break; 903 case sciI2C: 904 /* HIGH状態に設定 */ 905 sil_wrb_mem(PORT3_PODR_ADDR, 906 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT); 907 /* SCL,SDA 出力ポート設定 */ 908 sil_wrb_mem(PORT3_PDR_ADDR, sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT | PORT_PDR_B3_BIT); 909 /* プルアップ有効 */ 910 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) | PORT_PCR_B2_BIT | PORT_PCR_B3_BIT); 911 /* Nチャネルオープンドレイン */ 912 sil_wrb_mem(PORT3_ODR0_ADDR, 913 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK)) 914 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm3_OFFSET)); 915 /* 周辺機能として使用 */ 916 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT); 917 break; 918 case sciSPIM: 919 /* HIGH状態に設定 */ 920 sil_wrb_mem(PORT3_PODR_ADDR, 921 sil_reb_mem(PORT3_PODR_ADDR) | PORT_PODR_B2_BIT | PORT_PODR_B3_BIT | PORT_PODR_B4_BIT); 922 /* MOSI出力/MISO入力/SCK入出力ポート設定 */ 923 sil_wrb_mem(PORT3_PDR_ADDR, (sil_reb_mem(PORT3_PDR_ADDR) | PORT_PDR_B2_BIT | PORT_PDR_B4_BIT) & ~PORT_PDR_B3_BIT); 924 /* プルアップ無効 */ 925 sil_wrb_mem(PORT3_PCR_ADDR, sil_reb_mem(PORT3_PCR_ADDR) & ~(PORT_PCR_B2_BIT | PORT_PCR_B3_BIT | PORT_PCR_B4_BIT)); 926 /* MISO CMOS */ 927 sil_wrb_mem(PORT3_ODR0_ADDR, 928 (sil_reb_mem(PORT3_ODR0_ADDR) & ~(PORT_ODR_Pm2_MASK | PORT_ODR_Pm3_MASK | PORT_ODR_Pm4_MASK)) 929 | (PORT_ODR_CMOS << PORT_ODR_Pm2_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm3_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm4_OFFSET)); 930 /* 周辺機能として使用 */ 931 sil_wrb_mem(PORT3_PMR_ADDR, sil_reb_mem(PORT3_PMR_ADDR) | PORT_PMR_B2_BIT | PORT_PMR_B3_BIT | PORT_PMR_B4_BIT); 932 break; 933 } 934 935 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */ 936 sil_wrb_mem(MPC_PWPR_ADDR, 0x00); 937 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */ 938 sil_wrb_mem(MPC_PWPR_ADDR, 0x40); 939 940 /* P32端子機能制御レジスタ TXD6/SMOSI6/SSDA6とする */ 941 sil_wrb_mem(MPC_P32PFS_ADDR, 0x0A); 942 /* P33端子機能制御レジスタ RXD6/SMISO6/SSCL6とする */ 943 sil_wrb_mem(MPC_P33PFS_ADDR, 0x0A); 944 if (mode == sciSPIM) { 945 /* P34端子機能制御レジスタ SCK6とする */ 946 sil_wrb_mem(MPC_P34PFS_ADDR, 0x0A); 947 } 948 949 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */ 950 sil_wrb_mem(MPC_PWPR_ADDR, 0x80); 951 break; 952 /* TXD/SDA/MOSI:PC7, RXD/SCL/MISO:PC6, SCK:PC5 */ 953 case SCI8_BASE: 954 switch (mode) { 955 case sciSerial: 956 /* HIGH状態に設定 */ 957 sil_wrb_mem(PORTC_PODR_ADDR, 958 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B6_BIT | PORT_PODR_B7_BIT); 959 /* TX出力/RX入力ポート設定 */ 960 sil_wrb_mem(PORTC_PDR_ADDR, (sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B6_BIT) & ~PORT_PDR_B7_BIT); 961 /* プルアップ無効 */ 962 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) & ~(PORT_PCR_B6_BIT | PORT_PCR_B7_BIT)); 963 /* RX CMOS */ 964 sil_wrb_mem(PORTC_ODR0_ADDR, 965 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK)) 966 | (PORT_ODR_CMOS << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm7_OFFSET)); 967 /* 周辺機能として使用 */ 968 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT); 969 break; 970 case sciI2C: 971 /* HIGH状態に設定 */ 972 sil_wrb_mem(PORTC_PODR_ADDR, 973 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B6_BIT | PORT_PODR_B7_BIT); 974 /* SCL,SDA 出力ポート設定 */ 975 sil_wrb_mem(PORTC_PDR_ADDR, sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B6_BIT | PORT_PDR_B7_BIT); 976 /* プルアップ有効 */ 977 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) | PORT_PCR_B6_BIT | PORT_PCR_B7_BIT); 978 /* Nチャネルオープンドレイン */ 979 sil_wrb_mem(PORTC_ODR0_ADDR, 980 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK)) 981 | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_NCH_OPEN_DRAIN << PORT_ODR_Pm7_OFFSET)); 982 /* 周辺機能として使用 */ 983 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT); 984 break; 985 case sciSPIM: 986 /* HIGH状態に設定 */ 987 sil_wrb_mem(PORTC_PODR_ADDR, 988 sil_reb_mem(PORTC_PODR_ADDR) | PORT_PODR_B7_BIT | PORT_PODR_B6_BIT | PORT_PODR_B5_BIT); 989 /* MOSI出力/MISO入力/SCK入出力ポート設定 */ 990 sil_wrb_mem(PORTC_PDR_ADDR, (sil_reb_mem(PORTC_PDR_ADDR) | PORT_PDR_B5_BIT | PORT_PDR_B7_BIT) & ~PORT_PDR_B6_BIT); 991 /* プルアップ無効 */ 992 sil_wrb_mem(PORTC_PCR_ADDR, sil_reb_mem(PORTC_PCR_ADDR) & ~(PORT_PCR_B5_BIT | PORT_PCR_B7_BIT | PORT_PCR_B6_BIT)); 993 /* MISO CMOS */ 994 sil_wrb_mem(PORTC_ODR0_ADDR, 995 (sil_reb_mem(PORTC_ODR0_ADDR) & ~(PORT_ODR_Pm5_MASK | PORT_ODR_Pm6_MASK | PORT_ODR_Pm7_MASK)) 996 | (PORT_ODR_CMOS << PORT_ODR_Pm5_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm6_OFFSET) | (PORT_ODR_CMOS << PORT_ODR_Pm7_OFFSET)); 997 /* 周辺機能として使用 */ 998 sil_wrb_mem(PORTC_PMR_ADDR, sil_reb_mem(PORTC_PMR_ADDR) | PORT_PMR_B5_BIT | PORT_PMR_B6_BIT | PORT_PMR_B7_BIT); 999 break; 1000 } 1001 1002 /* 書き込みプロテクトレジスタの設定 PFSWEビットへの書き込みを許可 */ 1003 sil_wrb_mem(MPC_PWPR_ADDR, 0x00); 1004 /* 書き込みプロテクトレジスタの設定 PxxFSレジスタへの書き込みを許可 */ 1005 sil_wrb_mem(MPC_PWPR_ADDR, 0x40); 1006 1007 /* PC7端子機能制御レジスタ TXD8/SMOSI8/SSDA8とする */ 1008 sil_wrb_mem(MPC_PC7PFS_ADDR, 0x0A); 1009 /* PC6端子機能制御レジスタ RXD8/SMISO8/SSCL8とする */ 1010 sil_wrb_mem(MPC_PC6PFS_ADDR, 0x0A); 1011 if (mode == sciSPIM) { 1012 /* PC5端子機能制御レジスタ SCK8とする */ 1013 sil_wrb_mem(MPC_PC5PFS_ADDR, 0x0A); 1014 } 1015 1016 /* 書き込みプロテクトレジスタの設定 書き込みを禁止 */ 1017 sil_wrb_mem(MPC_PWPR_ADDR, 0x80); 1018 break; 1019 } 1020 } 1021 1022 void sci_disable(void *base_address) 1023 { 1024 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 1025 sil_wrb_mem(SCI_SCR(base_address), 0x00U); 1026 1027 /* 1028 * モジュールストップ機能の設定 1029 */ 1030 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */ 1031 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR, 1032 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) | SCI_MSTPCRB_BIT(base_address)); 1033 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */ 1034 } 1035 1036 void sci_set_frequency(void *base_address, int hz) 1037 { 1038 uint_t cnt, brr, clk; 1039 1040 cnt = (FREQ_PCLK * 1000) / (16 * hz); 1041 if (cnt < 512) 1042 clk = 0; 1043 else if (cnt < 4 * 512) 1044 clk = 1; 1045 else if (cnt < 16 * 512) 1046 clk = 2; 1047 else if (cnt < 64 * 512) 1048 clk = 3; 1049 else 1050 return; 1051 1052 brr = cnt / (1 << (2 * clk)); 1053 brr = (brr / 2) + (brr % 2) - 1; 1054 1055 /* SMRに送信/ 受信フォーマットを設定 */ 1056 /* クロック選択ビット(SMR.CKS[1:0]ビットを設定)、それ以外のビットを“0”に設定します。 */ 1057 sil_wrb_mem(SCI_SMR(base_address), clk); 1058 1059 /* SCMRレジスタはSDIRビットを“1”、SINVビットを“0”、SMIFビットを“0”に設定します。 */ 1060 sil_wrb_mem(SCI_SCMR(base_address), 1061 (sil_reb_mem(SCI_SCMR(base_address)) & ~(SINV | SMIF)) | SDIR); 1062 1063 /* ビットレートを設定 */ 1064 sil_wrb_mem(SCI_BRR(base_address), brr); 1065 } 1066 716 1067 void serial_init(serial_t *obj, PinName tx, PinName rx) 717 1068 { 1069 #ifdef TOPPERS_GRCITRUS 1070 if ((rx == D0) && (tx == D1)) { 1071 obj->base_address = (void *)SCI0_BASE; 1072 obj->rxi_intno = INT_SCI0_RXI; 1073 obj->tei_intno = INT_SCI0_TEI; 1074 } 1075 else if ((rx == D5) && (tx == D6)) { 1076 obj->base_address = (void *)SCI2_BASE; 1077 obj->rxi_intno = INT_SCI2_RXI; 1078 obj->tei_intno = INT_SCI2_TEI; 1079 } 1080 else if ((rx == D7) && (tx == D8)) { 1081 obj->base_address = (void *)SCI6_BASE; 1082 obj->rxi_intno = INT_SCI6_RXI; 1083 obj->tei_intno = INT_SCI6_TEI; 1084 } 1085 else if ((rx == D11) && (tx == D12)) { 1086 obj->base_address = (void *)SCI8_BASE; 1087 obj->rxi_intno = INT_SCI8_RXI; 1088 obj->tei_intno = INT_SCI8_TEI; 1089 } 1090 else { 1091 obj->base_address = NULL; 1092 return; 1093 } 1094 #else 1095 if ((rx == D0) && (tx == D1)) { 1096 obj->base_address = (void *)SCI0_BASE; 1097 obj->rxi_intno = INT_SCI0_RXI; 1098 obj->tei_intno = INT_SCI0_TEI; 1099 } 1100 else if ((rx == D6) && (tx == D7)) { 1101 obj->base_address = (void *)SCI6_BASE; 1102 obj->rxi_intno = INT_SCI6_RXI; 1103 obj->tei_intno = INT_SCI6_TEI; 1104 } 1105 else if ((rx == D11) && (tx == D12)) { 1106 obj->base_address = (void *)SCI8_BASE; 1107 obj->rxi_intno = INT_SCI8_RXI; 1108 obj->tei_intno = INT_SCI8_TEI; 1109 } 1110 else { 1111 obj->base_address = NULL; 1112 return; 1113 } 1114 #endif // TOPPERS_GRCITRUS 1115 /* SCI有効 */ 1116 sci_enable(obj->base_address, sciSerial); 1117 1118 /* SIMR1.IICMビットを“0”に設定 */ 1119 sil_wrb_mem(SCI_SIMR1(obj->base_address), 1120 sil_reb_mem(SCI_SIMR1(obj->base_address)) & ~IICM); 1121 1122 /* SPMR.CKPH, CKPOLビットを“0”に設定 */ 1123 sil_wrb_mem(SCI_SPMR(obj->base_address), 1124 sil_reb_mem(SCI_SPMR(obj->base_address)) & ~(CKPH | CKPOL)); 1125 1126 sci_set_frequency(obj->base_address, 9600); 1127 1128 /* SMRに送信/ 受信フォーマットを設定 */ 1129 serial_format(obj, 8, ParityNone, 1); 1130 1131 /* 送受信許可 */ 1132 sil_wrb_mem(SCI_SCR(obj->base_address), 1133 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE)); 718 1134 } 719 1135 720 1136 void serial_free(serial_t *obj) 721 1137 { 1138 /* SCI無効 */ 1139 sci_disable(obj->base_address); 1140 1141 obj->base_address = NULL; 722 1142 } 723 1143 724 1144 void serial_baud(serial_t *obj, int baudrate) 725 1145 { 1146 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address)); 1147 1148 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 1149 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U); 1150 1151 sci_set_frequency(obj->base_address, baudrate); 1152 1153 /* 送受信許可 */ 1154 sil_wrb_mem(SCI_SCR(obj->base_address), scr); 726 1155 } 727 1156 728 1157 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) 729 1158 { 1159 uint8_t smr = sil_reb_mem(SCI_SMR(obj->base_address)); 1160 1161 smr &= ~(PE | PM | CHR | STOP); 1162 1163 switch (parity) { 1164 case ParityNone: 1165 break; 1166 case ParityOdd: 1167 smr |= PE | PM; 1168 break; 1169 case ParityEven: 1170 smr |= PE; 1171 break; 1172 default: 1173 break; 1174 } 1175 1176 switch (data_bits) { 1177 case 7: 1178 smr |= CHR; 1179 break; 1180 case 8: 1181 break; 1182 default: 1183 break; 1184 } 1185 1186 switch (stop_bits) { 1187 case 1: 1188 break; 1189 case 2: 1190 smr |= STOP; 1191 break; 1192 default: 1193 break; 1194 } 1195 1196 sil_wrb_mem(SCI_SMR(obj->base_address), smr); 730 1197 } 731 1198 732 1199 int serial_getc(serial_t *obj) 733 1200 { 1201 uint8_t ssr; 1202 int c; 1203 1204 for (;;) { 1205 /* SSR.ORER, PER, FERフラグをリード */ 1206 ssr = sil_reb_mem(SCI_SSR(obj->base_address)); 1207 1208 /* 受信エラーが発生したとき */ 1209 if ((ssr & (ORER | PER | FER)) != 0) { 1210 /* オーバランエラー */ 1211 if ((ssr & ORER) != 0) { 1212 /* RDRレジスタをリード */ 1213 c = (int)sil_reb_mem(SCI_RDR(obj->base_address)); 1214 } 1215 /* フレーミングエラー */ 1216 if ((ssr & FER) != 0) { 1217 } 1218 /* パリティエラー */ 1219 if ((ssr & PER) != 0) { 1220 } 1221 } 1222 1223 /* SSR.ORER, PER, FERフラグを“0”に設定 */ 1224 sil_wrb_mem(SCI_SSR(obj->base_address), ssr & ~(ORER | PER | FER)); 1225 1226 /* SSR.ORER, PER, FERフラグをリード */ 1227 ssr = sil_reb_mem(SCI_SSR(obj->base_address)); 1228 1229 /* RXI割り込み */ 1230 if (serial_readable(obj)) { 1231 clear_int(obj->rxi_intno); 1232 break; 1233 } 1234 1235 dly_tsk(10); 1236 } 1237 1238 /* RDRレジスタをリード */ 1239 c = (int)sil_reb_mem(SCI_RDR(obj->base_address)); 1240 1241 return c; 1242 } 1243 1244 void serial_putc(serial_t *obj, int c) 1245 { 1246 while (serial_writable(obj)) 1247 dly_tsk(10); 1248 1249 clear_int(obj->tei_intno); 1250 1251 sil_wrb_mem(SCI_TDR(obj->base_address), (char)c); 1252 } 1253 1254 int serial_readable(serial_t *obj) 1255 { 1256 return probe_int(obj->rxi_intno); 1257 } 1258 1259 int serial_writable(serial_t *obj) 1260 { 1261 return probe_int(obj->tei_intno); 1262 } 1263 1264 uart_irq_handler sci_irq_handler[7]; 1265 1266 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) 1267 { 1268 int no = SCI_NUM(obj->base_address); 1269 1270 sci_irq_handler[no] = handler; 1271 } 1272 1273 void i2c_init(i2c_t *obj, PinName sda, PinName scl) 1274 { 1275 if ((sda == I2C_SDA) && (scl == I2C_SCL)) { 1276 #ifdef TOPPERS_GRCITRUS 1277 obj->base_address = (void *)SCI6_BASE; 1278 obj->rxi_intno = INT_SCI6_RXI; 1279 obj->txi_intno = INT_SCI6_TXI; 1280 obj->tei_intno = INT_SCI6_TEI; 1281 #else 1282 obj->base_address = (void *)SCI2_BASE; 1283 obj->rxi_intno = INT_SCI2_RXI; 1284 obj->txi_intno = INT_SCI2_TXI; 1285 obj->tei_intno = INT_SCI2_TEI; 1286 #endif 1287 } 1288 else { 1289 obj->base_address = NULL; 1290 return; 1291 } 1292 1293 /* SCI有効 */ 1294 sci_enable(obj->base_address, sciI2C); 1295 1296 /* SIMR3.IICSDAS[1:0](b5-b4), IICSCLS[1:0](b7-b6)ビットを“11b”に設定 */ 1297 sil_wrb_mem(SCI_SIMR3(obj->base_address), 0xF0U); 1298 1299 sci_set_frequency(obj->base_address, 100000); 1300 1301 /* SEMR、SNFR、SIMR1、SIMR2、SPMRレジスタに値を設定します。 */ 1302 /* SEMRレジスタは、NFENビットを設定します。 */ 1303 sil_wrb_mem(SCI_SEMR(obj->base_address), NFEN); 1304 1305 /* SNFRレジスタは、NFCS[2:0]ビットを設定します。*/ 1306 sil_wrb_mem(SCI_SNFR(obj->base_address), 1); 1307 1308 /* SIMR1レジスタは、IICMビットを“1”に設定し、IICDL[4:0]ビ ットを設定します。 */ 1309 sil_wrb_mem(SCI_SIMR1(obj->base_address), IICM | (3 << 3)); 1310 1311 /* SIMR2レジスタは、IICACKT、IICCSCビットを“1”に設定し、IICINTMビットを設定します。 */ 1312 sil_wrb_mem(SCI_SIMR2(obj->base_address), IICACKT | IICCSC | IICINTM); 1313 1314 /* SPMRレジスタは、全ビット“0”に設定します。 */ 1315 sil_wrb_mem(SCI_SPMR(obj->base_address), 0); 1316 1317 /* 送受信許可 */ 1318 sil_wrb_mem(SCI_SCR(obj->base_address), 1319 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE)); 1320 } 1321 1322 void i2c_frequency(i2c_t *obj, int hz) 1323 { 1324 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address)); 1325 1326 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 1327 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U); 1328 1329 sci_set_frequency(obj->base_address, hz); 1330 1331 /* 送受信許可 */ 1332 sil_wrb_mem(SCI_SCR(obj->base_address), scr); 1333 } 1334 1335 int i2c_start(i2c_t *obj) 1336 { 1337 if (obj->base_address == NULL) 1338 return 0; 1339 1340 /* SIMR3.IICSTAREQビットを“1”に設定すると同時に、 1341 * SIMR3.IICSCLS[1:0],IICSDAS[1:0]ビットを“01b”に設定 */ 1342 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICSTAREQ | (1 << 4) | (1 << 6)); 1343 734 1344 return 0; 735 1345 } 736 1346 737 void serial_putc(serial_t *obj, int c) 738 { 739 } 740 741 int serial_readable(serial_t *obj) 742 { 1347 int i2c_restart(i2c_t *obj) 1348 { 1349 if (obj->base_address == NULL) 1350 return 0; 1351 1352 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICRSTAREQ | (1 << 4) | (1 << 6)); 1353 743 1354 return 0; 744 1355 } 745 1356 746 int serial_writable(serial_t *obj) 747 { 1357 int i2c_stop(i2c_t *obj) 1358 { 1359 if (obj->base_address == NULL) 1360 return 0; 1361 1362 /* SIMR3.IICSTPREQビットを“1”に設定すると同時に、 1363 * SIMR3.IICSCLS[1:0],IICSDAS[1:0]ビットを“01b”に設定 */ 1364 sil_wrb_mem(SCI_SIMR3(obj->base_address), IICSTPREQ | (1 << 4) | (1 << 6)); 1365 748 1366 return 0; 749 1367 } 750 1368 751 void i2c_init(i2c_t *obj, PinName sda, PinName scl) 752 { 753 } 754 755 void i2c_frequency(i2c_t *obj, int hz) 756 { 757 } 758 759 int i2c_start(i2c_t *obj) 760 { 1369 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) 1370 { 1371 if (obj->base_address == NULL) 1372 return 0; 1373 1374 /* 送信割り込み要求を禁止 */ 1375 sil_wrb_mem(SCI_SCR(obj->base_address), 1376 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~(RIE)) | TEIE | TIE); 1377 1378 /* 開始条件の生成 */ 1379 i2c_start(obj); 1380 1381 /* STI(TEI)割り込み発生確認 */ 1382 while (!probe_int(obj->tei_intno)) 1383 dly_tsk(2); 1384 clear_int(obj->tei_intno); 1385 1386 /* SIMR3.IICSTIFフラグを“0”に設定し、 */ 1387 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1388 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF); 1389 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“00b”に設定 */ 1390 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1391 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~((3 << 4) | (3 << 6))); 1392 1393 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */ 1394 sil_wrb_mem(SCI_TDR(obj->base_address), address | 1); 1395 1396 /* TXI割り込み発生確認 */ 1397 while (!probe_int(obj->txi_intno)) 1398 dly_tsk(10); 1399 clear_int(obj->txi_intno); 1400 1401 /* スレーブデバイスからのACKを確認 */ 1402 if ((sil_reb_mem(SCI_SISR(obj->base_address)) & IICACKR) == 0) { 1403 /* SIMR2.IICACKTビットを“0”に設定 */ 1404 sil_wrb_mem(SCI_SIMR2(obj->base_address), sil_reb_mem(SCI_SIMR2(obj->base_address)) & ~IICACKT); 1405 /* SCR.RIEビットを“1”に設定 */ 1406 sil_wrb_mem(SCI_SCR(obj->base_address), sil_reb_mem(SCI_SCR(obj->base_address)) | RIE); 1407 1408 for (int i = 0; i < length; i++) { 1409 /* 次データが最終 */ 1410 if (i == length - 1) { 1411 /* SIMR2.IICACKTビットを“1”に設定 */ 1412 sil_wrb_mem(SCI_SIMR2(obj->base_address), sil_reb_mem(SCI_SIMR2(obj->base_address)) | IICACKT); 1413 } 1414 1415 /* TDRレジスタにダミーデータ“FFh”をライト */ 1416 sil_wrb_mem(SCI_TDR(obj->base_address), 0xFF); 1417 1418 /* RXI割り込み発生確認 */ 1419 while (!probe_int(obj->rxi_intno)) 1420 dly_tsk(10); 1421 clear_int(obj->rxi_intno); 1422 1423 /* RDRレジスタの受信データをリード */ 1424 *data = sil_reb_mem(SCI_RDR(obj->base_address)); 1425 data++; 1426 1427 /* TXI割り込み発生確認 */ 1428 while (!probe_int(obj->txi_intno)) 1429 dly_tsk(10); 1430 clear_int(obj->txi_intno); 1431 } 1432 } 1433 1434 if (stop) { 1435 /* 停止条件の生成 */ 1436 i2c_stop(obj); 1437 1438 /* STI(TEI)割り込み発生確認 */ 1439 while (!probe_int(obj->tei_intno)) 1440 dly_tsk(2); 1441 clear_int(obj->tei_intno); 1442 1443 /* SIMR3.IICSTIFフラグを“0”に設定し、*/ 1444 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1445 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF); 1446 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“11b”に設定 */ 1447 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1448 sil_reb_mem(SCI_SIMR3(obj->base_address)) | ((3 << 4) | (3 << 6))); 1449 } 1450 1451 return length; 1452 } 1453 1454 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) 1455 { 1456 if (obj->base_address == NULL) 1457 return 0; 1458 1459 /* 受信割り込み要求を禁止 */ 1460 sil_wrb_mem(SCI_SCR(obj->base_address), 1461 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~(RIE)) | TEIE | TIE); 1462 1463 /* 開始条件の生成 */ 1464 i2c_start(obj); 1465 1466 /* STI(TEI)割り込み発生確認 */ 1467 while (!probe_int(obj->tei_intno)) 1468 dly_tsk(2); 1469 clear_int(obj->tei_intno); 1470 1471 /* SIMR3.IICSTIFフラグを“0”に設定し、 */ 1472 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1473 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF); 1474 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“00b”に設定 */ 1475 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1476 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~((3 << 4) | (3 << 6))); 1477 1478 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */ 1479 sil_wrb_mem(SCI_TDR(obj->base_address), address); 1480 1481 /* TXI割り込み発生確認 */ 1482 while (!probe_int(obj->txi_intno)) 1483 dly_tsk(10); 1484 clear_int(obj->txi_intno); 1485 1486 /* スレーブデバイスからのACKを確認 */ 1487 if ((sil_reb_mem(SCI_SISR(obj->base_address)) & IICACKR) == 0) { 1488 1489 for (int i = 0; i < length; i++) { 1490 /* TDRレジスタにスレーブアドレス、R/Wビットをライト */ 1491 sil_wrb_mem(SCI_TDR(obj->base_address), *data); 1492 data++; 1493 1494 /* TXI割り込み発生確認 */ 1495 while (!probe_int(obj->txi_intno)) 1496 dly_tsk(10); 1497 clear_int(obj->txi_intno); 1498 } 1499 } 1500 1501 if (stop) { 1502 /* 停止条件の生成 */ 1503 i2c_stop(obj); 1504 1505 /* STI(TEI)割り込み発生確認 */ 1506 while (!probe_int(obj->tei_intno)) 1507 dly_tsk(2); 1508 clear_int(obj->tei_intno); 1509 1510 /* SIMR3.IICSTIFフラグを“0”に設定し、*/ 1511 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1512 sil_reb_mem(SCI_SIMR3(obj->base_address)) & ~IICSTIF); 1513 /* SIMR3.IICSCLS[1:0], IICSDAS[1:0]ビットを“11b”に設定 */ 1514 sil_wrb_mem(SCI_SIMR3(obj->base_address), 1515 sil_reb_mem(SCI_SIMR3(obj->base_address)) | ((3 << 4) | (3 << 6))); 1516 } 1517 1518 return length; 1519 } 1520 1521 int i2c_byte_read(i2c_t *obj, int last) 1522 { 1523 if (obj->base_address == NULL) 1524 return 0; 1525 761 1526 return 0; 762 1527 } 763 1528 764 int i2c_stop(i2c_t *obj) 765 { 1529 int i2c_byte_write(i2c_t *obj, int data) 1530 { 1531 if (obj->base_address == NULL) 1532 return 0; 1533 766 1534 return 0; 767 1535 } 768 1536 769 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)770 {771 return 0;772 }773 774 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)775 {776 return 0;777 }778 779 int i2c_byte_read(i2c_t *obj, int last)780 {781 return 0;782 }783 784 int i2c_byte_write(i2c_t *obj, int data)785 {786 return 0;787 }788 789 1537 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) 790 1538 { 1539 if ((mosi == D11) && (miso == D12) && (sclk == D13) && ((ssel == D10) || (ssel == NC))) { 1540 obj->base_address = (void *)SCI8_BASE; 1541 obj->txi_intno = INT_SCI8_TXI; 1542 obj->rxi_intno = INT_SCI8_RXI; 1543 obj->tei_intno = INT_SCI8_TEI; 1544 } 1545 else { 1546 obj->base_address = NULL; 1547 return; 1548 } 1549 1550 /* SCI有効 */ 1551 sci_enable(obj->base_address, (ssel == D10) ? sciSPIS : sciSPIM); 1552 1553 /* SIMR1.IICMビットを“0”に設定 */ 1554 sil_wrb_mem(SCI_SIMR1(obj->base_address), 1555 sil_reb_mem(SCI_SIMR1(obj->base_address)) & ~IICM); 1556 1557 if (ssel == NC) { 1558 /* SPMR.SSE, CTSE, MSS, MFF, CKPH, CKPOLビットを“0”に設定 */ 1559 sil_wrb_mem(SCI_SPMR(obj->base_address), 0); 1560 } 1561 else { 1562 /* SPMR, CTSE, MSS, MFF, CKPH, CKPOLビットを“0”に設定 */ 1563 /* SPMR.SSEビットを“1”に設定 */ 1564 sil_wrb_mem(SCI_SPMR(obj->base_address), SSE); 1565 } 1566 1567 /* SCMR.SMIF ビットを“0”に設定 */ 1568 sil_wrb_mem(SCI_SCMR(obj->base_address), 1569 sil_reb_mem(SCI_SCMR(obj->base_address)) & ~SMIF); 1570 1571 /* SMRに送信/ 受信フォーマットをクロック同期式モードで動作で設定 */ 1572 sil_wrb_mem(SCI_SMR(obj->base_address), CM); 1573 1574 sci_set_frequency(obj->base_address, 1000000); 1575 1576 /* 送受信許可 */ 1577 sil_wrb_mem(SCI_SCR(obj->base_address), 1578 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE)); 791 1579 } 792 1580 793 1581 void spi_free(spi_t *obj) 794 1582 { 1583 /* SCI無効 */ 1584 sci_disable(obj->base_address); 1585 1586 obj->base_address = NULL; 795 1587 } 796 1588 797 1589 void spi_format(spi_t *obj, int bits, int mode, int slave) 798 1590 { 1591 int polarity = (mode & 0x2) ? 1 : 0; 1592 int phase = (mode & 0x1) ? 1 : 0; 1593 uint8_t spmr; 1594 1595 if ((bits != 8) || (mode < 0) || (mode > 3)) { 1596 return; 1597 } 1598 1599 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 1600 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U); 1601 1602 spmr = sil_reb_mem(SCI_SPMR(obj->base_address)); 1603 1604 /* クロック極性反転あり/なし */ 1605 if (polarity) 1606 spmr |= CKPOL; 1607 else 1608 spmr &= ~CKPOL; 1609 1610 /* クロック位相反転あり/なし */ 1611 if (phase) 1612 spmr |= CKPH; 1613 else 1614 spmr &= ~CKPH; 1615 1616 if (slave) { 1617 /* SCKn端子はクロック入力として使用 */ 1618 sil_wrb_mem(SCI_SCR(obj->base_address), 1619 (sil_reb_mem(SCI_SCR(obj->base_address)) & ~CKE) | 2); 1620 1621 /* SPMR.MSSビットを“1”に設定 */ 1622 sil_wrb_mem(SCI_SPMR(obj->base_address), spmr | MSS); 1623 } 1624 else { 1625 /* SCKn端子はクロック出力として使用 */ 1626 sil_wrb_mem(SCI_SCR(obj->base_address), 1627 sil_reb_mem(SCI_SCR(obj->base_address)) & ~CKE); 1628 1629 /* SPMR.MSSビットを“0”に設定 */ 1630 sil_wrb_mem(SCI_SPMR(obj->base_address), spmr & ~MSS); 1631 } 1632 1633 /* 送受信許可 */ 1634 sil_wrb_mem(SCI_SCR(obj->base_address), 1635 (sil_reb_mem(SCI_SCR(obj->base_address)) | RE | TE)); 799 1636 } 800 1637 801 1638 void spi_frequency(spi_t *obj, int hz) 802 1639 { 1640 uint8_t scr = sil_reb_mem(SCI_SCR(obj->base_address)); 1641 1642 /* 送受信禁止, SCKn端子は入出力ポートとして使用 */ 1643 sil_wrb_mem(SCI_SCR(obj->base_address), 0x00U); 1644 1645 sci_set_frequency(obj->base_address, hz); 1646 1647 /* 送受信許可 */ 1648 sil_wrb_mem(SCI_SCR(obj->base_address), scr); 803 1649 } 804 1650 805 1651 int spi_master_write(spi_t *obj, int value) 806 1652 { 807 return 0; 1653 /* TXI割り込み発生確認 */ 1654 while (!probe_int(obj->txi_intno)) 1655 ; 1656 1657 /* 送信データをライト */ 1658 sil_wrb_mem(SCI_TDR(obj->base_address), (char)value); 1659 1660 do { 1661 uint8_t ssr = sil_reb_mem(SCI_SSR(obj->base_address)); 1662 if ((ssr & ORER) != 0) { 1663 ssr &= ~ORER; 1664 sil_wrb_mem(SCI_SSR(obj->base_address), ssr); 1665 return -1; 1666 } 1667 } 1668 /* RXI割り込み発生確認 */ 1669 while (!probe_int(obj->rxi_intno)); 1670 1671 /* 受信データをリード */ 1672 return sil_reb_mem(SCI_RDR(obj->base_address)); 1673 } 1674 1675 int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, 1676 char *rx_buffer, int rx_length, char write_fill) 1677 { 1678 int total = (tx_length > rx_length) ? tx_length : rx_length; 1679 1680 for (int i = 0; i < total; i++) { 1681 char out = (i < tx_length) ? tx_buffer[i] : write_fill; 1682 char in = spi_master_write(obj, out); 1683 if (i < rx_length) { 1684 rx_buffer[i] = in; 1685 } 1686 } 1687 1688 return total; 808 1689 } 809 1690 … … 858 1739 sil_wrb_mem((uint8_t *)RTC_RSECCNT_ADDR, DecToBcd(tm.tm_sec)); 859 1740 } 1741 1742 void sci_rxi_handler(uint32_t id) 1743 { 1744 uart_irq_handler hdr = sci_irq_handler[id]; 1745 if (hdr == NULL) 1746 return; 1747 1748 hdr(id, RxIrq); 1749 } 1750 1751 void sci_txi_handler(uint32_t id) 1752 { 1753 uart_irq_handler hdr = sci_irq_handler[id]; 1754 if (hdr == NULL) 1755 return; 1756 1757 hdr(id, TxIrq); 1758 } 1759 1760 void sci_tei_handler(int no) 1761 { 1762 } 1763 1764 void sci0_rxi_handler(void) 1765 { 1766 sci_rxi_handler(0); 1767 } 1768 1769 void sci0_txi_handler(void) 1770 { 1771 sci_txi_handler(0); 1772 } 1773 1774 void sci0_tei_handler(void) 1775 { 1776 sci_tei_handler(0); 1777 } 1778 1779 void sci1_rxi_handler(void) 1780 { 1781 sci_rxi_handler(1); 1782 } 1783 1784 void sci1_txi_handler(void) 1785 { 1786 sci_txi_handler(1); 1787 } 1788 1789 void sci1_tei_handler(void) 1790 { 1791 sci_tei_handler(1); 1792 } 1793 1794 void sci2_rxi_handler(void) 1795 { 1796 sci_rxi_handler(2); 1797 } 1798 1799 void sci2_txi_handler(void) 1800 { 1801 sci_txi_handler(2); 1802 } 1803 1804 void sci2_tei_handler(void) 1805 { 1806 sci_tei_handler(2); 1807 } 1808 1809 void sci3_rxi_handler(void) 1810 { 1811 sci_rxi_handler(3); 1812 } 1813 1814 void sci3_txi_handler(void) 1815 { 1816 sci_txi_handler(3); 1817 } 1818 1819 void sci3_tei_handler(void) 1820 { 1821 sci_tei_handler(3); 1822 } 1823 1824 void sci4_rxi_handler(void) 1825 { 1826 sci_rxi_handler(4); 1827 } 1828 1829 void sci4_txi_handler(void) 1830 { 1831 sci_txi_handler(4); 1832 } 1833 1834 void sci4_tei_handler(void) 1835 { 1836 sci_tei_handler(4); 1837 } 1838 1839 void sci5_rxi_handler(void) 1840 { 1841 sci_rxi_handler(5); 1842 } 1843 1844 void sci5_txi_handler(void) 1845 { 1846 sci_txi_handler(5); 1847 } 1848 1849 void sci5_tei_handler(void) 1850 { 1851 sci_tei_handler(5); 1852 } 1853 1854 void sci6_rxi_handler(void) 1855 { 1856 sci_rxi_handler(6); 1857 } 1858 1859 void sci6_txi_handler(void) 1860 { 1861 sci_txi_handler(6); 1862 } 1863 1864 void sci6_tei_handler(void) 1865 { 1866 sci_tei_handler(6); 1867 }
Note:
See TracChangeset
for help on using the changeset viewer.