FreeCalypso > hg > fc-magnetite
comparison src/cs/drivers/drv_app/uart/uartfax.c @ 695:530f71d65c20
uartfax.c: pull from Tourmaline (GTM900 RI output)
In addition to the primary intent of bringing in GTM900 RI output support,
pulling uartfax.c wholesale from Tourmaline also changes the initial_time
argument in the two NU_Create_Timer() calls from 0 to 1. This change
is required for the new version of Nucleus used in Tourmaline and Selenite
(and apparently also used by TI in LoCosto), and it is harmless (no effect)
for the original TCS211 version of Nucleus used in Magnetite.
The new philosophical model being adopted is that Tourmaline is our new
development head firmware, whereas Magnetite will now be maintained
similarly to how Linux maintainers treat stable kernels: changes will be
backported from Tourmaline if they are deemed appropriate for stable
modem firmware.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 24 Oct 2020 17:33:10 +0000 |
parents | 005151e56328 |
children |
comparison
equal
deleted
inserted
replaced
694:005151e56328 | 695:530f71d65c20 |
---|---|
27 * DB9 Calypso+ DB9 Calypso+ | 27 * DB9 Calypso+ DB9 Calypso+ |
28 * | 28 * |
29 * 1 DCD DCD output 1 1, 6 and 4 are connected together on DB9 | 29 * 1 DCD DCD output 1 1, 6 and 4 are connected together on DB9 |
30 * 2 RX TX output 2 RX TX2 output | 30 * 2 RX TX output 2 RX TX2 output |
31 * 3 TX RX input 3 TX RX2 input | 31 * 3 TX RX input 3 TX RX2 input |
32 * 4 DTR DSR input 4 | 32 * 4 DTR DSR input 4 |
33 * 5 GND 5 GND | 33 * 5 GND 5 GND |
34 * 6 NC 6 | 34 * 6 NC 6 |
35 * 7 RTS CTS input 7 RTS CTS2 input | 35 * 7 RTS CTS input 7 RTS CTS2 input |
36 * 8 CTS RTS output 8 CTS RTS2 output | 36 * 8 CTS RTS output 8 CTS RTS2 output |
37 * 9 NC 9 NC | 37 * 9 NC 9 NC |
38 * | 38 * |
39 */ | 39 */ |
46 * DB9 Calypso DB9 Calypso | 46 * DB9 Calypso DB9 Calypso |
47 * | 47 * |
48 * 1 DCD I/O 2 output 1 1, 6 and 4 are connected together on DB9 | 48 * 1 DCD I/O 2 output 1 1, 6 and 4 are connected together on DB9 |
49 * 2 RX TX output 2 RX TX2 output | 49 * 2 RX TX output 2 RX TX2 output |
50 * 3 TX RX input 3 TX RX2 input | 50 * 3 TX RX input 3 TX RX2 input |
51 * 4 DTR I/O 3 input 4 | 51 * 4 DTR I/O 3 input 4 |
52 * 5 GND 5 GND | 52 * 5 GND 5 GND |
53 * 6 NC 6 | 53 * 6 NC 6 |
54 * 7 RTS CTS input 7 RTS CTS2 input | 54 * 7 RTS CTS input 7 RTS CTS2 input |
55 * 8 CTS RTS output 8 CTS RTS2 output | 55 * 8 CTS RTS output 8 CTS RTS2 output |
56 * 9 NC 9 NC | 56 * 9 NC 9 NC |
57 * | 57 * |
58 */ | 58 */ |
73 * 7 RTS CTS 7 7 and 8 are connected together on DB9 | 73 * 7 RTS CTS 7 7 and 8 are connected together on DB9 |
74 * 8 CTS RTS 8 | 74 * 8 CTS RTS 8 |
75 * 9 NC 9 NC | 75 * 9 NC 9 NC |
76 * | 76 * |
77 */ | 77 */ |
78 | 78 |
79 #include "swconfig.cfg" | 79 #include "swconfig.cfg" |
80 | 80 |
81 #include "l1sw.cfg" | 81 #include "l1sw.cfg" |
82 | 82 |
83 #if (OP_L1_STANDALONE == 0) | 83 #if (OP_L1_STANDALONE == 0) |
120 | 120 |
121 #ifdef CONFIG_TANGO_MODEM | 121 #ifdef CONFIG_TANGO_MODEM |
122 extern SYS_UWORD8 AI_Tango_pinmux[4]; | 122 extern SYS_UWORD8 AI_Tango_pinmux[4]; |
123 #endif | 123 #endif |
124 | 124 |
125 /* | 125 /* |
126 * Maximal value for an unsigned 32 bits. | 126 * Maximal value for an unsigned 32 bits. |
127 */ | 127 */ |
128 | 128 |
129 #define MAX_UNSIGNED_32 (4294967295) | 129 #define MAX_UNSIGNED_32 (4294967295) |
130 | 130 |
133 | 133 |
134 /* | 134 /* |
135 * TLR is used to program the RX FIFO trigger levels. FCR[7:4] are not used. | 135 * TLR is used to program the RX FIFO trigger levels. FCR[7:4] are not used. |
136 * No trigger level used for TX FIFO. THR_IT generated on TX FIFO empty. | 136 * No trigger level used for TX FIFO. THR_IT generated on TX FIFO empty. |
137 */ | 137 */ |
138 | 138 |
139 #define RX_FIFO_TRIGGER_LEVEL (12 << 4) | 139 #define RX_FIFO_TRIGGER_LEVEL (12 << 4) |
140 | 140 |
141 | 141 |
142 /* | 142 /* |
143 * 16750 addresses. Registers accessed when LCR[7] = 0. | 143 * 16750 addresses. Registers accessed when LCR[7] = 0. |
188 #define DSR_IT_BIT (5) /* Use RESET_BIT and SET_BIT macros. */ | 188 #define DSR_IT_BIT (5) /* Use RESET_BIT and SET_BIT macros. */ |
189 | 189 |
190 /* | 190 /* |
191 * Enhanced feature register. | 191 * Enhanced feature register. |
192 */ | 192 */ |
193 | 193 |
194 #define ENHANCED_FEATURE_BIT (4) /* Use RESET_BIT and SET_BIT macros. */ | 194 #define ENHANCED_FEATURE_BIT (4) /* Use RESET_BIT and SET_BIT macros. */ |
195 #define AUTO_CTS_BIT (7) /* Transmission is halted when the CTS pin is high (inactive). */ | 195 #define AUTO_CTS_BIT (7) /* Transmission is halted when the CTS pin is high (inactive). */ |
196 | 196 |
197 /* | 197 /* |
198 * Mode definition register 1. | 198 * Mode definition register 1. |
306 #define DEFAULT_GUARD_PERIOD (1000) /* 1 second. */ | 306 #define DEFAULT_GUARD_PERIOD (1000) /* 1 second. */ |
307 | 307 |
308 /* | 308 /* |
309 * 3 HISR are used to avoid to execute operations from the LISR. | 309 * 3 HISR are used to avoid to execute operations from the LISR. |
310 */ | 310 */ |
311 | 311 |
312 #define RX_HISR_PRIORITY (2) | 312 #define RX_HISR_PRIORITY (2) |
313 | 313 |
314 | 314 |
315 | 315 |
316 | 316 |
317 // NGENGE increase hisr stack otherwise overflows with multiple callbacks | 317 // NGENGE increase hisr stack otherwise overflows with multiple callbacks |
318 //#define RX_HISR_STACK_SIZE (512) /* Bytes. */ | 318 //#define RX_HISR_STACK_SIZE (512) /* Bytes. */ |
319 #define RX_HISR_STACK_SIZE (768) /* Bytes. */ | 319 #define RX_HISR_STACK_SIZE (768) /* Bytes. */ |
320 | 320 |
321 | 321 |
322 | 322 |
323 | 323 |
324 #define TX_HISR_PRIORITY (2) | 324 #define TX_HISR_PRIORITY (2) |
325 | 325 |
326 | 326 |
327 | 327 |
328 // NGENGE increase hisr stack otherwise overflows with multiple callbacks | 328 // NGENGE increase hisr stack otherwise overflows with multiple callbacks |
329 //#define TX_HISR_STACK_SIZE (512) /* Bytes. */ | 329 //#define TX_HISR_STACK_SIZE (512) /* Bytes. */ |
330 #define TX_HISR_STACK_SIZE (768) /* Bytes. */ | 330 #define TX_HISR_STACK_SIZE (768) /* Bytes. */ |
331 | 331 |
332 | 332 |
333 | 333 |
334 | 334 |
335 #define V24_HISR_PRIORITY (2) | 335 #define V24_HISR_PRIORITY (2) |
336 #define V24_HISR_STACK_SIZE (512) /* Bytes. */ | 336 #define V24_HISR_STACK_SIZE (512) /* Bytes. */ |
337 | 337 |
338 /* | 338 /* |
339 * When the break interrupt indicator (BI) is set in the line status register | 339 * When the break interrupt indicator (BI) is set in the line status register |
340 * (LSR), it indicates that the received data input was held in the low state | 340 * (LSR), it indicates that the received data input was held in the low state |
341 * for longer than a full-word transmission time. In the FIFO mode, when a break | 341 * for longer than a full-word transmission time. In the FIFO mode, when a break |
415 | 415 |
416 /* | 416 /* |
417 * Low and high watermarks for the RX buffer. If it is enabled, the flow | 417 * Low and high watermarks for the RX buffer. If it is enabled, the flow |
418 * control is activated or deactivated according to these values. | 418 * control is activated or deactivated according to these values. |
419 * The high watermark value allows to copy an array filled with the RX FIFO | 419 * The high watermark value allows to copy an array filled with the RX FIFO |
420 * into the RX buffer. | 420 * into the RX buffer. |
421 */ | 421 */ |
422 | 422 |
423 #define RX_LOW_WATERMARK(RX_BUFFER_SIZE) (FIFO_SIZE) | 423 #define RX_LOW_WATERMARK(RX_BUFFER_SIZE) (FIFO_SIZE) |
424 #define RX_HIGH_WATERMARK(RX_BUFFER_SIZE) ((RX_BUFFER_SIZE) - 2 * FIFO_SIZE) | 424 #define RX_HIGH_WATERMARK(RX_BUFFER_SIZE) ((RX_BUFFER_SIZE) - 2 * FIFO_SIZE) |
425 | 425 |
426 /* | 426 /* |
427 * This macro allows to know if the RX buffer is full. It must be called only | 427 * This macro allows to know if the RX buffer is full. It must be called only |
428 * from the RX HISR. If it is called from the application, the rx_in and | 428 * from the RX HISR. If it is called from the application, the rx_in and |
429 * rx_fifo_in pointers may be updated if a RX interrupt occurs or if the | 429 * rx_fifo_in pointers may be updated if a RX interrupt occurs or if the |
430 * RX HISR is activated. | 430 * RX HISR is activated. |
431 */ | 431 */ |
432 | 432 |
433 #define RX_BUFFER_FULL(UART) \ | 433 #define RX_BUFFER_FULL(UART) \ |
434 (((UART)->rx_in == (UART)->rx_out - 1) || \ | 434 (((UART)->rx_in == (UART)->rx_out - 1) || \ |
458 SYS_UWORD32 base_address; | 458 SYS_UWORD32 base_address; |
459 | 459 |
460 /* | 460 /* |
461 * HISR executed from the RX/TX interrupt handler. | 461 * HISR executed from the RX/TX interrupt handler. |
462 */ | 462 */ |
463 | 463 |
464 NU_HISR rx_hisr_ctrl_block; | 464 NU_HISR rx_hisr_ctrl_block; |
465 NU_HISR tx_hisr_ctrl_block; | 465 NU_HISR tx_hisr_ctrl_block; |
466 NU_HISR v24_hisr_ctrl_block; | 466 NU_HISR v24_hisr_ctrl_block; |
467 | 467 |
468 char rx_hisr_stack[RX_HISR_STACK_SIZE]; | 468 char rx_hisr_stack[RX_HISR_STACK_SIZE]; |
469 char tx_hisr_stack[TX_HISR_STACK_SIZE]; | 469 char tx_hisr_stack[TX_HISR_STACK_SIZE]; |
470 char v24_hisr_stack[V24_HISR_STACK_SIZE]; | 470 char v24_hisr_stack[V24_HISR_STACK_SIZE]; |
471 | 471 |
472 /* | 472 /* |
473 * 2 arrays are used to store bytes read in RX FIFO. A UART RX interrupt | 473 * 2 arrays are used to store bytes read in RX FIFO. A UART RX interrupt |
474 * may occur while executing RX operations in RX HISR. To avoid overwriting | 474 * may occur while executing RX operations in RX HISR. To avoid overwriting |
475 * the array in which received bytes are stored, a second array is used. | 475 * the array in which received bytes are stored, a second array is used. |
476 */ | 476 */ |
477 | 477 |
478 SYS_UWORD8 *rx_buffer_used_by_rx_lisr; | 478 SYS_UWORD8 *rx_buffer_used_by_rx_lisr; |
479 SYS_UWORD8 *rx_buffer_used_by_rx_hisr; | 479 SYS_UWORD8 *rx_buffer_used_by_rx_hisr; |
480 SYS_UWORD8 rx_fifo_byte_1[FIFO_SIZE]; | 480 SYS_UWORD8 rx_fifo_byte_1[FIFO_SIZE]; |
481 SYS_UWORD8 rx_fifo_byte_2[FIFO_SIZE]; | 481 SYS_UWORD8 rx_fifo_byte_2[FIFO_SIZE]; |
482 SYS_UWORD16 bytes_in_rx_buffer_1; | 482 SYS_UWORD16 bytes_in_rx_buffer_1; |
483 SYS_UWORD16 bytes_in_rx_buffer_2; | 483 SYS_UWORD16 bytes_in_rx_buffer_2; |
484 | 484 |
485 /* | 485 /* |
486 * RX and TX buffers. | 486 * RX and TX buffers. |
487 * One character is not used in each buffer to allow to know if the buffer | 487 * One character is not used in each buffer to allow to know if the buffer |
488 * is empty or not (See macro RX_BUFFER_FULL). If buffers are empty, | 488 * is empty or not (See macro RX_BUFFER_FULL). If buffers are empty, |
489 * rx_in = rx_out and tx_in = tx_out. It is impossible to use fields to | 489 * rx_in = rx_out and tx_in = tx_out. It is impossible to use fields to |
543 SYS_BOOL break_in_progress; | 543 SYS_BOOL break_in_progress; |
544 NU_HISR break_hisr_ctrl_block; | 544 NU_HISR break_hisr_ctrl_block; |
545 char break_hisr_stack[BREAK_HISR_STACK_SIZE]; | 545 char break_hisr_stack[BREAK_HISR_STACK_SIZE]; |
546 NU_TIMER break_timer_ctrl_block; | 546 NU_TIMER break_timer_ctrl_block; |
547 UNSIGNED baudrate; | 547 UNSIGNED baudrate; |
548 UNSIGNED autobauding; | 548 UNSIGNED autobauding; |
549 UNSIGNED bits_per_char; /* Including start, stop and parity bits. */ | 549 UNSIGNED bits_per_char; /* Including start, stop and parity bits. */ |
550 UNSIGNED break_length; /* In bytes. */ | 550 UNSIGNED break_length; /* In bytes. */ |
551 UNSIGNED time_without_character; | 551 UNSIGNED time_without_character; |
552 | 552 |
553 /* | 553 /* |
582 * the user's Rx callback function is called if the source of interrupt was | 582 * the user's Rx callback function is called if the source of interrupt was |
583 * the DTR interrupt regardless of the other conditions. | 583 * the DTR interrupt regardless of the other conditions. |
584 * The level of DTR is saved to provide the level detected on Rx interrupt | 584 * The level of DTR is saved to provide the level detected on Rx interrupt |
585 * or DTR interrupt in the 'state' parameter of the user's Rx callback | 585 * or DTR interrupt in the 'state' parameter of the user's Rx callback |
586 * function. | 586 * function. |
587 */ | 587 */ |
588 | 588 |
589 SYS_BOOL dtr_change_detected[2]; | 589 SYS_BOOL dtr_change_detected[2]; |
590 SYS_UWORD8 dtr_level_saved[2]; | 590 SYS_UWORD8 dtr_level_saved[2]; |
591 SYS_UWORD8 index_it; | 591 SYS_UWORD8 index_it; |
592 SYS_UWORD8 index_hisr; | 592 SYS_UWORD8 index_hisr; |
593 #endif /* BOARD 8 or 9 or 40 or 41 or CHIPSET 12 */ | 593 #endif /* BOARD 8 or 9 or 40 or 41 or CHIPSET 12 */ |
594 | 594 |
595 SYS_BOOL reading_suspended; | 595 SYS_BOOL reading_suspended; |
596 SYS_BOOL writing_suspended; | 596 SYS_BOOL writing_suspended; |
597 SYS_BOOL rd_call_from_hisr_in_progress; | 597 SYS_BOOL rd_call_from_hisr_in_progress; |
598 SYS_BOOL wr_call_from_hisr_in_progress; | 598 SYS_BOOL wr_call_from_hisr_in_progress; |
599 T_reInstMode rd_call_setup; | 599 T_reInstMode rd_call_setup; |
683 0, /* 203125 baud: not supported. */ | 683 0, /* 203125 baud: not supported. */ |
684 0, /* 406250 baud: not supported. */ | 684 0, /* 406250 baud: not supported. */ |
685 0 /* 812500 baud: not supported. */ | 685 0 /* 812500 baud: not supported. */ |
686 }; | 686 }; |
687 | 687 |
688 static const SYS_UWORD8 dlh[] = | 688 static const SYS_UWORD8 dlh[] = |
689 { | 689 { |
690 0, /* Auto baud: */ | 690 0, /* Auto baud: */ |
691 42, /* 75 baud. */ | 691 42, /* 75 baud. */ |
692 21, /* 150 baud. */ | 692 21, /* 150 baud. */ |
693 10, /* 300 baud. */ | 693 10, /* 300 baud. */ |
732 0, /* Not supported. */ | 732 0, /* Not supported. */ |
733 0 /* Not supported. */ | 733 0 /* Not supported. */ |
734 }; | 734 }; |
735 | 735 |
736 | 736 |
737 | 737 |
738 | 738 |
739 /******************************************************************************* | 739 /******************************************************************************* |
740 * | 740 * |
741 * get_bytes_in_rx_buffer | 741 * get_bytes_in_rx_buffer |
742 * | 742 * |
743 * Purpose : Gets the number of bytes in the RX buffer. | 743 * Purpose : Gets the number of bytes in the RX buffer. |
744 * | 744 * |
745 * Arguments: In : uart: Pointer on the UART structure. | 745 * Arguments: In : uart: Pointer on the UART structure. |
746 * Out: none | 746 * Out: none |
747 * | 747 * |
767 } | 767 } |
768 | 768 |
769 /******************************************************************************* | 769 /******************************************************************************* |
770 * | 770 * |
771 * get_bytes_in_tx_buffer | 771 * get_bytes_in_tx_buffer |
772 * | 772 * |
773 * Purpose : Gets the number of bytes in the TX buffer. | 773 * Purpose : Gets the number of bytes in the TX buffer. |
774 * | 774 * |
775 * Arguments: In : uart: Pointer on the UART structure. | 775 * Arguments: In : uart: Pointer on the UART structure. |
776 * Out: none | 776 * Out: none |
777 * | 777 * |
797 } | 797 } |
798 | 798 |
799 /******************************************************************************* | 799 /******************************************************************************* |
800 * | 800 * |
801 * compute_break_time | 801 * compute_break_time |
802 * | 802 * |
803 * Purpose : Computes a number of TDMA from 3 parameters: | 803 * Purpose : Computes a number of TDMA from 3 parameters: |
804 * - baudrate, | 804 * - baudrate, |
805 * - bits per character including start bit, stop bits and parity, | 805 * - bits per character including start bit, stop bits and parity, |
806 * - number of characters. | 806 * - number of characters. |
807 * Due to the TDMA value (4.6 ms), a minimal value is sent: 2 TDMA. | 807 * Due to the TDMA value (4.6 ms), a minimal value is sent: 2 TDMA. |
834 } | 834 } |
835 | 835 |
836 /******************************************************************************* | 836 /******************************************************************************* |
837 * | 837 * |
838 * update_reading_callback | 838 * update_reading_callback |
839 * | 839 * |
840 * Purpose : Updates the sizes array and the addresses array and get and builds | 840 * Purpose : Updates the sizes array and the addresses array and get and builds |
841 * the state parameter defined in UAF_GetLineState to call the | 841 * the state parameter defined in UAF_GetLineState to call the |
842 * readOutFunc function. | 842 * readOutFunc function. |
843 * | 843 * |
844 * Arguments: In : uart : Pointer on the UART structure. | 844 * Arguments: In : uart : Pointer on the UART structure. |
864 * A copy of rx_in is used because it may be updated by the interrupt | 864 * A copy of rx_in is used because it may be updated by the interrupt |
865 * handler if this function is called from the application. | 865 * handler if this function is called from the application. |
866 */ | 866 */ |
867 | 867 |
868 rx_in = uart->rx_in; | 868 rx_in = uart->rx_in; |
869 | 869 |
870 if (uart->rx_out < rx_in) { | 870 if (uart->rx_out < rx_in) { |
871 | 871 |
872 fragments_number = 1; | 872 fragments_number = 1; |
873 | 873 |
874 uart->rd_address[0] = uart->rx_out; | 874 uart->rd_address[0] = uart->rx_out; |
879 uart->rd_size_after_call[1] = 0; | 879 uart->rd_size_after_call[1] = 0; |
880 | 880 |
881 bytes_in_rx_buffer = uart->rd_size_before_call[0]; | 881 bytes_in_rx_buffer = uart->rd_size_before_call[0]; |
882 | 882 |
883 } else if (rx_in == uart->rx_out) { /* RX buffer empty. */ | 883 } else if (rx_in == uart->rx_out) { /* RX buffer empty. */ |
884 | 884 |
885 fragments_number = 1; | 885 fragments_number = 1; |
886 | 886 |
887 uart->rd_address[0] = uart->rx_out; | 887 uart->rd_address[0] = uart->rx_out; |
888 uart->rd_size_before_call[0] = 0; | 888 uart->rd_size_before_call[0] = 0; |
889 uart->rd_size_after_call[0] = 0; | 889 uart->rd_size_after_call[0] = 0; |
890 | 890 |
891 uart->rd_size_before_call[1] = 0; | 891 uart->rd_size_before_call[1] = 0; |
892 uart->rd_size_after_call[1] = 0; | 892 uart->rd_size_after_call[1] = 0; |
893 | 893 |
894 bytes_in_rx_buffer = 0; | 894 bytes_in_rx_buffer = 0; |
895 | 895 |
896 } else { | 896 } else { |
897 | 897 |
898 fragments_number = 2; | 898 fragments_number = 2; |
899 | 899 |
900 uart->rd_address[0] = uart->rx_out; | 900 uart->rd_address[0] = uart->rx_out; |
901 uart->rd_size_before_call[0] = | 901 uart->rd_size_before_call[0] = |
902 uart->buffer_size + 1 - (SYS_UWORD16) (uart->rx_out - | 902 uart->buffer_size + 1 - (SYS_UWORD16) (uart->rx_out - |
968 if (uart->flow_control_mode != fc_rts) | 968 if (uart->flow_control_mode != fc_rts) |
969 state |= (((SYS_UWORD32) uart->rts_level) << SB); | 969 state |= (((SYS_UWORD32) uart->rts_level) << SB); |
970 | 970 |
971 if (uart->flow_control_mode == fc_rts) | 971 if (uart->flow_control_mode == fc_rts) |
972 state |= (((SYS_UWORD32) uart->rts_level) << X); | 972 state |= (((SYS_UWORD32) uart->rts_level) << X); |
973 | 973 |
974 else if ((uart->flow_control_mode == fc_xoff) && | 974 else if ((uart->flow_control_mode == fc_xoff) && |
975 (uart->tx_stopped_by_application || | 975 (uart->tx_stopped_by_application || |
976 uart->tx_stopped_by_driver)) | 976 uart->tx_stopped_by_driver)) |
977 state |= (1 << X); | 977 state |= (1 << X); |
978 | 978 |
991 } | 991 } |
992 | 992 |
993 /******************************************************************************* | 993 /******************************************************************************* |
994 * | 994 * |
995 * update_writing_callback | 995 * update_writing_callback |
996 * | 996 * |
997 * Purpose : Updates the sizes array and the addresses array to call the | 997 * Purpose : Updates the sizes array and the addresses array to call the |
998 * writeInFunc function. | 998 * writeInFunc function. |
999 * | 999 * |
1000 * Arguments: In : uart : Pointer on the UART structure. | 1000 * Arguments: In : uart : Pointer on the UART structure. |
1001 * call_source: 0: application, 1: HISR | 1001 * call_source: 0: application, 1: HISR |
1017 * A copy of tx_out is used because it may be updated by the interrupt | 1017 * A copy of tx_out is used because it may be updated by the interrupt |
1018 * handler if this function is called from the application. | 1018 * handler if this function is called from the application. |
1019 */ | 1019 */ |
1020 | 1020 |
1021 tx_out = uart->tx_out; | 1021 tx_out = uart->tx_out; |
1022 | 1022 |
1023 if (uart->tx_in < tx_out) { | 1023 if (uart->tx_in < tx_out) { |
1024 | 1024 |
1025 fragments_number = 1; | 1025 fragments_number = 1; |
1026 | 1026 |
1027 uart->wr_address[0] = uart->tx_in; | 1027 uart->wr_address[0] = uart->tx_in; |
1029 (SYS_UWORD16) (tx_out - uart->tx_in - 1); | 1029 (SYS_UWORD16) (tx_out - uart->tx_in - 1); |
1030 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; | 1030 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; |
1031 | 1031 |
1032 uart->wr_size_before_call[1] = 0; | 1032 uart->wr_size_before_call[1] = 0; |
1033 uart->wr_size_after_call[1] = 0; | 1033 uart->wr_size_after_call[1] = 0; |
1034 | 1034 |
1035 } else if (tx_out == &(uart->tx_buffer[0])) { | 1035 } else if (tx_out == &(uart->tx_buffer[0])) { |
1036 | 1036 |
1037 fragments_number = 1; | 1037 fragments_number = 1; |
1038 | 1038 |
1039 uart->wr_address[0] = uart->tx_in; | 1039 uart->wr_address[0] = uart->tx_in; |
1040 uart->wr_size_before_call[0] = | 1040 uart->wr_size_before_call[0] = |
1041 uart->buffer_size - | 1041 uart->buffer_size - |
1042 (SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0])); | 1042 (SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0])); |
1043 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; | 1043 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; |
1044 | 1044 |
1045 uart->wr_size_before_call[1] = 0; | 1045 uart->wr_size_before_call[1] = 0; |
1046 uart->wr_size_after_call[1] = 0; | 1046 uart->wr_size_after_call[1] = 0; |
1047 | 1047 |
1048 } else { | 1048 } else { |
1049 | 1049 |
1050 fragments_number = 2; | 1050 fragments_number = 2; |
1051 | 1051 |
1052 uart->wr_address[0] = uart->tx_in; | 1052 uart->wr_address[0] = uart->tx_in; |
1053 uart->wr_size_before_call[0] = | 1053 uart->wr_size_before_call[0] = |
1054 uart->buffer_size + 1 - | 1054 uart->buffer_size + 1 - |
1055 (SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0])); | 1055 (SYS_UWORD16) (uart->tx_in - &(uart->tx_buffer[0])); |
1056 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; | 1056 uart->wr_size_after_call[0] = uart->wr_size_before_call[0]; |
1057 | 1057 |
1058 uart->wr_address[1] = &(uart->tx_buffer[0]); | 1058 uart->wr_address[1] = &(uart->tx_buffer[0]); |
1059 uart->wr_size_before_call[1] = | 1059 uart->wr_size_before_call[1] = |
1078 } | 1078 } |
1079 | 1079 |
1080 /******************************************************************************* | 1080 /******************************************************************************* |
1081 * | 1081 * |
1082 * stop_break | 1082 * stop_break |
1083 * | 1083 * |
1084 * Purpose : The timer is activated to expire when a time corresponding to the | 1084 * Purpose : The timer is activated to expire when a time corresponding to the |
1085 * sending time of 2 characters at least has elapsed. After a break, | 1085 * sending time of 2 characters at least has elapsed. After a break, |
1086 * no character may be sent during this period. | 1086 * no character may be sent during this period. |
1087 * | 1087 * |
1088 * Arguments: In : id: parameter not used. | 1088 * Arguments: In : id: parameter not used. |
1104 | 1104 |
1105 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 1105 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
1106 /* | 1106 /* |
1107 * Disable sleep mode. | 1107 * Disable sleep mode. |
1108 */ | 1108 */ |
1109 | 1109 |
1110 WRITE_UART_REGISTER ( | 1110 WRITE_UART_REGISTER ( |
1111 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 1111 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
1112 #endif | 1112 #endif |
1113 | 1113 |
1114 /* | 1114 /* |
1120 } | 1120 } |
1121 | 1121 |
1122 /******************************************************************************* | 1122 /******************************************************************************* |
1123 * | 1123 * |
1124 * hisr_start_break | 1124 * hisr_start_break |
1125 * | 1125 * |
1126 * Purpose : Enables the timer used to control the time without character. | 1126 * Purpose : Enables the timer used to control the time without character. |
1127 * | 1127 * |
1128 * Arguments: In : none | 1128 * Arguments: In : none |
1129 * Out: none | 1129 * Out: none |
1130 * | 1130 * |
1153 } | 1153 } |
1154 | 1154 |
1155 /******************************************************************************* | 1155 /******************************************************************************* |
1156 * | 1156 * |
1157 * stop_receiver | 1157 * stop_receiver |
1158 * | 1158 * |
1159 * Purpose : Activates DTR or RTS or sends XOFF. | 1159 * Purpose : Activates DTR or RTS or sends XOFF. |
1160 * | 1160 * |
1161 * Arguments: In : uart: Pointer on the UART structure. | 1161 * Arguments: In : uart: Pointer on the UART structure. |
1162 * Out: none | 1162 * Out: none |
1163 * | 1163 * |
1164 * Returns : none | 1164 * Returns : none |
1170 { | 1170 { |
1171 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 1171 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
1172 /* | 1172 /* |
1173 * Disable sleep mode. | 1173 * Disable sleep mode. |
1174 */ | 1174 */ |
1175 | 1175 |
1176 WRITE_UART_REGISTER ( | 1176 WRITE_UART_REGISTER ( |
1177 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 1177 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
1178 #endif | 1178 #endif |
1179 | 1179 |
1180 switch (uart->flow_control_mode) { | 1180 switch (uart->flow_control_mode) { |
1195 uart->send_xon_xoff = 1; | 1195 uart->send_xon_xoff = 1; |
1196 | 1196 |
1197 /* | 1197 /* |
1198 * Unmask Tx interrupt. | 1198 * Unmask Tx interrupt. |
1199 */ | 1199 */ |
1200 | 1200 |
1201 WRITE_UART_REGISTER ( | 1201 WRITE_UART_REGISTER ( |
1202 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 1202 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
1203 break; | 1203 break; |
1204 } | 1204 } |
1205 } | 1205 } |
1206 | 1206 |
1207 /******************************************************************************* | 1207 /******************************************************************************* |
1208 * | 1208 * |
1209 * start_receiver | 1209 * start_receiver |
1210 * | 1210 * |
1211 * Purpose : Deactivates DTR or RTS or sends XON. | 1211 * Purpose : Deactivates DTR or RTS or sends XON. |
1212 * | 1212 * |
1213 * Arguments: In : uart: Pointer on the UART structure. | 1213 * Arguments: In : uart: Pointer on the UART structure. |
1214 * Out: none | 1214 * Out: none |
1215 * | 1215 * |
1222 { | 1222 { |
1223 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 1223 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
1224 /* | 1224 /* |
1225 * Disable sleep mode. | 1225 * Disable sleep mode. |
1226 */ | 1226 */ |
1227 | 1227 |
1228 WRITE_UART_REGISTER ( | 1228 WRITE_UART_REGISTER ( |
1229 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 1229 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
1230 #endif | 1230 #endif |
1231 | 1231 |
1232 switch (uart->flow_control_mode) { | 1232 switch (uart->flow_control_mode) { |
1247 uart->send_xon_xoff = 1; | 1247 uart->send_xon_xoff = 1; |
1248 | 1248 |
1249 /* | 1249 /* |
1250 * Unmask Tx interrupt. | 1250 * Unmask Tx interrupt. |
1251 */ | 1251 */ |
1252 | 1252 |
1253 WRITE_UART_REGISTER ( | 1253 WRITE_UART_REGISTER ( |
1254 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 1254 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
1255 break; | 1255 break; |
1256 } | 1256 } |
1257 } | 1257 } |
1258 | 1258 |
1259 /******************************************************************************* | 1259 /******************************************************************************* |
1260 * | 1260 * |
1261 * add_esc_seq_char_in_rx_buffer | 1261 * add_esc_seq_char_in_rx_buffer |
1262 * | 1262 * |
1263 * Purpose : Writes one escape sequence character in the RX buffer. | 1263 * Purpose : Writes one escape sequence character in the RX buffer. |
1264 * | 1264 * |
1265 * Arguments: In : uart: Pointer on the UART structure. | 1265 * Arguments: In : uart: Pointer on the UART structure. |
1266 * Out: none | 1266 * Out: none |
1267 * | 1267 * |
1287 } | 1287 } |
1288 | 1288 |
1289 /******************************************************************************* | 1289 /******************************************************************************* |
1290 * | 1290 * |
1291 * analyze_guard_period_timer_expiration | 1291 * analyze_guard_period_timer_expiration |
1292 * | 1292 * |
1293 * Purpose : According to the state of the escape sequence detection, 1 or 2 | 1293 * Purpose : According to the state of the escape sequence detection, 1 or 2 |
1294 * escape sequence characters may be written into the TX buffer or | 1294 * escape sequence characters may be written into the TX buffer or |
1295 * the escape sequence is declared as detected. | 1295 * the escape sequence is declared as detected. |
1296 * If 1 or 2 escape sequence characters have been detected the | 1296 * If 1 or 2 escape sequence characters have been detected the |
1297 * guard period must not expire. | 1297 * guard period must not expire. |
1299 * expire. | 1299 * expire. |
1300 * | 1300 * |
1301 * Arguments: In : id: parameter not used. | 1301 * Arguments: In : id: parameter not used. |
1302 * Out: none | 1302 * Out: none |
1303 * | 1303 * |
1304 * Returns : none | 1304 * Returns : none |
1305 * | 1305 * |
1306 ******************************************************************************/ | 1306 ******************************************************************************/ |
1307 | 1307 |
1308 static VOID | 1308 static VOID |
1309 analyze_guard_period_timer_expiration (UNSIGNED id) | 1309 analyze_guard_period_timer_expiration (UNSIGNED id) |
1312 SYS_UWORD16 bytes_in_rx_buffer; | 1312 SYS_UWORD16 bytes_in_rx_buffer; |
1313 | 1313 |
1314 uart = &uart_parameters; | 1314 uart = &uart_parameters; |
1315 | 1315 |
1316 switch (uart->esc_seq_detection_state) { | 1316 switch (uart->esc_seq_detection_state) { |
1317 | 1317 |
1318 case ONE_CHAR_DETECTED: | 1318 case ONE_CHAR_DETECTED: |
1319 | 1319 |
1320 /* | 1320 /* |
1321 * 1 escape sequence character has been detected. The guard period has | 1321 * 1 escape sequence character has been detected. The guard period has |
1322 * ellapsed. This character is written into the TX buffer. | 1322 * ellapsed. This character is written into the TX buffer. |
1323 */ | 1323 */ |
1324 | 1324 |
1325 add_esc_seq_char_in_rx_buffer (uart); | 1325 add_esc_seq_char_in_rx_buffer (uart); |
1326 break; | 1326 break; |
1327 | 1327 |
1328 case TWO_CHARS_DETECTED: | 1328 case TWO_CHARS_DETECTED: |
1329 | 1329 |
1330 /* | 1330 /* |
1331 * 2 escape sequence characters have been detected. The guard period has | 1331 * 2 escape sequence characters have been detected. The guard period has |
1332 * ellapsed. These characters are written into the TX buffer. | 1332 * ellapsed. These characters are written into the TX buffer. |
1333 */ | 1333 */ |
1334 | 1334 |
1335 add_esc_seq_char_in_rx_buffer (uart); | 1335 add_esc_seq_char_in_rx_buffer (uart); |
1336 add_esc_seq_char_in_rx_buffer (uart); | 1336 add_esc_seq_char_in_rx_buffer (uart); |
1337 | 1337 |
1338 break; | 1338 break; |
1339 | 1339 |
1340 case THREE_CHARS_DETECTED: | 1340 case THREE_CHARS_DETECTED: |
1341 | 1341 |
1342 /* | 1342 /* |
1343 * 3 escape sequence characters have been detected and the guard period | 1343 * 3 escape sequence characters have been detected and the guard period |
1344 * has ellapsed. The escape sequence is detected. | 1344 * has ellapsed. The escape sequence is detected. |
1345 */ | 1345 */ |
1346 | 1346 |
1347 uart->esc_seq_received = 1; | 1347 uart->esc_seq_received = 1; |
1348 *(uart->state) |= (1 << ESC); | 1348 *(uart->state) |= (1 << ESC); |
1349 | 1349 |
1350 break; | 1350 break; |
1351 } | 1351 } |
1352 | 1352 |
1353 uart->esc_seq_detection_state = NO_ESCAPE_SEQUENCE; | 1353 uart->esc_seq_detection_state = NO_ESCAPE_SEQUENCE; |
1354 | 1354 |
1355 /* | 1355 /* |
1356 * If the high watermark is reached, RTS is activated or XOFF is sent | 1356 * If the high watermark is reached, RTS is activated or XOFF is sent |
1357 * according to the flow control mode. | 1357 * according to the flow control mode. |
1358 */ | 1358 */ |
1359 | 1359 |
1401 } | 1401 } |
1402 | 1402 |
1403 /******************************************************************************* | 1403 /******************************************************************************* |
1404 * | 1404 * |
1405 * stop_guard_period_timer | 1405 * stop_guard_period_timer |
1406 * | 1406 * |
1407 * Purpose : Stops the timer used to detect the guard period expiration. | 1407 * Purpose : Stops the timer used to detect the guard period expiration. |
1408 * | 1408 * |
1409 * Arguments: In : uart: Pointer on the UART structure. | 1409 * Arguments: In : uart: Pointer on the UART structure. |
1410 * Out: none | 1410 * Out: none |
1411 * | 1411 * |
1412 * Returns : none | 1412 * Returns : none |
1413 * | 1413 * |
1414 ******************************************************************************/ | 1414 ******************************************************************************/ |
1415 | 1415 |
1416 static void | 1416 static void |
1417 stop_guard_period_timer (t_uart *uart) | 1417 stop_guard_period_timer (t_uart *uart) |
1421 } | 1421 } |
1422 | 1422 |
1423 /******************************************************************************* | 1423 /******************************************************************************* |
1424 * | 1424 * |
1425 * start_guard_period_timer | 1425 * start_guard_period_timer |
1426 * | 1426 * |
1427 * Purpose : Starts a timer which expires if the guard period has ellapsed. | 1427 * Purpose : Starts a timer which expires if the guard period has ellapsed. |
1428 * | 1428 * |
1429 * Arguments: In : uart: Pointer on the UART structure. | 1429 * Arguments: In : uart: Pointer on the UART structure. |
1430 * Out: none | 1430 * Out: none |
1431 * | 1431 * |
1432 * Returns : none | 1432 * Returns : none |
1433 * | 1433 * |
1434 ******************************************************************************/ | 1434 ******************************************************************************/ |
1435 | 1435 |
1436 static void | 1436 static void |
1437 start_guard_period_timer (t_uart *uart) | 1437 start_guard_period_timer (t_uart *uart) |
1450 } | 1450 } |
1451 | 1451 |
1452 /******************************************************************************* | 1452 /******************************************************************************* |
1453 * | 1453 * |
1454 * detect_escape_sequence | 1454 * detect_escape_sequence |
1455 * | 1455 * |
1456 * Purpose : The state machine used to detect an escape sequence is updated | 1456 * Purpose : The state machine used to detect an escape sequence is updated |
1457 * according to the array of bytes to analyse. If the state machine | 1457 * according to the array of bytes to analyse. If the state machine |
1458 * goes to the initial state due to a break in the sequence | 1458 * goes to the initial state due to a break in the sequence |
1459 * detection, the previous characters are put into the RX buffer. | 1459 * detection, the previous characters are put into the RX buffer. |
1460 * | 1460 * |
1461 * Arguments: In : uart: Pointer on the UART structure. | 1461 * Arguments: In : uart: Pointer on the UART structure. |
1462 * Out: none | 1462 * Out: none |
1463 * | 1463 * |
1464 * Returns : 0: Break in detection or a sequence has been detected. | 1464 * Returns : 0: Break in detection or a sequence has been detected. |
1465 * 1: A sequence may be detected. | 1465 * 1: A sequence may be detected. |
1466 * | 1466 * |
1467 ******************************************************************************/ | 1467 ******************************************************************************/ |
1468 | 1468 |
1469 static int | 1469 static int |
1521 switch (bytes_in_rx_buffer) { | 1521 switch (bytes_in_rx_buffer) { |
1522 | 1522 |
1523 case 1: | 1523 case 1: |
1524 | 1524 |
1525 if (*rx_fifo_byte++ == uart->esc_seq_character) { | 1525 if (*rx_fifo_byte++ == uart->esc_seq_character) { |
1526 | 1526 |
1527 uart->esc_seq_detection_state = ONE_CHAR_DETECTED; | 1527 uart->esc_seq_detection_state = ONE_CHAR_DETECTED; |
1528 start_guard_period_timer (uart); | 1528 start_guard_period_timer (uart); |
1529 detection_result = 1; | 1529 detection_result = 1; |
1530 } | 1530 } |
1531 | 1531 |
1533 | 1533 |
1534 case 2: | 1534 case 2: |
1535 | 1535 |
1536 if ((*rx_fifo_byte++ == uart->esc_seq_character) && | 1536 if ((*rx_fifo_byte++ == uart->esc_seq_character) && |
1537 (*rx_fifo_byte++ == uart->esc_seq_character)) { | 1537 (*rx_fifo_byte++ == uart->esc_seq_character)) { |
1538 | 1538 |
1539 uart->esc_seq_detection_state = TWO_CHARS_DETECTED; | 1539 uart->esc_seq_detection_state = TWO_CHARS_DETECTED; |
1540 start_guard_period_timer (uart); | 1540 start_guard_period_timer (uart); |
1541 detection_result = 1; | 1541 detection_result = 1; |
1542 } | 1542 } |
1543 | 1543 |
1544 break; | 1544 break; |
1545 | 1545 |
1546 case 3: | 1546 case 3: |
1547 | 1547 |
1548 if ((*rx_fifo_byte++ == uart->esc_seq_character) && | 1548 if ((*rx_fifo_byte++ == uart->esc_seq_character) && |
1549 (*rx_fifo_byte++ == uart->esc_seq_character) && | 1549 (*rx_fifo_byte++ == uart->esc_seq_character) && |
1550 (*rx_fifo_byte++ == uart->esc_seq_character)) { | 1550 (*rx_fifo_byte++ == uart->esc_seq_character)) { |
1551 | 1551 |
1552 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; | 1552 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; |
1553 start_guard_period_timer (uart); | 1553 start_guard_period_timer (uart); |
1554 detection_result = 1; | 1554 detection_result = 1; |
1555 } | 1555 } |
1556 | 1556 |
1557 break; | 1557 break; |
1558 | 1558 |
1559 default: | 1559 default: |
1560 | 1560 |
1561 /* | 1561 /* |
1562 * No action. | 1562 * No action. |
1563 */ | 1563 */ |
1564 | 1564 |
1565 break; | 1565 break; |
1585 switch (bytes_in_rx_buffer) { | 1585 switch (bytes_in_rx_buffer) { |
1586 | 1586 |
1587 case 1: | 1587 case 1: |
1588 | 1588 |
1589 if (*rx_fifo_byte++ == uart->esc_seq_character) { | 1589 if (*rx_fifo_byte++ == uart->esc_seq_character) { |
1590 | 1590 |
1591 uart->esc_seq_detection_state = TWO_CHARS_DETECTED; | 1591 uart->esc_seq_detection_state = TWO_CHARS_DETECTED; |
1592 detection_result = 1; | 1592 detection_result = 1; |
1593 } | 1593 } |
1594 | 1594 |
1595 break; | 1595 break; |
1596 | 1596 |
1597 case 2: | 1597 case 2: |
1598 | 1598 |
1599 if ((*rx_fifo_byte++ == uart->esc_seq_character) && | 1599 if ((*rx_fifo_byte++ == uart->esc_seq_character) && |
1600 (*rx_fifo_byte++ == uart->esc_seq_character)) { | 1600 (*rx_fifo_byte++ == uart->esc_seq_character)) { |
1601 | 1601 |
1602 start_guard_period_timer (uart); /* Reset the timer. */ | 1602 start_guard_period_timer (uart); /* Reset the timer. */ |
1603 | 1603 |
1604 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; | 1604 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; |
1605 detection_result = 1; | 1605 detection_result = 1; |
1606 } | 1606 } |
1607 | 1607 |
1608 break; | 1608 break; |
1609 | 1609 |
1610 default: | 1610 default: |
1611 | 1611 |
1612 /* | 1612 /* |
1644 case 1: | 1644 case 1: |
1645 | 1645 |
1646 if (*rx_fifo_byte++ == uart->esc_seq_character) { | 1646 if (*rx_fifo_byte++ == uart->esc_seq_character) { |
1647 | 1647 |
1648 start_guard_period_timer (uart); /* Reset the timer. */ | 1648 start_guard_period_timer (uart); /* Reset the timer. */ |
1649 | 1649 |
1650 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; | 1650 uart->esc_seq_detection_state = THREE_CHARS_DETECTED; |
1651 detection_result = 1; | 1651 detection_result = 1; |
1652 } | 1652 } |
1653 | 1653 |
1654 break; | 1654 break; |
1655 | 1655 |
1656 default: | 1656 default: |
1657 | 1657 |
1658 /* | 1658 /* |
1698 } | 1698 } |
1699 | 1699 |
1700 /******************************************************************************* | 1700 /******************************************************************************* |
1701 * | 1701 * |
1702 * send_break | 1702 * send_break |
1703 * | 1703 * |
1704 * Purpose : This function may only called if the TX FIFO is empty. | 1704 * Purpose : This function may only called if the TX FIFO is empty. |
1705 * Null characters are written in the TX FIFO. The number of bytes to | 1705 * Null characters are written in the TX FIFO. The number of bytes to |
1706 * write has been defined with UAF_SetLineState. Enables the break | 1706 * write has been defined with UAF_SetLineState. Enables the break |
1707 * condition. | 1707 * condition. |
1708 * | 1708 * |
1730 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 1730 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
1731 #endif | 1731 #endif |
1732 | 1732 |
1733 WRITE_UART_REGISTER ( | 1733 WRITE_UART_REGISTER ( |
1734 uart, LCR, READ_UART_REGISTER (uart, LCR) | BREAK_CONTROL); | 1734 uart, LCR, READ_UART_REGISTER (uart, LCR) | BREAK_CONTROL); |
1735 | 1735 |
1736 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 1736 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
1737 /* | 1737 /* |
1738 * Re-enable sleep mode. | 1738 * Re-enable sleep mode. |
1739 */ | 1739 */ |
1740 | 1740 |
1757 } | 1757 } |
1758 | 1758 |
1759 /******************************************************************************* | 1759 /******************************************************************************* |
1760 * | 1760 * |
1761 * build_rx_fifo_array | 1761 * build_rx_fifo_array |
1762 * | 1762 * |
1763 * Purpose : Reads the RX FIFO to build an array with bytes read. | 1763 * Purpose : Reads the RX FIFO to build an array with bytes read. |
1764 * A byte is written in this array if no error is detected. | 1764 * A byte is written in this array if no error is detected. |
1765 * | 1765 * |
1766 * Arguments: In : uart: Pointer on the UART structure. | 1766 * Arguments: In : uart: Pointer on the UART structure. |
1767 * Out: none | 1767 * Out: none |
1768 * | 1768 * |
1769 * Returns : The number of bytes in RX FIFO. | 1769 * Returns : The number of bytes in RX FIFO. |
1783 volatile int x; | 1783 volatile int x; |
1784 | 1784 |
1785 x = 1; | 1785 x = 1; |
1786 | 1786 |
1787 bytes_received = 0; | 1787 bytes_received = 0; |
1788 | 1788 |
1789 | 1789 |
1790 /* | 1790 /* |
1791 * Switch to the other buffer. | 1791 * Switch to the other buffer. |
1792 */ | 1792 */ |
1793 | 1793 |
1794 first_byte = uart->rx_buffer_used_by_rx_lisr; | 1794 first_byte = uart->rx_buffer_used_by_rx_lisr; |
1795 if (first_byte == &(uart->rx_fifo_byte_1[0])) { | 1795 if (first_byte == &(uart->rx_fifo_byte_1[0])) { |
1796 | 1796 |
1797 first_byte = &(uart->rx_fifo_byte_2[0]); | 1797 first_byte = &(uart->rx_fifo_byte_2[0]); |
1798 bytes_in_rx_buffer = &(uart->bytes_in_rx_buffer_2); | 1798 bytes_in_rx_buffer = &(uart->bytes_in_rx_buffer_2); |
1799 | 1799 |
1800 } else { | 1800 } else { |
1801 | 1801 |
1802 first_byte = &(uart->rx_fifo_byte_1[0]); | 1802 first_byte = &(uart->rx_fifo_byte_1[0]); |
1803 bytes_in_rx_buffer = &(uart->bytes_in_rx_buffer_1); | 1803 bytes_in_rx_buffer = &(uart->bytes_in_rx_buffer_1); |
1804 } | 1804 } |
1805 | 1805 |
1806 current_byte = first_byte; | 1806 current_byte = first_byte; |
1807 | 1807 |
1808 if (*bytes_in_rx_buffer) { | 1808 if (*bytes_in_rx_buffer) { |
1809 | 1809 |
1810 | 1810 |
1811 /* The Rx buffer is not empty and is being used by HISR ! */ | 1811 /* The Rx buffer is not empty and is being used by HISR ! */ |
1812 /* Hence stop the flow control */ | 1812 /* Hence stop the flow control */ |
1813 stop_receiver (uart); | 1813 stop_receiver (uart); |
1814 | 1814 |
1815 /* | 1815 /* |
1816 * Reset LCR[7] (DLAB) to have access to the RBR, THR and IER registers. | 1816 * Reset LCR[7] (DLAB) to have access to the RBR, THR and IER registers. |
1817 */ | 1817 */ |
1818 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 1818 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
1819 | 1819 |
1820 /* Mask The Rx and interrupt */ | 1820 /* Mask The Rx and interrupt */ |
1821 | 1821 |
1822 WRITE_UART_REGISTER ( | 1822 WRITE_UART_REGISTER ( |
1823 uart, IER, READ_UART_REGISTER (uart, IER) & | 1823 uart, IER, READ_UART_REGISTER (uart, IER) & |
1824 ~(ERBI | EDSSI)); | 1824 ~(ERBI | EDSSI)); |
1825 | 1825 |
1826 uart->rx_stopped_by_lisr = 1; | 1826 uart->rx_stopped_by_lisr = 1; |
1827 return (bytes_received); | 1827 return (bytes_received); |
1828 | 1828 |
1829 } | 1829 } |
1830 | 1830 |
1831 uart->rx_buffer_used_by_rx_lisr = first_byte; | 1831 uart->rx_buffer_used_by_rx_lisr = first_byte; |
1832 | 1832 |
1833 status = READ_UART_REGISTER (uart, LSR); | 1833 status = READ_UART_REGISTER (uart, LSR); |
1834 | 1834 |
1835 /* | 1835 /* |
1836 * Build an array with the bytes contained in the RX FIFO. | 1836 * Build an array with the bytes contained in the RX FIFO. |
1837 */ | 1837 */ |
1860 /* | 1860 /* |
1861 * Check break detection. | 1861 * Check break detection. |
1862 */ | 1862 */ |
1863 | 1863 |
1864 if (status & BI) { | 1864 if (status & BI) { |
1865 | 1865 |
1866 uart->break_received = 1; | 1866 uart->break_received = 1; |
1867 *(uart->state) |= | 1867 *(uart->state) |= |
1868 ((1 << BRK) | (MINIMAL_BREAK_LENGTH << BRKLEN)); | 1868 ((1 << BRK) | (MINIMAL_BREAK_LENGTH << BRKLEN)); |
1869 } | 1869 } |
1870 | 1870 |
1871 } else /* No error */ | 1871 } else /* No error */ |
1872 current_byte++; | 1872 current_byte++; |
1873 | 1873 |
1874 status = READ_UART_REGISTER (uart, LSR); | 1874 status = READ_UART_REGISTER (uart, LSR); |
1875 } | 1875 } |
1876 | 1876 |
1880 /* | 1880 /* |
1881 * Re-switch to the other buffer if no valid character has been received. | 1881 * Re-switch to the other buffer if no valid character has been received. |
1882 */ | 1882 */ |
1883 | 1883 |
1884 if (!bytes_received) { | 1884 if (!bytes_received) { |
1885 | 1885 |
1886 if (uart->rx_buffer_used_by_rx_lisr == &(uart->rx_fifo_byte_1[0])) | 1886 if (uart->rx_buffer_used_by_rx_lisr == &(uart->rx_fifo_byte_1[0])) |
1887 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_2[0]); | 1887 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_2[0]); |
1888 | 1888 |
1889 else | 1889 else |
1890 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_1[0]); | 1890 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_1[0]); |
1891 } | 1891 } |
1892 | 1892 |
1893 if (bytes_received > uart->max_rx_fifo_level) | 1893 if (bytes_received > uart->max_rx_fifo_level) |
1894 uart->max_rx_fifo_level = bytes_received; | 1894 uart->max_rx_fifo_level = bytes_received; |
1895 | 1895 |
1896 return (bytes_received); | 1896 return (bytes_received); |
1897 } | 1897 } |
1898 | 1898 |
1899 /******************************************************************************* | 1899 /******************************************************************************* |
1900 * | 1900 * |
1901 * empty_rx_fifo | 1901 * empty_rx_fifo |
1902 * | 1902 * |
1903 * Purpose : Read the RX FIFO. | 1903 * Purpose : Read the RX FIFO. |
1904 * | 1904 * |
1905 * Arguments: In : uart: Pointer on the UART structure. | 1905 * Arguments: In : uart: Pointer on the UART structure. |
1906 * Out: none | 1906 * Out: none |
1907 * | 1907 * |
1928 } | 1928 } |
1929 | 1929 |
1930 /******************************************************************************* | 1930 /******************************************************************************* |
1931 * | 1931 * |
1932 * hisr_execute_rx_operations | 1932 * hisr_execute_rx_operations |
1933 * | 1933 * |
1934 * Purpose : If an escape sequence is detected or if a break in the detection | 1934 * Purpose : If an escape sequence is detected or if a break in the detection |
1935 * has occured RX FIFO bytes are written in the RX buffer. | 1935 * has occured RX FIFO bytes are written in the RX buffer. |
1936 * If the software flow control is used bytes are analyzed to know | 1936 * If the software flow control is used bytes are analyzed to know |
1937 * if a XON or a XOFF character is received to stop or start the | 1937 * if a XON or a XOFF character is received to stop or start the |
1938 * transmitter. | 1938 * transmitter. |
1939 * If a flow control is used and if the high watermark of the RX | 1939 * If a flow control is used and if the high watermark of the RX |
1940 * buffer is reached the receiver is stopped. | 1940 * buffer is reached the receiver is stopped. |
1941 * If the RX threshold level is reached the callback mechanism is | 1941 * If the RX threshold level is reached the callback mechanism is |
1942 * activated. | 1942 * activated. |
1943 * | 1943 * |
1959 SYS_UWORD8 *current_byte; | 1959 SYS_UWORD8 *current_byte; |
1960 SYS_UWORD8 xon_xoff_detected; | 1960 SYS_UWORD8 xon_xoff_detected; |
1961 t_uart *uart; | 1961 t_uart *uart; |
1962 | 1962 |
1963 uart = &uart_parameters; | 1963 uart = &uart_parameters; |
1964 | 1964 |
1965 /* | 1965 /* |
1966 * Since new characters have been received, the sleep timer is reset then | 1966 * Since new characters have been received, the sleep timer is reset then |
1967 * restarted preventing the system to enter deep-sleep for a new period of | 1967 * restarted preventing the system to enter deep-sleep for a new period of |
1968 * time. | 1968 * time. |
1969 */ | 1969 */ |
1974 #if (UARTFAX_CLASSIC_DTR_DCD || (CHIPSET == 12)) | 1974 #if (UARTFAX_CLASSIC_DTR_DCD || (CHIPSET == 12)) |
1975 uart->index_hisr = (uart->index_hisr + 1) & 0x01; /* 0 or 1 */ | 1975 uart->index_hisr = (uart->index_hisr + 1) & 0x01; /* 0 or 1 */ |
1976 #endif | 1976 #endif |
1977 | 1977 |
1978 xon_xoff_detected = 0; | 1978 xon_xoff_detected = 0; |
1979 | 1979 |
1980 /* | 1980 /* |
1981 * Switch to the other buffer. | 1981 * Switch to the other buffer. |
1982 */ | 1982 */ |
1983 | 1983 |
1984 current_byte = uart->rx_buffer_used_by_rx_hisr; | 1984 current_byte = uart->rx_buffer_used_by_rx_hisr; |
1985 if (current_byte == &(uart->rx_fifo_byte_1[0])) { | 1985 if (current_byte == &(uart->rx_fifo_byte_1[0])) { |
1986 | 1986 |
1987 current_byte = &(uart->rx_fifo_byte_2[0]); | 1987 current_byte = &(uart->rx_fifo_byte_2[0]); |
1988 bytes_read = uart->bytes_in_rx_buffer_2; | 1988 bytes_read = uart->bytes_in_rx_buffer_2; |
1989 | 1989 |
1990 } else { | 1990 } else { |
1991 | 1991 |
1992 current_byte = &(uart->rx_fifo_byte_1[0]); | 1992 current_byte = &(uart->rx_fifo_byte_1[0]); |
1993 bytes_read = uart->bytes_in_rx_buffer_1; | 1993 bytes_read = uart->bytes_in_rx_buffer_1; |
1994 } | 1994 } |
1995 | 1995 |
1996 uart->rx_buffer_used_by_rx_hisr = current_byte; | 1996 uart->rx_buffer_used_by_rx_hisr = current_byte; |
2008 bytes_free_in_rx_buffer = | 2008 bytes_free_in_rx_buffer = |
2009 (SYS_UWORD16) (uart->buffer_size + uart->rx_out - uart->rx_in); | 2009 (SYS_UWORD16) (uart->buffer_size + uart->rx_out - uart->rx_in); |
2010 | 2010 |
2011 wrap_around_counter = uart->buffer_size + 1 - | 2011 wrap_around_counter = uart->buffer_size + 1 - |
2012 (SYS_UWORD16) (uart->rx_in - &(uart->rx_buffer[0])); | 2012 (SYS_UWORD16) (uart->rx_in - &(uart->rx_buffer[0])); |
2013 | 2013 |
2014 if (uart->flow_control_mode == fc_xoff) { | 2014 if (uart->flow_control_mode == fc_xoff) { |
2015 | 2015 |
2016 /* | 2016 /* |
2017 * For SW Flow Control, need to further investigate the processing | 2017 * For SW Flow Control, need to further investigate the processing |
2018 * in order to improve the performance of the driver, and in order | 2018 * in order to improve the performance of the driver, and in order |
2019 * to avoid managing the wrap around of the circular buffer each | 2019 * to avoid managing the wrap around of the circular buffer each |
2020 * time a character is copied. | 2020 * time a character is copied. |
2021 */ | 2021 */ |
2022 | 2022 |
2023 while (bytes_read && bytes_free_in_rx_buffer) { | 2023 while (bytes_read && bytes_free_in_rx_buffer) { |
2024 | 2024 |
2025 /* | 2025 /* |
2026 * If the data received is XON or XOFF, the transmitter is | 2026 * If the data received is XON or XOFF, the transmitter is |
2027 * enabled (XON) or disabled (XOFF). | 2027 * enabled (XON) or disabled (XOFF). |
2039 | 2039 |
2040 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 2040 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
2041 /* | 2041 /* |
2042 * Disable sleep mode. | 2042 * Disable sleep mode. |
2043 */ | 2043 */ |
2044 | 2044 |
2045 WRITE_UART_REGISTER ( | 2045 WRITE_UART_REGISTER ( |
2046 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 2046 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
2047 #endif | 2047 #endif |
2048 | 2048 |
2049 /* | 2049 /* |
2050 * Unmask Tx interrupt. | 2050 * Unmask Tx interrupt. |
2051 */ | 2051 */ |
2052 | 2052 |
2053 WRITE_UART_REGISTER ( | 2053 WRITE_UART_REGISTER ( |
2054 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 2054 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
2055 | 2055 |
2056 } else { | 2056 } else { |
2057 | 2057 |
2058 *(uart->rx_in++) = *current_byte; | 2058 *(uart->rx_in++) = *current_byte; |
2059 | 2059 |
2060 wrap_around_counter--; | 2060 wrap_around_counter--; |
2061 if (!wrap_around_counter) { | 2061 if (!wrap_around_counter) { |
2062 | 2062 |
2063 uart->rx_in = &(uart->rx_buffer[0]); | 2063 uart->rx_in = &(uart->rx_buffer[0]); |
2064 wrap_around_counter = uart->buffer_size + 1; | 2064 wrap_around_counter = uart->buffer_size + 1; |
2065 } | 2065 } |
2066 | 2066 |
2067 bytes_free_in_rx_buffer--; | 2067 bytes_free_in_rx_buffer--; |
2068 } | 2068 } |
2069 | 2069 |
2070 current_byte++; | 2070 current_byte++; |
2071 bytes_read--; | 2071 bytes_read--; |
2072 } | 2072 } |
2073 } else { /* No Flow Control or HW Flow Control */ | 2073 } else { /* No Flow Control or HW Flow Control */ |
2074 | 2074 |
2075 /* | 2075 /* |
2076 * Figure out the most restricting condition. | 2076 * Figure out the most restricting condition. |
2077 */ | 2077 */ |
2078 | 2078 |
2079 bytes_to_copy = | 2079 bytes_to_copy = |
2080 Min3 (bytes_free_in_rx_buffer, wrap_around_counter, bytes_read); | 2080 Min3 (bytes_free_in_rx_buffer, wrap_around_counter, bytes_read); |
2081 | 2081 |
2082 /* | 2082 /* |
2083 * Copy characters into the circular Rx buffer. | 2083 * Copy characters into the circular Rx buffer. |
2084 */ | 2084 */ |
2085 | 2085 |
2086 memcpy (uart->rx_in, current_byte, bytes_to_copy); | 2086 memcpy (uart->rx_in, current_byte, bytes_to_copy); |
2087 | 2087 |
2088 /* | 2088 /* |
2089 * Update first the variables associated to blocking conditions: | 2089 * Update first the variables associated to blocking conditions: |
2090 * if (bytes_read = 0) OR | 2090 * if (bytes_read = 0) OR |
2091 * (bytes_free_in_rx_buffer = 0) => No more characters to copy. | 2091 * (bytes_free_in_rx_buffer = 0) => No more characters to copy. |
2092 */ | 2092 */ |
2093 | 2093 |
2094 bytes_free_in_rx_buffer -= bytes_to_copy; | 2094 bytes_free_in_rx_buffer -= bytes_to_copy; |
2095 bytes_read -= bytes_to_copy; | 2095 bytes_read -= bytes_to_copy; |
2096 | 2096 |
2097 wrap_around_counter -= bytes_to_copy; | 2097 wrap_around_counter -= bytes_to_copy; |
2098 if (!wrap_around_counter) | 2098 if (!wrap_around_counter) |
2099 uart->rx_in = &(uart->rx_buffer[0]); | 2099 uart->rx_in = &(uart->rx_buffer[0]); |
2100 else | 2100 else |
2101 uart->rx_in += bytes_to_copy; | 2101 uart->rx_in += bytes_to_copy; |
2123 */ | 2123 */ |
2124 | 2124 |
2125 memcpy (uart->rx_in, current_byte, bytes_to_copy); | 2125 memcpy (uart->rx_in, current_byte, bytes_to_copy); |
2126 | 2126 |
2127 uart->rx_in += bytes_to_copy; | 2127 uart->rx_in += bytes_to_copy; |
2128 | 2128 |
2129 /* | 2129 /* |
2130 * bytes_free_in_rx_buffer not updated since not used anymore. | 2130 * bytes_free_in_rx_buffer not updated since not used anymore. |
2131 */ | 2131 */ |
2132 bytes_read -= bytes_to_copy; | 2132 bytes_read -= bytes_to_copy; |
2133 | 2133 |
2134 } | 2134 } |
2135 else { | 2135 else { |
2136 bytes_read = 0; | 2136 bytes_read = 0; |
2137 } | 2137 } |
2138 } /* end if (uart->flow_control_mode == fc_xoff) */ | 2138 } /* end if (uart->flow_control_mode == fc_xoff) */ |
2194 } | 2194 } |
2195 | 2195 |
2196 | 2196 |
2197 | 2197 |
2198 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 2198 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
2199 | 2199 |
2200 /* Mask The Rx and Modem status interrupt */ | 2200 /* Mask The Rx and Modem status interrupt */ |
2201 WRITE_UART_REGISTER ( | 2201 WRITE_UART_REGISTER ( |
2202 uart, IER, READ_UART_REGISTER (uart, IER) & | 2202 uart, IER, READ_UART_REGISTER (uart, IER) & |
2203 ~(ERBI | EDSSI)); | 2203 ~(ERBI | EDSSI)); |
2204 | 2204 |
2205 if ((uart->rx_buffer_used_by_rx_hisr) == &(uart->rx_fifo_byte_1[0])) { | 2205 if ((uart->rx_buffer_used_by_rx_hisr) == &(uart->rx_fifo_byte_1[0])) { |
2206 | 2206 |
2207 uart->bytes_in_rx_buffer_1 = 0; | 2207 uart->bytes_in_rx_buffer_1 = 0; |
2208 | 2208 |
2209 } else { | 2209 } else { |
2210 | 2210 |
2211 uart->bytes_in_rx_buffer_2 = 0; | 2211 uart->bytes_in_rx_buffer_2 = 0; |
2212 } | 2212 } |
2213 | 2213 |
2214 | 2214 |
2215 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 2215 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
2216 | 2216 |
2217 /* Unmask The Rx and Modem status interrupt*/ | 2217 /* Unmask The Rx and Modem status interrupt*/ |
2218 WRITE_UART_REGISTER ( | 2218 WRITE_UART_REGISTER ( |
2219 uart, IER, READ_UART_REGISTER (uart, IER) | | 2219 uart, IER, READ_UART_REGISTER (uart, IER) | |
2220 (ERBI | EDSSI)); | 2220 (ERBI | EDSSI)); |
2221 | 2221 |
2222 if(uart->rx_stopped_by_lisr ) { | 2222 if(uart->rx_stopped_by_lisr ) { |
2223 if (!uart->rx_stopped_by_driver) { | 2223 if (!uart->rx_stopped_by_driver) { |
2224 | 2224 |
2225 | 2225 |
2226 uart->rx_stopped_by_lisr = 0; | 2226 uart->rx_stopped_by_lisr = 0; |
2227 | 2227 |
2228 /* | 2228 /* |
2229 * Reset LCR[7] (DLAB) to have access to the RBR, THR and IER registers. | 2229 * Reset LCR[7] (DLAB) to have access to the RBR, THR and IER registers. |
2230 */ | 2230 */ |
2231 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 2231 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
2232 | 2232 |
2233 | 2233 |
2234 /* UnMask The Rx interrupt */ | 2234 /* UnMask The Rx interrupt */ |
2235 WRITE_UART_REGISTER ( | 2235 WRITE_UART_REGISTER ( |
2236 uart, IER, READ_UART_REGISTER (uart, IER) | | 2236 uart, IER, READ_UART_REGISTER (uart, IER) | |
2237 (ERBI | EDSSI)); | 2237 (ERBI | EDSSI)); |
2238 | 2238 |
2239 start_receiver (uart); | 2239 start_receiver (uart); |
2240 | 2240 |
2241 } | 2241 } |
2242 } | 2242 } |
2243 | 2243 |
2244 } | 2244 } |
2245 | 2245 |
2246 /******************************************************************************* | 2246 /******************************************************************************* |
2247 * | 2247 * |
2248 * hisr_execute_v24_operations | 2248 * hisr_execute_v24_operations |
2249 * | 2249 * |
2250 * Purpose : The user's function is called if all conditions to call it are | 2250 * Purpose : The user's function is called if all conditions to call it are |
2251 * fulfiled. | 2251 * fulfiled. |
2252 * | 2252 * |
2253 * Arguments: In : none | 2253 * Arguments: In : none |
2254 * Out: none | 2254 * Out: none |
2283 } | 2283 } |
2284 | 2284 |
2285 /******************************************************************************* | 2285 /******************************************************************************* |
2286 * | 2286 * |
2287 * hisr_execute_tx_operations | 2287 * hisr_execute_tx_operations |
2288 * | 2288 * |
2289 * Purpose : Writes bytes from the TX buffer to the TX FIFO. | 2289 * Purpose : Writes bytes from the TX buffer to the TX FIFO. |
2290 * The user's function is called if all conditions to call it are | 2290 * The user's function is called if all conditions to call it are |
2291 * fulfiled. | 2291 * fulfiled. |
2292 * | 2292 * |
2293 * Arguments: In : none | 2293 * Arguments: In : none |
2319 */ | 2319 */ |
2320 | 2320 |
2321 if (READ_UART_REGISTER (uart, LSR) & THRE) { | 2321 if (READ_UART_REGISTER (uart, LSR) & THRE) { |
2322 | 2322 |
2323 bytes_in_tx_fifo = 0; | 2323 bytes_in_tx_fifo = 0; |
2324 | 2324 |
2325 /* | 2325 /* |
2326 * A request to send a XON/XOFF character may have been done by the | 2326 * A request to send a XON/XOFF character may have been done by the |
2327 * RX interrupt handler. The byte can be written because we are sure | 2327 * RX interrupt handler. The byte can be written because we are sure |
2328 * that the TX FIFO is not full. | 2328 * that the TX FIFO is not full. |
2329 */ | 2329 */ |
2330 | 2330 |
2331 if (uart->send_xon_xoff) { | 2331 if (uart->send_xon_xoff) { |
2451 if (bytes_in_tx_fifo) | 2451 if (bytes_in_tx_fifo) |
2452 | 2452 |
2453 /* | 2453 /* |
2454 * Unmask Tx interrupt. | 2454 * Unmask Tx interrupt. |
2455 */ | 2455 */ |
2456 | 2456 |
2457 WRITE_UART_REGISTER ( | 2457 WRITE_UART_REGISTER ( |
2458 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 2458 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
2459 | 2459 |
2460 else { | 2460 else { |
2461 | 2461 |
2479 } | 2479 } |
2480 | 2480 |
2481 /******************************************************************************* | 2481 /******************************************************************************* |
2482 * | 2482 * |
2483 * read_rx_fifo | 2483 * read_rx_fifo |
2484 * | 2484 * |
2485 * Purpose : Reads the RX FIFO. If the driver is enabled bytes are written in | 2485 * Purpose : Reads the RX FIFO. If the driver is enabled bytes are written in |
2486 * an array to be analyzed by the RX HISR. | 2486 * an array to be analyzed by the RX HISR. |
2487 * | 2487 * |
2488 * Arguments: In : uart: Pointer on the UART structure. | 2488 * Arguments: In : uart: Pointer on the UART structure. |
2489 * Out: none | 2489 * Out: none |
2499 /* | 2499 /* |
2500 * If the driver is disabled the RX FIFO is read to acknoledge the | 2500 * If the driver is disabled the RX FIFO is read to acknoledge the |
2501 * interrupt else bytes received are written into an array which will be | 2501 * interrupt else bytes received are written into an array which will be |
2502 * analyzed from the RX HISR. | 2502 * analyzed from the RX HISR. |
2503 */ | 2503 */ |
2504 | 2504 |
2505 if (DRIVER_DISABLED (uart)) | 2505 if (DRIVER_DISABLED (uart)) |
2506 empty_rx_fifo (uart); | 2506 empty_rx_fifo (uart); |
2507 | 2507 |
2508 else if (build_rx_fifo_array (uart)){ | 2508 else if (build_rx_fifo_array (uart)){ |
2509 (void) NU_Activate_HISR (&(uart->rx_hisr_ctrl_block)); | 2509 (void) NU_Activate_HISR (&(uart->rx_hisr_ctrl_block)); |
2510 | 2510 |
2511 } | 2511 } |
2512 | 2512 |
2513 | 2513 |
2514 } | 2514 } |
2515 | 2515 |
2516 /******************************************************************************* | 2516 /******************************************************************************* |
2517 * | 2517 * |
2518 * check_v24_input_lines | 2518 * check_v24_input_lines |
2519 * | 2519 * |
2520 * Purpose : Check the V.24 input lines. According to the states of the input | 2520 * Purpose : Check the V.24 input lines. According to the states of the input |
2521 * lines and to the flow control mode selected, the transmitter is | 2521 * lines and to the flow control mode selected, the transmitter is |
2522 * enabled or disabled. The reading callback function is called if | 2522 * enabled or disabled. The reading callback function is called if |
2523 * it is installed and if all conditions are fulfiled. | 2523 * it is installed and if all conditions are fulfiled. |
2524 * | 2524 * |
2564 /* | 2564 /* |
2565 * The reading callback function has to be called. But bytes received before | 2565 * The reading callback function has to be called. But bytes received before |
2566 * the change of state of DTR must be copied into the RX buffer before to | 2566 * the change of state of DTR must be copied into the RX buffer before to |
2567 * call it. | 2567 * call it. |
2568 */ | 2568 */ |
2569 | 2569 |
2570 if (READ_UART_REGISTER (uart, LSR) & DR) { /* If Rx FIFO is not empty */ | 2570 if (READ_UART_REGISTER (uart, LSR) & DR) { /* If Rx FIFO is not empty */ |
2571 | 2571 |
2572 /* | 2572 /* |
2573 * The Rx FIFO will be read to fill one of the two buffers and the Rx | 2573 * The Rx FIFO will be read to fill one of the two buffers and the Rx |
2574 * HISR will be activated. | 2574 * HISR will be activated. |
2575 */ | 2575 */ |
2576 | 2576 |
2577 uart->index_it = (uart->index_it + 1) & 0x01; /* 0 or 1 */ | 2577 uart->index_it = (uart->index_it + 1) & 0x01; /* 0 or 1 */ |
2578 uart->dtr_change_detected[uart->index_it] = 1; | 2578 uart->dtr_change_detected[uart->index_it] = 1; |
2579 uart->dtr_level_saved[uart->index_it] = uart->dtr_level; | 2579 uart->dtr_level_saved[uart->index_it] = uart->dtr_level; |
2580 read_rx_fifo (uart); | 2580 read_rx_fifo (uart); |
2581 | 2581 |
2582 } else | 2582 } else |
2583 v24_input_line_changed = 1; | 2583 v24_input_line_changed = 1; |
2584 } | 2584 } |
2585 #endif | 2585 #endif |
2586 | 2586 |
2588 * When the hardware flow control is selected, if the RS 232 input signal is | 2588 * When the hardware flow control is selected, if the RS 232 input signal is |
2589 * deactivated (low), the transmitter is stopped. | 2589 * deactivated (low), the transmitter is stopped. |
2590 */ | 2590 */ |
2591 | 2591 |
2592 if (uart->flow_control_mode == fc_rts) { | 2592 if (uart->flow_control_mode == fc_rts) { |
2593 | 2593 |
2594 if (uart->rts_level) { | 2594 if (uart->rts_level) { |
2595 uart->tx_stopped_by_driver = 1; | 2595 uart->tx_stopped_by_driver = 1; |
2596 } | 2596 } |
2597 | 2597 |
2598 else { | 2598 else { |
2599 | 2599 |
2600 uart->tx_stopped_by_driver = 0; | 2600 uart->tx_stopped_by_driver = 0; |
2601 #ifdef CONFIG_TARGET_GTAMODEM | 2601 #ifdef CONFIG_TARGET_GTAMODEM |
2602 AI_ResetBit(1); | 2602 AI_ResetBit(1); |
2603 #elif defined(CONFIG_TANGO_MODEM) | 2603 #elif defined(CONFIG_TANGO_MODEM) |
2604 if (AI_Tango_pinmux[0] == 0x82) | 2604 if (AI_Tango_pinmux[0] == 0x82) |
2607 | 2607 |
2608 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 2608 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
2609 /* | 2609 /* |
2610 * Disable sleep mode. | 2610 * Disable sleep mode. |
2611 */ | 2611 */ |
2612 | 2612 |
2613 WRITE_UART_REGISTER ( | 2613 WRITE_UART_REGISTER ( |
2614 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 2614 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
2615 #endif | 2615 #endif |
2616 | 2616 |
2617 /* | 2617 /* |
2629 } | 2629 } |
2630 | 2630 |
2631 /******************************************************************************* | 2631 /******************************************************************************* |
2632 * | 2632 * |
2633 * fill_tx_fifo | 2633 * fill_tx_fifo |
2634 * | 2634 * |
2635 * Purpose : If the TX buffer is not empty, and if there is no break in | 2635 * Purpose : If the TX buffer is not empty, and if there is no break in |
2636 * progress, bytes are written into the TX FIFO until the TX FIFO is | 2636 * progress, bytes are written into the TX FIFO until the TX FIFO is |
2637 * full or the TX buffer is empty. Else, if there is a break to send | 2637 * full or the TX buffer is empty. Else, if there is a break to send |
2638 * an all 0s character is written into the TX FIFO and a break is | 2638 * an all 0s character is written into the TX FIFO and a break is |
2639 * declared in progress to avoid to fill the TX FIFO on the next | 2639 * declared in progress to avoid to fill the TX FIFO on the next |
2641 * When the TX FIFO is empty and if a break is in progress, the break | 2641 * When the TX FIFO is empty and if a break is in progress, the break |
2642 * length is programmed: all 0s characters are written into the TX | 2642 * length is programmed: all 0s characters are written into the TX |
2643 * FIFO. The number of bytes has been defined previously with the | 2643 * FIFO. The number of bytes has been defined previously with the |
2644 * UAF_SetLineState function. The break condition is enabled. | 2644 * UAF_SetLineState function. The break condition is enabled. |
2645 * When the TX FIFO and the transmitter shift register (TSR) are both | 2645 * When the TX FIFO and the transmitter shift register (TSR) are both |
2646 * empty and if a break is in progress, the break condition is | 2646 * empty and if a break is in progress, the break condition is |
2647 * disabled. | 2647 * disabled. |
2648 * When bytes are written from the TX buffer to the TX FIFO, the | 2648 * When bytes are written from the TX buffer to the TX FIFO, the |
2649 * writing callback function is called if it is installed and if all | 2649 * writing callback function is called if it is installed and if all |
2650 * conditions are fulfiled. | 2650 * conditions are fulfiled. |
2651 * | 2651 * |
2679 * If a break is in progress, bytes of the TX buffer are not written into | 2679 * If a break is in progress, bytes of the TX buffer are not written into |
2680 * the TX FIFO. | 2680 * the TX FIFO. |
2681 */ | 2681 */ |
2682 | 2682 |
2683 if (!uart->break_in_progress) | 2683 if (!uart->break_in_progress) |
2684 (void) NU_Activate_HISR (&(uart->tx_hisr_ctrl_block)); | 2684 (void) NU_Activate_HISR (&(uart->tx_hisr_ctrl_block)); |
2685 | 2685 |
2686 else { | 2686 else { |
2687 | 2687 |
2688 /* | 2688 /* |
2689 * The break HISR is activated and the break condition is cleared. | 2689 * The break HISR is activated and the break condition is cleared. |
2697 } | 2697 } |
2698 | 2698 |
2699 /******************************************************************************* | 2699 /******************************************************************************* |
2700 * | 2700 * |
2701 * UAF_Init | 2701 * UAF_Init |
2702 * | 2702 * |
2703 * Purpose : Initializes the UART hardware and installs interrupt handlers. | 2703 * Purpose : Initializes the UART hardware and installs interrupt handlers. |
2704 * The parameters are set to the default values: | 2704 * The parameters are set to the default values: |
2705 * - 19200 baud, | 2705 * - 19200 baud, |
2706 * - 8 bits / character, | 2706 * - 8 bits / character, |
2707 * - no parity, | 2707 * - no parity, |
2741 /* | 2741 /* |
2742 * Create the 3 HISR actived in the RX/TX and V24 interrupt handlers. | 2742 * Create the 3 HISR actived in the RX/TX and V24 interrupt handlers. |
2743 * A return is used to simplify the code if an error occurs. | 2743 * A return is used to simplify the code if an error occurs. |
2744 * All stacks are entirely filled with the pattern 0xFE. | 2744 * All stacks are entirely filled with the pattern 0xFE. |
2745 */ | 2745 */ |
2746 | 2746 |
2747 memset (&(uart->rx_hisr_stack[0]), 0xFE, RX_HISR_STACK_SIZE); | 2747 memset (&(uart->rx_hisr_stack[0]), 0xFE, RX_HISR_STACK_SIZE); |
2748 | 2748 |
2749 if (NU_Create_HISR (&(uart->rx_hisr_ctrl_block), | 2749 if (NU_Create_HISR (&(uart->rx_hisr_ctrl_block), |
2750 "UAF_Rx", | 2750 "UAF_Rx", |
2751 hisr_execute_rx_operations, | 2751 hisr_execute_rx_operations, |
2801 | 2801 |
2802 if (NU_Create_Timer (&(uart->break_timer_ctrl_block), | 2802 if (NU_Create_Timer (&(uart->break_timer_ctrl_block), |
2803 "Break", | 2803 "Break", |
2804 stop_break, | 2804 stop_break, |
2805 0, /* Parameter supplied to the routine: not used. */ | 2805 0, /* Parameter supplied to the routine: not used. */ |
2806 0, /* This parameter is set when the timer is reset. */ | 2806 1, /* This parameter is set when the timer is reset. */ |
2807 0, /* The timer expires once. */ | 2807 0, /* The timer expires once. */ |
2808 NU_DISABLE_TIMER) != NU_SUCCESS) | 2808 NU_DISABLE_TIMER) != NU_SUCCESS) |
2809 | 2809 |
2810 return (FD_INTERNAL_ERR); | 2810 return (FD_INTERNAL_ERR); |
2811 | 2811 |
2816 | 2816 |
2817 if (NU_Create_Timer (&(uart->guard_period_timer_ctrl_block), | 2817 if (NU_Create_Timer (&(uart->guard_period_timer_ctrl_block), |
2818 "Esc seq", | 2818 "Esc seq", |
2819 analyze_guard_period_timer_expiration, | 2819 analyze_guard_period_timer_expiration, |
2820 0, /* Parameter supplied to the routine: not used. */ | 2820 0, /* Parameter supplied to the routine: not used. */ |
2821 0, /* This parameter is set when the timer is reset. */ | 2821 1, /* This parameter is set when the timer is reset. */ |
2822 0, /* The timer expires once. */ | 2822 0, /* The timer expires once. */ |
2823 NU_DISABLE_TIMER) != NU_SUCCESS) | 2823 NU_DISABLE_TIMER) != NU_SUCCESS) |
2824 | 2824 |
2825 return (FD_INTERNAL_ERR); | 2825 return (FD_INTERNAL_ERR); |
2826 | 2826 |
2828 * These data are used to send a break. | 2828 * These data are used to send a break. |
2829 * A character has: 8 data bits + 1 start bit + 1 stop bit = 10 bits. | 2829 * A character has: 8 data bits + 1 start bit + 1 stop bit = 10 bits. |
2830 */ | 2830 */ |
2831 | 2831 |
2832 uart->baudrate = baudrate_value[FD_BAUD_19200]; | 2832 uart->baudrate = baudrate_value[FD_BAUD_19200]; |
2833 uart->autobauding = 0; | 2833 uart->autobauding = 0; |
2834 uart->bits_per_char = 10; | 2834 uart->bits_per_char = 10; |
2835 | 2835 |
2836 /* | 2836 /* |
2837 * UART base address. | 2837 * UART base address. |
2838 */ | 2838 */ |
2840 uart->base_address = base_address[uartNo]; | 2840 uart->base_address = base_address[uartNo]; |
2841 | 2841 |
2842 /* | 2842 /* |
2843 * Select the current array used to store received bytes. | 2843 * Select the current array used to store received bytes. |
2844 */ | 2844 */ |
2845 | 2845 |
2846 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_2[0]); | 2846 uart->rx_buffer_used_by_rx_lisr = &(uart->rx_fifo_byte_2[0]); |
2847 uart->rx_buffer_used_by_rx_hisr = &(uart->rx_fifo_byte_2[0]); | 2847 uart->rx_buffer_used_by_rx_hisr = &(uart->rx_fifo_byte_2[0]); |
2848 | 2848 |
2849 /* | 2849 /* |
2850 * RX and TX buffers. | 2850 * RX and TX buffers. |
2851 */ | 2851 */ |
2852 | 2852 |
2853 uart->buffer_size = FD_MAX_BUFFER_SIZE; | 2853 uart->buffer_size = FD_MAX_BUFFER_SIZE; |
2927 WRITE_UART_REGISTER (uart, IER, 0x00); | 2927 WRITE_UART_REGISTER (uart, IER, 0x00); |
2928 | 2928 |
2929 /* | 2929 /* |
2930 * Reset UART mode configuration. | 2930 * Reset UART mode configuration. |
2931 */ | 2931 */ |
2932 | 2932 |
2933 WRITE_UART_REGISTER (uart, MDR1, RESET_DEFAULT_STATE | | 2933 WRITE_UART_REGISTER (uart, MDR1, RESET_DEFAULT_STATE | |
2934 IR_SLEEP_DISABLED | | 2934 IR_SLEEP_DISABLED | |
2935 SIR_TX_WITHOUT_ACREG2 | | 2935 SIR_TX_WITHOUT_ACREG2 | |
2936 FRAME_LENGTH_METHOD); | 2936 FRAME_LENGTH_METHOD); |
2937 | 2937 |
2938 /* | 2938 /* |
2939 * FIFO configuration. | 2939 * FIFO configuration. |
2940 * EFR[4] = 1 to allow to program FCR[5:4] and MCR[7:5]. | 2940 * EFR[4] = 1 to allow to program FCR[5:4] and MCR[7:5]. |
2941 */ | 2941 */ |
2942 | 2942 |
2943 WRITE_UART_REGISTER (uart, LCR, 0xBF); | 2943 WRITE_UART_REGISTER (uart, LCR, 0xBF); |
2944 SET_BIT (uart, EFR, ENHANCED_FEATURE_BIT); | 2944 SET_BIT (uart, EFR, ENHANCED_FEATURE_BIT); |
2945 | 2945 |
2946 /* | 2946 /* |
2947 * Select the word length, the number of stop bits , the parity and set | 2947 * Select the word length, the number of stop bits , the parity and set |
2952 | 2952 |
2953 /* | 2953 /* |
2954 * Program the trigger levels. | 2954 * Program the trigger levels. |
2955 * MCR[6] must be set to 1. | 2955 * MCR[6] must be set to 1. |
2956 */ | 2956 */ |
2957 | 2957 |
2958 SET_BIT (uart, MCR, TCR_TLR_BIT); | 2958 SET_BIT (uart, MCR, TCR_TLR_BIT); |
2959 WRITE_UART_REGISTER (uart, TCR, 0x0F); | 2959 WRITE_UART_REGISTER (uart, TCR, 0x0F); |
2960 WRITE_UART_REGISTER (uart, TLR, RX_FIFO_TRIGGER_LEVEL); | 2960 WRITE_UART_REGISTER (uart, TLR, RX_FIFO_TRIGGER_LEVEL); |
2961 RESET_BIT (uart, MCR, TCR_TLR_BIT); | 2961 RESET_BIT (uart, MCR, TCR_TLR_BIT); |
2962 | 2962 |
2964 * Force the generation of THR_IT on TX FIFO empty: SCR[3] = 1. | 2964 * Force the generation of THR_IT on TX FIFO empty: SCR[3] = 1. |
2965 */ | 2965 */ |
2966 | 2966 |
2967 WRITE_UART_REGISTER ( | 2967 WRITE_UART_REGISTER ( |
2968 uart, SCR, READ_UART_REGISTER (uart, SCR) | TX_EMPTY_CTL_IT); | 2968 uart, SCR, READ_UART_REGISTER (uart, SCR) | TX_EMPTY_CTL_IT); |
2969 | 2969 |
2970 /* | 2970 /* |
2971 * Program the FIFO control register. Bit 0 must be set when other FCR bits | 2971 * Program the FIFO control register. Bit 0 must be set when other FCR bits |
2972 * are written to or they are not programmed. | 2972 * are written to or they are not programmed. |
2973 * FCR is a write-only register. It will not be modified. | 2973 * FCR is a write-only register. It will not be modified. |
2974 */ | 2974 */ |
2991 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 2991 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
2992 | 2992 |
2993 /* | 2993 /* |
2994 * Select UART mode. | 2994 * Select UART mode. |
2995 */ | 2995 */ |
2996 | 2996 |
2997 WRITE_UART_REGISTER (uart, MDR1, UART_MODE | | 2997 WRITE_UART_REGISTER (uart, MDR1, UART_MODE | |
2998 IR_SLEEP_DISABLED | | 2998 IR_SLEEP_DISABLED | |
2999 SIR_TX_WITHOUT_ACREG2 | | 2999 SIR_TX_WITHOUT_ACREG2 | |
3000 FRAME_LENGTH_METHOD); | 3000 FRAME_LENGTH_METHOD); |
3001 | 3001 |
3014 /* | 3014 /* |
3015 * On C & D-Sample, 2 I/O are used to control DCD and DTR on UART Modem. | 3015 * On C & D-Sample, 2 I/O are used to control DCD and DTR on UART Modem. |
3016 * DCD: I/O 2 (output) | 3016 * DCD: I/O 2 (output) |
3017 * DTR: I/O 3 (input) | 3017 * DTR: I/O 3 (input) |
3018 */ | 3018 */ |
3019 | 3019 |
3020 #define EXTENDED_MCU_REG (0xFFFEF006) /* Extended MCU register */ | 3020 #define EXTENDED_MCU_REG (0xFFFEF006) /* Extended MCU register */ |
3021 #define ASIC_CONFIG_REG (0xFFFEF008) /* Asic Configuration register */ | 3021 #define ASIC_CONFIG_REG (0xFFFEF008) /* Asic Configuration register */ |
3022 | 3022 |
3023 #define IO_DTR (10) /* I/O 3; bit 10 of Asic Configuration register */ | 3023 #define IO_DTR (10) /* I/O 3; bit 10 of Asic Configuration register */ |
3024 #define IO_DCD ( 6) /* I/O 2; bit 6 of Extended MCU register */ | 3024 #define IO_DCD ( 6) /* I/O 2; bit 6 of Extended MCU register */ |
3041 /* | 3041 /* |
3042 * Select I/O for DTR and configure it as input. | 3042 * Select I/O for DTR and configure it as input. |
3043 * An interrupt is used to detect a change of state of DTR. Falling edge | 3043 * An interrupt is used to detect a change of state of DTR. Falling edge |
3044 * or rising edge is selected according to the state of DTR. | 3044 * or rising edge is selected according to the state of DTR. |
3045 */ | 3045 */ |
3046 | 3046 |
3047 #ifdef CONFIG_TANGO_MODEM | 3047 #ifdef CONFIG_TANGO_MODEM |
3048 if (AI_Tango_pinmux[1] & 0x80) { | 3048 if (AI_Tango_pinmux[1] & 0x80) { |
3049 #endif | 3049 #endif |
3050 *((volatile SYS_UWORD16 *) ASIC_CONFIG_REG) &= ~(1 << IO_DTR); | 3050 *((volatile SYS_UWORD16 *) ASIC_CONFIG_REG) &= ~(1 << IO_DTR); |
3051 AI_ConfigBitAsInput (ARMIO_DTR); | 3051 AI_ConfigBitAsInput (ARMIO_DTR); |
3053 | 3053 |
3054 if (uart->dtr_level) | 3054 if (uart->dtr_level) |
3055 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); | 3055 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); |
3056 else | 3056 else |
3057 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); | 3057 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); |
3058 | 3058 |
3059 AI_UnmaskIT (ARMIO_MASKIT_GPIO); | 3059 AI_UnmaskIT (ARMIO_MASKIT_GPIO); |
3060 #ifdef CONFIG_TANGO_MODEM | 3060 #ifdef CONFIG_TANGO_MODEM |
3061 } else | 3061 } else |
3062 uart->dtr_level = 0; | 3062 uart->dtr_level = 0; |
3063 #endif | 3063 #endif |
3064 | 3064 |
3065 /* | 3065 /* |
3066 * Reset the 2 indexes of the circular buffer of 2 elements. | 3066 * Reset the 2 indexes of the circular buffer of 2 elements. |
3067 * The circular buffer does not need to be initialized. | 3067 * The circular buffer does not need to be initialized. |
3068 */ | 3068 */ |
3069 | 3069 |
3070 uart->index_it = 0; | 3070 uart->index_it = 0; |
3071 uart->index_hisr = 0; | 3071 uart->index_hisr = 0; |
3072 #elif (CHIPSET == 12) | 3072 #elif (CHIPSET == 12) |
3073 /* | 3073 /* |
3074 * DCD and DTR are directly handled by Calypso+. | 3074 * DCD and DTR are directly handled by Calypso+. |
3090 | 3090 |
3091 /* | 3091 /* |
3092 * Reset the 2 indexes of the circular buffer of 2 elements. | 3092 * Reset the 2 indexes of the circular buffer of 2 elements. |
3093 * The circular buffer does not need to be initialized. | 3093 * The circular buffer does not need to be initialized. |
3094 */ | 3094 */ |
3095 | 3095 |
3096 uart->index_it = 0; | 3096 uart->index_it = 0; |
3097 uart->index_hisr = 0; | 3097 uart->index_hisr = 0; |
3098 #endif /* BOARD == 8, 9, 40 or 41, CHIPSET == 12 */ | 3098 #endif /* BOARD == 8, 9, 40 or 41, CHIPSET == 12 */ |
3099 | 3099 |
3100 /* | 3100 /* |
3101 * Unmask RX interrupt and the modem status interrupt. | 3101 * Unmask RX interrupt and the modem status interrupt. |
3102 */ | 3102 */ |
3103 | 3103 |
3104 WRITE_UART_REGISTER (uart, IER, ERBI | EDSSI); | 3104 WRITE_UART_REGISTER (uart, IER, ERBI | EDSSI); |
3115 } | 3115 } |
3116 | 3116 |
3117 /******************************************************************************* | 3117 /******************************************************************************* |
3118 * | 3118 * |
3119 * UAF_Enable | 3119 * UAF_Enable |
3120 * | 3120 * |
3121 * Purpose : The functionalities of the UART driver are disabled or enabled. | 3121 * Purpose : The functionalities of the UART driver are disabled or enabled. |
3122 * In the deactivated state, all information about the communication | 3122 * In the deactivated state, all information about the communication |
3123 * parameters should be stored and recalled if the driver is again | 3123 * parameters should be stored and recalled if the driver is again |
3124 * enabled. When the driver is enabled the RX and TX buffers are | 3124 * enabled. When the driver is enabled the RX and TX buffers are |
3125 * cleared. | 3125 * cleared. |
3154 return (FD_NOT_SUPPORTED); | 3154 return (FD_NOT_SUPPORTED); |
3155 | 3155 |
3156 /* | 3156 /* |
3157 * There is no case where FD_INTERNAL_ERR may be returned. | 3157 * There is no case where FD_INTERNAL_ERR may be returned. |
3158 */ | 3158 */ |
3159 | 3159 |
3160 uart = &uart_parameters; | 3160 uart = &uart_parameters; |
3161 | 3161 |
3162 if (enable) { | 3162 if (enable) { |
3163 | 3163 |
3164 uart->rx_stopped_by_driver = 0; | 3164 uart->rx_stopped_by_driver = 0; |
3165 | 3165 |
3166 ENABLE_DRIVER (uart); | 3166 ENABLE_DRIVER (uart); |
3167 start_receiver (uart); | 3167 start_receiver (uart); |
3168 | 3168 |
3169 } else { | 3169 } else { |
3170 | 3170 |
3181 } | 3181 } |
3182 | 3182 |
3183 /******************************************************************************* | 3183 /******************************************************************************* |
3184 * | 3184 * |
3185 * UAF_SetComPar | 3185 * UAF_SetComPar |
3186 * | 3186 * |
3187 * Purpose : Sets up the communication parameters: baud rate, bits per | 3187 * Purpose : Sets up the communication parameters: baud rate, bits per |
3188 * character, number of stop bits, parity. | 3188 * character, number of stop bits, parity. |
3189 * | 3189 * |
3190 * Arguments: In : uartNo : Used UART. | 3190 * Arguments: In : uartNo : Used UART. |
3191 * baudrate: Used baud rate. | 3191 * baudrate: Used baud rate. |
3253 #endif | 3253 #endif |
3254 | 3254 |
3255 /* | 3255 /* |
3256 * Reset UART mode configuration. | 3256 * Reset UART mode configuration. |
3257 */ | 3257 */ |
3258 | 3258 |
3259 WRITE_UART_REGISTER (uart, MDR1, RESET_DEFAULT_STATE | | 3259 WRITE_UART_REGISTER (uart, MDR1, RESET_DEFAULT_STATE | |
3260 IR_SLEEP_DISABLED | | 3260 IR_SLEEP_DISABLED | |
3261 SIR_TX_WITHOUT_ACREG2 | | 3261 SIR_TX_WITHOUT_ACREG2 | |
3262 FRAME_LENGTH_METHOD); | 3262 FRAME_LENGTH_METHOD); |
3263 | 3263 |
3264 /* | 3264 /* |
3265 * FIFO configuration. | 3265 * FIFO configuration. |
3266 * EFR[4] = 1 to allow to program FCR[5:4] and MCR[7:5]. | 3266 * EFR[4] = 1 to allow to program FCR[5:4] and MCR[7:5]. |
3267 */ | 3267 */ |
3268 | 3268 |
3269 WRITE_UART_REGISTER (uart, LCR, 0xBF); | 3269 WRITE_UART_REGISTER (uart, LCR, 0xBF); |
3270 SET_BIT (uart, EFR, ENHANCED_FEATURE_BIT); | 3270 SET_BIT (uart, EFR, ENHANCED_FEATURE_BIT); |
3271 | 3271 |
3272 /* | 3272 /* |
3273 * Select the word length, the number of stop bits , the parity and set | 3273 * Select the word length, the number of stop bits , the parity and set |
3278 uart->autobauding = (baudrate == FD_BAUD_AUTO); /* if autobauding enable trigger */ | 3278 uart->autobauding = (baudrate == FD_BAUD_AUTO); /* if autobauding enable trigger */ |
3279 uart->bits_per_char = 1; /* Start bit. */ | 3279 uart->bits_per_char = 1; /* Start bit. */ |
3280 mcr_value = DLAB; | 3280 mcr_value = DLAB; |
3281 | 3281 |
3282 if (bpc == bpc_7) { | 3282 if (bpc == bpc_7) { |
3283 | 3283 |
3284 mcr_value |= WLS_7; | 3284 mcr_value |= WLS_7; |
3285 uart->bits_per_char += 7; | 3285 uart->bits_per_char += 7; |
3286 | 3286 |
3287 } else { | 3287 } else { |
3288 | 3288 |
3327 | 3327 |
3328 /* | 3328 /* |
3329 * Program the trigger levels. | 3329 * Program the trigger levels. |
3330 * MCR[6] must be set to 1. | 3330 * MCR[6] must be set to 1. |
3331 */ | 3331 */ |
3332 | 3332 |
3333 SET_BIT (uart, MCR, TCR_TLR_BIT); | 3333 SET_BIT (uart, MCR, TCR_TLR_BIT); |
3334 WRITE_UART_REGISTER (uart, TCR, 0x0F); | 3334 WRITE_UART_REGISTER (uart, TCR, 0x0F); |
3335 WRITE_UART_REGISTER (uart, TLR, RX_FIFO_TRIGGER_LEVEL); | 3335 WRITE_UART_REGISTER (uart, TLR, RX_FIFO_TRIGGER_LEVEL); |
3336 RESET_BIT (uart, MCR, TCR_TLR_BIT); | 3336 RESET_BIT (uart, MCR, TCR_TLR_BIT); |
3337 | 3337 |
3339 * Force the generation of THR_IT on TX FIFO empty: SCR[3] = 1. | 3339 * Force the generation of THR_IT on TX FIFO empty: SCR[3] = 1. |
3340 */ | 3340 */ |
3341 | 3341 |
3342 WRITE_UART_REGISTER ( | 3342 WRITE_UART_REGISTER ( |
3343 uart, SCR, READ_UART_REGISTER (uart, SCR) | TX_EMPTY_CTL_IT); | 3343 uart, SCR, READ_UART_REGISTER (uart, SCR) | TX_EMPTY_CTL_IT); |
3344 | 3344 |
3345 /* | 3345 /* |
3346 * Program the FIFO control register. Bit 0 must be set when other FCR bits | 3346 * Program the FIFO control register. Bit 0 must be set when other FCR bits |
3347 * are written to or they are not programmed. | 3347 * are written to or they are not programmed. |
3348 * FCR is a write-only register. It will not be modified. | 3348 * FCR is a write-only register. It will not be modified. |
3349 */ | 3349 */ |
3366 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); | 3366 WRITE_UART_REGISTER (uart, LCR, READ_UART_REGISTER (uart, LCR) & ~DLAB); |
3367 | 3367 |
3368 /* | 3368 /* |
3369 * Select UART mode. | 3369 * Select UART mode. |
3370 */ | 3370 */ |
3371 | 3371 |
3372 WRITE_UART_REGISTER (uart, MDR1, ((baudrate==FD_BAUD_AUTO)? | 3372 WRITE_UART_REGISTER (uart, MDR1, ((baudrate==FD_BAUD_AUTO)? |
3373 UART_MODE_AUTOBAUDING: | 3373 UART_MODE_AUTOBAUDING: |
3374 UART_MODE) | | 3374 UART_MODE) | |
3375 IR_SLEEP_DISABLED | | 3375 IR_SLEEP_DISABLED | |
3376 SIR_TX_WITHOUT_ACREG2 | | 3376 SIR_TX_WITHOUT_ACREG2 | |
3389 | 3389 |
3390 #if UARTFAX_CLASSIC_DTR_DCD | 3390 #if UARTFAX_CLASSIC_DTR_DCD |
3391 /* | 3391 /* |
3392 * Read the state of DTR and select the edge. | 3392 * Read the state of DTR and select the edge. |
3393 */ | 3393 */ |
3394 | 3394 |
3395 #ifdef CONFIG_TANGO_MODEM | 3395 #ifdef CONFIG_TANGO_MODEM |
3396 if (AI_Tango_pinmux[1] & 0x80) { | 3396 if (AI_Tango_pinmux[1] & 0x80) { |
3397 #endif | 3397 #endif |
3398 uart->dtr_level = AI_ReadBit (ARMIO_DTR); | 3398 uart->dtr_level = AI_ReadBit (ARMIO_DTR); |
3399 | 3399 |
3400 if (uart->dtr_level) | 3400 if (uart->dtr_level) |
3401 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); | 3401 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); |
3402 else | 3402 else |
3403 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); | 3403 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); |
3404 | 3404 |
3405 AI_UnmaskIT (ARMIO_MASKIT_GPIO); | 3405 AI_UnmaskIT (ARMIO_MASKIT_GPIO); |
3406 #ifdef CONFIG_TANGO_MODEM | 3406 #ifdef CONFIG_TANGO_MODEM |
3407 } else | 3407 } else |
3408 uart->dtr_level = 0; | 3408 uart->dtr_level = 0; |
3409 #endif | 3409 #endif |
3420 uart->dtr_level = 1; | 3420 uart->dtr_level = 1; |
3421 #endif | 3421 #endif |
3422 | 3422 |
3423 #if ((CHIPSET == 5) || (CHIPSET == 6)) | 3423 #if ((CHIPSET == 5) || (CHIPSET == 6)) |
3424 /* | 3424 /* |
3425 * Unmask RX and TX interrupts and the modem status interrupt. | 3425 * Unmask RX and TX interrupts and the modem status interrupt. |
3426 */ | 3426 */ |
3427 | 3427 |
3428 WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI); | 3428 WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI); |
3429 #elif (CHIPSET == 12) | 3429 #elif (CHIPSET == 12) |
3430 /* | 3430 /* |
3431 * Unmask RX and TX interrupts and the modem status interrupt... | 3431 * Unmask RX and TX interrupts and the modem status interrupt... |
3432 */ | 3432 */ |
3433 | 3433 |
3434 WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI); | 3434 WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI); |
3435 | 3435 |
3436 /* | 3436 /* |
3437 * ... Then, unmask DSR interrupt... | 3437 * ... Then, unmask DSR interrupt... |
3438 */ | 3438 */ |
3439 | 3439 |
3440 ENABLE_DSR_INTERRUPT (uart); | 3440 ENABLE_DSR_INTERRUPT (uart); |
3441 | 3441 |
3442 /* | 3442 /* |
3443 * ... And finally allow sleep mode. | 3443 * ... And finally allow sleep mode. |
3444 */ | 3444 */ |
3445 | 3445 |
3447 /* | 3447 /* |
3448 WRITE_UART_REGISTER (uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); | 3448 WRITE_UART_REGISTER (uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); |
3449 */ | 3449 */ |
3450 #else | 3450 #else |
3451 /* | 3451 /* |
3452 * Unmask RX and TX interrupts and the modem status interrupt | 3452 * Unmask RX and TX interrupts and the modem status interrupt |
3453 * and allow sleep mode. | 3453 * and allow sleep mode. |
3454 */ | 3454 */ |
3455 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ | 3455 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ |
3456 | 3456 |
3457 /* WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI | IER_SLEEP);*/ | 3457 /* WRITE_UART_REGISTER (uart, IER, ERBI | ETBEI | EDSSI | IER_SLEEP);*/ |
3464 } | 3464 } |
3465 | 3465 |
3466 /******************************************************************************* | 3466 /******************************************************************************* |
3467 * | 3467 * |
3468 * UAF_SetBuffer | 3468 * UAF_SetBuffer |
3469 * | 3469 * |
3470 * Purpose : Sets up the size of the circular buffers to be used in the UART | 3470 * Purpose : Sets up the size of the circular buffers to be used in the UART |
3471 * driver. This function may be called only if the UART is disabled | 3471 * driver. This function may be called only if the UART is disabled |
3472 * with UAF_Enable. | 3472 * with UAF_Enable. |
3473 * | 3473 * |
3474 * Arguments: In : uartNo : Used UART. | 3474 * Arguments: In : uartNo : Used UART. |
3518 (txThreshold > FD_MAX_BUFFER_SIZE)) | 3518 (txThreshold > FD_MAX_BUFFER_SIZE)) |
3519 | 3519 |
3520 result = FD_NOT_SUPPORTED; | 3520 result = FD_NOT_SUPPORTED; |
3521 | 3521 |
3522 else { | 3522 else { |
3523 | 3523 |
3524 uart = &uart_parameters; | 3524 uart = &uart_parameters; |
3525 | 3525 |
3526 if (!DRIVER_DISABLED (uart)) | 3526 if (!DRIVER_DISABLED (uart)) |
3527 result = FD_INTERNAL_ERR; | 3527 result = FD_INTERNAL_ERR; |
3528 | 3528 |
3529 else if (RX_HIGH_WATERMARK (bufSize) < RX_LOW_WATERMARK (bufSize)) | 3529 else if (RX_HIGH_WATERMARK (bufSize) < RX_LOW_WATERMARK (bufSize)) |
3530 result = FD_NOT_SUPPORTED; | 3530 result = FD_NOT_SUPPORTED; |
3531 | 3531 |
3532 else { | 3532 else { |
3533 | 3533 |
3534 uart->buffer_size = bufSize; | 3534 uart->buffer_size = bufSize; |
3535 uart->rx_threshold_level = rxThreshold; | 3535 uart->rx_threshold_level = rxThreshold; |
3536 uart->tx_threshold_level = txThreshold; | 3536 uart->tx_threshold_level = txThreshold; |
3537 | 3537 |
3538 result = FD_OK; | 3538 result = FD_OK; |
3543 } | 3543 } |
3544 | 3544 |
3545 /******************************************************************************* | 3545 /******************************************************************************* |
3546 * | 3546 * |
3547 * UAF_SetFlowCtrl | 3547 * UAF_SetFlowCtrl |
3548 * | 3548 * |
3549 * Purpose : Changes the flow control mode of the UART driver. | 3549 * Purpose : Changes the flow control mode of the UART driver. |
3550 * If a flow control is activated, DTR is activated or XOFF is sent | 3550 * If a flow control is activated, DTR is activated or XOFF is sent |
3551 * if the RX buffer is not able to store the received characters else | 3551 * if the RX buffer is not able to store the received characters else |
3552 * DTR is deactivated or XON is sent. | 3552 * DTR is deactivated or XON is sent. |
3553 * | 3553 * |
3592 | 3592 |
3593 if (fcMode == fc_dtr) | 3593 if (fcMode == fc_dtr) |
3594 result = FD_NOT_SUPPORTED; | 3594 result = FD_NOT_SUPPORTED; |
3595 | 3595 |
3596 else { | 3596 else { |
3597 | 3597 |
3598 uart = &uart_parameters; | 3598 uart = &uart_parameters; |
3599 | 3599 |
3600 uart->tx_stopped_by_driver = 0; | 3600 uart->tx_stopped_by_driver = 0; |
3601 | 3601 |
3602 | 3602 |
3603 uart->xon_character = XON; | 3603 uart->xon_character = XON; |
3604 uart->xoff_character = XOFF; | 3604 uart->xoff_character = XOFF; |
3605 uart->flow_control_mode = fcMode; | 3605 uart->flow_control_mode = fcMode; |
3606 | 3606 |
3607 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 3607 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
3613 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 3613 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
3614 #endif | 3614 #endif |
3615 | 3615 |
3616 WRITE_UART_REGISTER ( | 3616 WRITE_UART_REGISTER ( |
3617 uart, MCR, READ_UART_REGISTER (uart, MCR) | MRTS); | 3617 uart, MCR, READ_UART_REGISTER (uart, MCR) | MRTS); |
3618 | 3618 |
3619 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 3619 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
3620 /* | 3620 /* |
3621 * Re-enable sleep mode. | 3621 * Re-enable sleep mode. |
3622 */ | 3622 */ |
3623 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ | 3623 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ |
3688 } else if (!DRIVER_DISABLED (uart)) { | 3688 } else if (!DRIVER_DISABLED (uart)) { |
3689 | 3689 |
3690 uart->rx_stopped_by_driver = 0; | 3690 uart->rx_stopped_by_driver = 0; |
3691 start_receiver (uart); | 3691 start_receiver (uart); |
3692 } | 3692 } |
3693 | 3693 |
3694 } else { | 3694 } else { |
3695 | 3695 |
3696 uart->rx_stopped_by_driver = 0; | 3696 uart->rx_stopped_by_driver = 0; |
3697 uart->tx_stopped_by_driver = 0; | 3697 uart->tx_stopped_by_driver = 0; |
3698 } | 3698 } |
3699 | 3699 |
3700 result = FD_OK; | 3700 result = FD_OK; |
3704 } | 3704 } |
3705 | 3705 |
3706 /******************************************************************************* | 3706 /******************************************************************************* |
3707 * | 3707 * |
3708 * UAF_SetEscape | 3708 * UAF_SetEscape |
3709 * | 3709 * |
3710 * Purpose : To return to the command mode at the ACI while a data connection | 3710 * Purpose : To return to the command mode at the ACI while a data connection |
3711 * is established, an escape sequence has to be detected. | 3711 * is established, an escape sequence has to be detected. |
3712 * To distinguish between user data and the escape sequence a | 3712 * To distinguish between user data and the escape sequence a |
3713 * defined guard period is necessary before and after this sequence. | 3713 * defined guard period is necessary before and after this sequence. |
3714 * | 3714 * |
3762 } | 3762 } |
3763 | 3763 |
3764 /******************************************************************************* | 3764 /******************************************************************************* |
3765 * | 3765 * |
3766 * UAF_InpAvail | 3766 * UAF_InpAvail |
3767 * | 3767 * |
3768 * Purpose : Returns the number of characters available in the RX buffer of the | 3768 * Purpose : Returns the number of characters available in the RX buffer of the |
3769 * driver. If the driver is disabled the function returns 0. | 3769 * driver. If the driver is disabled the function returns 0. |
3770 * | 3770 * |
3771 * Arguments: In : uartNo: Used UART. | 3771 * Arguments: In : uartNo: Used UART. |
3772 * Out: none | 3772 * Out: none |
3860 } | 3860 } |
3861 | 3861 |
3862 /******************************************************************************* | 3862 /******************************************************************************* |
3863 * | 3863 * |
3864 * UAF_OutpAvail | 3864 * UAF_OutpAvail |
3865 * | 3865 * |
3866 * Purpose : Returns the number of free characters in TX buffer of the driver. | 3866 * Purpose : Returns the number of free characters in TX buffer of the driver. |
3867 * If the driver is disabled the function returns 0. | 3867 * If the driver is disabled the function returns 0. |
3868 * | 3868 * |
3869 * Arguments: In : uartNo: Used UART. | 3869 * Arguments: In : uartNo: Used UART. |
3870 * Out: none | 3870 * Out: none |
3940 { | 3940 { |
3941 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 3941 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
3942 /* | 3942 /* |
3943 * Disable sleep mode. | 3943 * Disable sleep mode. |
3944 */ | 3944 */ |
3945 | 3945 |
3946 WRITE_UART_REGISTER ( | 3946 WRITE_UART_REGISTER ( |
3947 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 3947 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
3948 #endif | 3948 #endif |
3949 | 3949 |
3950 /* | 3950 /* |
3951 * Unmask Tx interrupt. | 3951 * Unmask Tx interrupt. |
3952 */ | 3952 */ |
3953 | 3953 |
3954 WRITE_UART_REGISTER ( | 3954 WRITE_UART_REGISTER ( |
3955 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 3955 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
3956 } | 3956 } |
3957 } | 3957 } |
3958 | 3958 |
3963 } | 3963 } |
3964 | 3964 |
3965 /******************************************************************************* | 3965 /******************************************************************************* |
3966 * | 3966 * |
3967 * UAF_EnterSleep | 3967 * UAF_EnterSleep |
3968 * | 3968 * |
3969 * Purpose : Checks if UART is ready to enter Deep Sleep. If ready, enables | 3969 * Purpose : Checks if UART is ready to enter Deep Sleep. If ready, enables |
3970 * wake-up interrupt. | 3970 * wake-up interrupt. |
3971 * | 3971 * |
3972 * Arguments: In : uartNo: Used UART. | 3972 * Arguments: In : uartNo: Used UART. |
3973 * Out: none | 3973 * Out: none |
3984 UAF_EnterSleep (T_fd_UartId uartNo) | 3984 UAF_EnterSleep (T_fd_UartId uartNo) |
3985 { | 3985 { |
3986 t_uart *uart; | 3986 t_uart *uart; |
3987 SYS_BOOL deep_sleep; | 3987 SYS_BOOL deep_sleep; |
3988 volatile SYS_UWORD8 status; | 3988 volatile SYS_UWORD8 status; |
3989 | 3989 |
3990 /* | 3990 /* |
3991 * Check UART number. | 3991 * Check UART number. |
3992 * A return is used to simplify the code. | 3992 * A return is used to simplify the code. |
3993 * UART IrDA (UAF_UART_0) can't be used for F&D on Ulysse because hardware | 3993 * UART IrDA (UAF_UART_0) can't be used for F&D on Ulysse because hardware |
3994 * flow control is not supported. | 3994 * flow control is not supported. |
4013 | 4013 |
4014 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 4014 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
4015 /* | 4015 /* |
4016 * Disable sleep mode. | 4016 * Disable sleep mode. |
4017 */ | 4017 */ |
4018 | 4018 |
4019 WRITE_UART_REGISTER ( | 4019 WRITE_UART_REGISTER ( |
4020 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 4020 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
4021 #endif | 4021 #endif |
4022 | 4022 |
4023 #if (CHIPSET == 12) | 4023 #if (CHIPSET == 12) |
4049 } | 4049 } |
4050 | 4050 |
4051 /******************************************************************************* | 4051 /******************************************************************************* |
4052 * | 4052 * |
4053 * UAF_WakeUp | 4053 * UAF_WakeUp |
4054 * | 4054 * |
4055 * Purpose : Wakes up UART after Deep Sleep. | 4055 * Purpose : Wakes up UART after Deep Sleep. |
4056 * | 4056 * |
4057 * Arguments: In : uartNo: Used UART. | 4057 * Arguments: In : uartNo: Used UART. |
4058 * Out: none | 4058 * Out: none |
4059 * | 4059 * |
4066 | 4066 |
4067 T_FDRET | 4067 T_FDRET |
4068 UAF_WakeUp (T_fd_UartId uartNo) | 4068 UAF_WakeUp (T_fd_UartId uartNo) |
4069 { | 4069 { |
4070 t_uart *uart; | 4070 t_uart *uart; |
4071 | 4071 |
4072 /* | 4072 /* |
4073 * Check UART number. | 4073 * Check UART number. |
4074 * A return is used to simplify the code. | 4074 * A return is used to simplify the code. |
4075 * UART IrDA (UAF_UART_0) can't be used for F&D on Ulysse because hardware | 4075 * UART IrDA (UAF_UART_0) can't be used for F&D on Ulysse because hardware |
4076 * flow control is not supported. | 4076 * flow control is not supported. |
4106 | 4106 |
4107 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 4107 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
4108 /* | 4108 /* |
4109 * Allow sleep mode. | 4109 * Allow sleep mode. |
4110 */ | 4110 */ |
4111 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ | 4111 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ |
4112 /* | 4112 /* |
4113 WRITE_UART_REGISTER ( | 4113 WRITE_UART_REGISTER ( |
4114 uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); | 4114 uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); |
4115 */ | 4115 */ |
4116 #endif | 4116 #endif |
4117 | 4117 |
4118 return (FD_OK); | 4118 return (FD_OK); |
4119 } | 4119 } |
4120 | 4120 |
4121 /******************************************************************************* | 4121 /******************************************************************************* |
4122 * | 4122 * |
4123 * UAF_ReadData | 4123 * UAF_ReadData |
4124 * | 4124 * |
4125 * Purpose : To read the received characters out of the RX buffer the address | 4125 * Purpose : To read the received characters out of the RX buffer the address |
4126 * of a function is passed. If characters are available, the driver | 4126 * of a function is passed. If characters are available, the driver |
4127 * calls this function and pass the address and the amount of | 4127 * calls this function and pass the address and the amount of |
4128 * readable characters. Because the RX buffer is circular, the | 4128 * readable characters. Because the RX buffer is circular, the |
4129 * callback function may be called with more than one address of | 4129 * callback function may be called with more than one address of |
4166 * source : Array which contains the addresses | 4166 * source : Array which contains the addresses |
4167 * of the fragments. | 4167 * of the fragments. |
4168 * size : Array which contains the sizes of | 4168 * size : Array which contains the sizes of |
4169 * each fragments. | 4169 * each fragments. |
4170 * state : The state parameter is the status | 4170 * state : The state parameter is the status |
4171 * of the V.24 lines and the break / | 4171 * of the V.24 lines and the break / |
4172 * escape detection. The state | 4172 * escape detection. The state |
4173 * parameter is described in the | 4173 * parameter is described in the |
4174 * specification of UAF_GetLineState. | 4174 * specification of UAF_GetLineState. |
4175 * Out: none | 4175 * Out: none |
4176 * | 4176 * |
4258 uart->readOutFunc = readOutFunc; | 4258 uart->readOutFunc = readOutFunc; |
4259 uart->reading_suspended = 1; | 4259 uart->reading_suspended = 1; |
4260 result = FD_SUSPENDED; | 4260 result = FD_SUSPENDED; |
4261 | 4261 |
4262 } else { | 4262 } else { |
4263 | 4263 |
4264 /* | 4264 /* |
4265 * The previous callback function is deinstalled. | 4265 * The previous callback function is deinstalled. |
4266 */ | 4266 */ |
4267 | 4267 |
4268 uart->rd_call_setup = rm_noInstall; | 4268 uart->rd_call_setup = rm_noInstall; |
4269 uart->reading_suspended = 0; | 4269 uart->reading_suspended = 0; |
4270 result = 0; /* 0 byte read. */ | 4270 result = 0; /* 0 byte read. */ |
4271 } | 4271 } |
4272 | 4272 |
4274 } | 4274 } |
4275 | 4275 |
4276 /******************************************************************************* | 4276 /******************************************************************************* |
4277 * | 4277 * |
4278 * UAF_WriteData | 4278 * UAF_WriteData |
4279 * | 4279 * |
4280 * Purpose : To write characters into the TX buffer the address of a function | 4280 * Purpose : To write characters into the TX buffer the address of a function |
4281 * is passed. If free space is available in the buffer, the driver | 4281 * is passed. If free space is available in the buffer, the driver |
4282 * calls this function and passes the destination address and the | 4282 * calls this function and passes the destination address and the |
4283 * amount of space. Because the TX buffer is circular, the callback | 4283 * amount of space. Because the TX buffer is circular, the callback |
4284 * function may be called with more than one address of buffer | 4284 * function may be called with more than one address of buffer |
4296 * UAF_SetBuffer). If no suspension is necessary the function returns | 4296 * UAF_SetBuffer). If no suspension is necessary the function returns |
4297 * the number of processed bytes. | 4297 * the number of processed bytes. |
4298 * | 4298 * |
4299 * Arguments: In : uartNo : Used UART. | 4299 * Arguments: In : uartNo : Used UART. |
4300 * suspend : mode of suspension in case of TX buffer empty. | 4300 * suspend : mode of suspension in case of TX buffer empty. |
4301 * writeInFunc: Callback function. | 4301 * writeInFunc: Callback function. |
4302 * cldFromIrq: The driver sets this parameter to 1 | 4302 * cldFromIrq: The driver sets this parameter to 1 |
4303 * if the call-back function is called | 4303 * if the call-back function is called |
4304 * from an interrupt service routine. | 4304 * from an interrupt service routine. |
4305 * reInstall : The callback function sets this | 4305 * reInstall : The callback function sets this |
4306 * parameter to rm_reInstall if the | 4306 * parameter to rm_reInstall if the |
4395 * - the flow control is not activated, | 4395 * - the flow control is not activated, |
4396 * unmask the TX empty interrupt to be able to send characters. | 4396 * unmask the TX empty interrupt to be able to send characters. |
4397 */ | 4397 */ |
4398 if (!uart->break_to_send && | 4398 if (!uart->break_to_send && |
4399 !uart->tx_stopped_by_driver) | 4399 !uart->tx_stopped_by_driver) |
4400 { | 4400 { |
4401 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 4401 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
4402 /* | 4402 /* |
4403 * Disable sleep mode. | 4403 * Disable sleep mode. |
4404 */ | 4404 */ |
4405 | 4405 |
4406 WRITE_UART_REGISTER ( | 4406 WRITE_UART_REGISTER ( |
4407 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); | 4407 uart, IER, READ_UART_REGISTER (uart, IER) & ~IER_SLEEP); |
4408 #endif | 4408 #endif |
4409 | 4409 |
4410 /* | 4410 /* |
4411 * Unmask Tx interrupt. | 4411 * Unmask Tx interrupt. |
4412 */ | 4412 */ |
4413 | 4413 |
4414 WRITE_UART_REGISTER ( | 4414 WRITE_UART_REGISTER ( |
4415 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); | 4415 uart, IER, READ_UART_REGISTER (uart, IER) | ETBEI); |
4416 } | 4416 } |
4417 | 4417 |
4418 result = (T_FDRET) bytes_written; | 4418 result = (T_FDRET) bytes_written; |
4422 uart->writeInFunc = writeInFunc; | 4422 uart->writeInFunc = writeInFunc; |
4423 uart->writing_suspended = 1; | 4423 uart->writing_suspended = 1; |
4424 result = FD_SUSPENDED; | 4424 result = FD_SUSPENDED; |
4425 | 4425 |
4426 } else { | 4426 } else { |
4427 | 4427 |
4428 /* | 4428 /* |
4429 * The previous callback function is deinstalled. | 4429 * The previous callback function is deinstalled. |
4430 */ | 4430 */ |
4431 | 4431 |
4432 uart->wr_call_setup = rm_noInstall; | 4432 uart->wr_call_setup = rm_noInstall; |
4433 uart->writing_suspended = 0; | 4433 uart->writing_suspended = 0; |
4434 result = 0; | 4434 result = 0; |
4435 } | 4435 } |
4436 | 4436 |
4438 } | 4438 } |
4439 | 4439 |
4440 /******************************************************************************* | 4440 /******************************************************************************* |
4441 * | 4441 * |
4442 * UAF_StopRec | 4442 * UAF_StopRec |
4443 * | 4443 * |
4444 * Purpose : If a flow control mode is set, this function tells the terminal | 4444 * Purpose : If a flow control mode is set, this function tells the terminal |
4445 * equipment that no more data can be received. | 4445 * equipment that no more data can be received. |
4446 * XON/XOFF: XOFF is sent. | 4446 * XON/XOFF: XOFF is sent. |
4447 * DTR/DSR : DTR is desactivated. | 4447 * DTR/DSR : DTR is desactivated. |
4448 * RTS/CTS : RTS is deactivated. | 4448 * RTS/CTS : RTS is deactivated. |
4488 } | 4488 } |
4489 | 4489 |
4490 /******************************************************************************* | 4490 /******************************************************************************* |
4491 * | 4491 * |
4492 * UAF_StartRec | 4492 * UAF_StartRec |
4493 * | 4493 * |
4494 * Purpose : If a flow control mode is set, this function tells the terminal | 4494 * Purpose : If a flow control mode is set, this function tells the terminal |
4495 * equipment that the receiver is again able to receive more data. | 4495 * equipment that the receiver is again able to receive more data. |
4496 * If the buffer has already reached the high water mark the driver | 4496 * If the buffer has already reached the high water mark the driver |
4497 * sends the signal only if the buffer drains to a low water mark. | 4497 * sends the signal only if the buffer drains to a low water mark. |
4498 * XON/XOFF: XON is sent. | 4498 * XON/XOFF: XON is sent. |
4506 * FD_NOT_SUPPORTED: Wrong UART number. | 4506 * FD_NOT_SUPPORTED: Wrong UART number. |
4507 * FD_INTERNAL_ERR : Internal problem with the hardware. | 4507 * FD_INTERNAL_ERR : Internal problem with the hardware. |
4508 * | 4508 * |
4509 ******************************************************************************/ | 4509 ******************************************************************************/ |
4510 | 4510 |
4511 T_FDRET | 4511 T_FDRET |
4512 UAF_StartRec (T_fd_UartId uartNo) | 4512 UAF_StartRec (T_fd_UartId uartNo) |
4513 { | 4513 { |
4514 t_uart *uart; | 4514 t_uart *uart; |
4515 | 4515 |
4516 /* | 4516 /* |
4540 } | 4540 } |
4541 | 4541 |
4542 /******************************************************************************* | 4542 /******************************************************************************* |
4543 * | 4543 * |
4544 * UAF_GetLineState | 4544 * UAF_GetLineState |
4545 * | 4545 * |
4546 * Purpose : Returns the state of the V.24 lines, the flow control state and | 4546 * Purpose : Returns the state of the V.24 lines, the flow control state and |
4547 * the result of the break/escape detection process as a bit field. | 4547 * the result of the break/escape detection process as a bit field. |
4548 * | 4548 * |
4549 * Arguments: In : uartNo: Used UART. | 4549 * Arguments: In : uartNo: Used UART. |
4550 * Out: state : State of the V.24 lines, the flow control state and | 4550 * Out: state : State of the V.24 lines, the flow control state and |
4551 * the result of the break/escape sequence detection | 4551 * the result of the break/escape sequence detection |
4552 * process as a bit field. | 4552 * process as a bit field. |
4553 * | 4553 * |
4554 * Returns : FD_OK : Successful operation. | 4554 * Returns : FD_OK : Successful operation. |
4555 * FD_NOT_SUPPORTED: Wrong UART number. | 4555 * FD_NOT_SUPPORTED: Wrong UART number. |
4556 * FD_NOT_READY : The function is called while the callback of | 4556 * FD_NOT_READY : The function is called while the callback of |
4557 * the readOutFunc function is activated and still | 4557 * the readOutFunc function is activated and still |
4558 * not terminated. | 4558 * not terminated. |
4559 * FD_INTERNAL_ERR : Internal problem with the hardware. | 4559 * FD_INTERNAL_ERR : Internal problem with the hardware. |
4560 * | 4560 * |
4561 ******************************************************************************/ | 4561 ******************************************************************************/ |
4593 | 4593 |
4594 /* | 4594 /* |
4595 * The field state_2 is used when state_1 is set to 0 to avoid to | 4595 * The field state_2 is used when state_1 is set to 0 to avoid to |
4596 * lose events detected in the RX interrupt handler. | 4596 * lose events detected in the RX interrupt handler. |
4597 * Fields BRK and BRKLEN are set when a break is detected. | 4597 * Fields BRK and BRKLEN are set when a break is detected. |
4598 * The field ESC is set when an escape sequence is detected. | 4598 * The field ESC is set when an escape sequence is detected. |
4599 */ | 4599 */ |
4600 | 4600 |
4601 *state = uart->state_2; | 4601 *state = uart->state_2; |
4602 uart->state_2 = 0; | 4602 uart->state_2 = 0; |
4603 uart->state = &(uart->state_2); | 4603 uart->state = &(uart->state_2); |
4605 *state |= uart->state_1; | 4605 *state |= uart->state_1; |
4606 uart->state_1 = 0; | 4606 uart->state_1 = 0; |
4607 uart->state = &(uart->state_1); | 4607 uart->state = &(uart->state_1); |
4608 | 4608 |
4609 *state |= ((((SYS_UWORD32) uart->rts_level) << RTS) | | 4609 *state |= ((((SYS_UWORD32) uart->rts_level) << RTS) | |
4610 | 4610 |
4611 #if (UARTFAX_CLASSIC_DTR_DCD || (CHIPSET == 12)) | 4611 #if (UARTFAX_CLASSIC_DTR_DCD || (CHIPSET == 12)) |
4612 (((SYS_UWORD32) uart->dtr_level) << DTR) | | 4612 (((SYS_UWORD32) uart->dtr_level) << DTR) | |
4613 #endif | 4613 #endif |
4614 | 4614 |
4615 (((SYS_UWORD32) (uart->tx_stopped_by_application | | 4615 (((SYS_UWORD32) (uart->tx_stopped_by_application | |
4616 uart->tx_stopped_by_driver)) << TXSTP) | | 4616 uart->tx_stopped_by_driver)) << TXSTP) | |
4617 | 4617 |
4618 (((SYS_UWORD32) (uart->rx_stopped_by_application | | 4618 (((SYS_UWORD32) (uart->rx_stopped_by_application | |
4619 uart->rx_stopped_by_driver)) << RXSTP) | | 4619 uart->rx_stopped_by_driver)) << RXSTP) | |
4620 | 4620 |
4621 (((SYS_UWORD32) (uart->buffer_size - | 4621 (((SYS_UWORD32) (uart->buffer_size - |
4622 get_bytes_in_rx_buffer (uart))) << RXBLEV)); | 4622 get_bytes_in_rx_buffer (uart))) << RXBLEV)); |
4623 | 4623 |
4624 /* | 4624 /* |
4625 * Fields SA, SB and X are set according to the flow control: | 4625 * Fields SA, SB and X are set according to the flow control: |
4626 * | 4626 * |
4627 * None RTS/CTS XON/XOFF | 4627 * None RTS/CTS XON/XOFF |
4628 * SA DTR DTR DTR | 4628 * SA DTR DTR DTR |
4639 if (uart->flow_control_mode != fc_rts) | 4639 if (uart->flow_control_mode != fc_rts) |
4640 *state |= (((SYS_UWORD32) uart->rts_level) << SB); | 4640 *state |= (((SYS_UWORD32) uart->rts_level) << SB); |
4641 | 4641 |
4642 if (uart->flow_control_mode == fc_rts) | 4642 if (uart->flow_control_mode == fc_rts) |
4643 *state |= (((SYS_UWORD32) uart->rts_level) << X); | 4643 *state |= (((SYS_UWORD32) uart->rts_level) << X); |
4644 | 4644 |
4645 else if ((uart->flow_control_mode == fc_xoff) && | 4645 else if ((uart->flow_control_mode == fc_xoff) && |
4646 (uart->tx_stopped_by_application || | 4646 (uart->tx_stopped_by_application || |
4647 uart->tx_stopped_by_driver)) | 4647 uart->tx_stopped_by_driver)) |
4648 *state |= (1 << X); | 4648 *state |= (1 << X); |
4649 | 4649 |
4654 } | 4654 } |
4655 | 4655 |
4656 /******************************************************************************* | 4656 /******************************************************************************* |
4657 * | 4657 * |
4658 * UAF_SetLineState | 4658 * UAF_SetLineState |
4659 * | 4659 * |
4660 * Purpose : Sets the states of the V.24 status lines according to the bit | 4660 * Purpose : Sets the states of the V.24 status lines according to the bit |
4661 * field of the parameter state. | 4661 * field of the parameter state. |
4662 * | 4662 * |
4663 * Arguments: In : uartNo: Used UART. | 4663 * Arguments: In : uartNo: Used UART. |
4664 * state : Bit field. Only the signals which are marked with | 4664 * state : Bit field. Only the signals which are marked with |
4707 if (mask & (1 << SA)) | 4707 if (mask & (1 << SA)) |
4708 #else | 4708 #else |
4709 if ((mask & (1 << SA)) || (mask & (1 << DCD))) | 4709 if ((mask & (1 << SA)) || (mask & (1 << DCD))) |
4710 #endif | 4710 #endif |
4711 return (FD_NOT_SUPPORTED); /* Return used to simplify the code */ | 4711 return (FD_NOT_SUPPORTED); /* Return used to simplify the code */ |
4712 | 4712 |
4713 /* | 4713 /* |
4714 * Check if a break has to be sent. | 4714 * Check if a break has to be sent. |
4715 */ | 4715 */ |
4716 | 4716 |
4717 uart->break_length = (UNSIGNED) ((state >> BRKLEN) & 0xFF); | 4717 uart->break_length = (UNSIGNED) ((state >> BRKLEN) & 0xFF); |
4751 * The CTS field is ignored if the X bit in the mask is set. In this case | 4751 * The CTS field is ignored if the X bit in the mask is set. In this case |
4752 * the X bit controls CTS. | 4752 * the X bit controls CTS. |
4753 */ | 4753 */ |
4754 | 4754 |
4755 if (mask & (1 << CTS)) { | 4755 if (mask & (1 << CTS)) { |
4756 | 4756 |
4757 if (uart->flow_control_mode != fc_rts) { | 4757 if (uart->flow_control_mode != fc_rts) { |
4758 | 4758 |
4759 /* | 4759 /* |
4760 * As the RTS/CTS flow control is not selected, the X bit does not | 4760 * As the RTS/CTS flow control is not selected, the X bit does not |
4761 * control CTS. CTS needs only to be activated or deactivated | 4761 * control CTS. CTS needs only to be activated or deactivated |
4762 * according to the value of the CTS field. | 4762 * according to the value of the CTS field. |
4763 */ | 4763 */ |
4777 * is null. Then the CTS bit controls CTS and the receiver must be | 4777 * is null. Then the CTS bit controls CTS and the receiver must be |
4778 * stopped or started according to the state of the CTS bit. | 4778 * stopped or started according to the state of the CTS bit. |
4779 * The receiver is started only if it was not stopped by the driver | 4779 * The receiver is started only if it was not stopped by the driver |
4780 * and if it was stopped by the application. | 4780 * and if it was stopped by the application. |
4781 */ | 4781 */ |
4782 | 4782 |
4783 if (state & (1 << CTS)) { | 4783 if (state & (1 << CTS)) { |
4784 | 4784 |
4785 if (!uart->rx_stopped_by_application) { | 4785 if (!uart->rx_stopped_by_application) { |
4786 | 4786 |
4787 if (!uart->rx_stopped_by_driver) | 4787 if (!uart->rx_stopped_by_driver) |
4788 stop_receiver (uart); | 4788 stop_receiver (uart); |
4789 | 4789 |
4790 uart->rx_stopped_by_application = 1; | 4790 uart->rx_stopped_by_application = 1; |
4791 } | 4791 } |
4792 | 4792 |
4793 } else { | 4793 } else { |
4794 | 4794 |
4795 if ((!uart->rx_stopped_by_driver) && | 4795 if ((!uart->rx_stopped_by_driver) && |
4796 uart->rx_stopped_by_application) | 4796 uart->rx_stopped_by_application) |
4797 start_receiver (uart); | 4797 start_receiver (uart); |
4798 | 4798 |
4799 uart->rx_stopped_by_application = 0; | 4799 uart->rx_stopped_by_application = 0; |
4888 AI_SetBit(1); | 4888 AI_SetBit(1); |
4889 } | 4889 } |
4890 } | 4890 } |
4891 | 4891 |
4892 #endif /* Tango modem */ | 4892 #endif /* Tango modem */ |
4893 | 4893 |
4894 #ifdef CONFIG_TARGET_GTM900 | |
4895 | |
4896 if (mask & (1 << RI)) { | |
4897 | |
4898 if (state & (1 << RI)) { | |
4899 /* Turn on RI */ | |
4900 AI_ResetBit(0); | |
4901 } else { | |
4902 /* Turn off RI */ | |
4903 AI_SetBit(0); | |
4904 } | |
4905 } | |
4906 | |
4907 #endif /* GTM900 modem */ | |
4908 | |
4894 if ((mask & (1 << X)) && | 4909 if ((mask & (1 << X)) && |
4895 (uart->flow_control_mode != fc_none)) { | 4910 (uart->flow_control_mode != fc_none)) { |
4896 | 4911 |
4897 if (state & (1 << X)) { | 4912 if (state & (1 << X)) { |
4898 | 4913 |
4899 if (!uart->rx_stopped_by_application) { | 4914 if (!uart->rx_stopped_by_application) { |
4900 | 4915 |
4901 if (!uart->rx_stopped_by_driver) | 4916 if (!uart->rx_stopped_by_driver) |
4902 stop_receiver (uart); | 4917 stop_receiver (uart); |
4903 | 4918 |
4904 uart->rx_stopped_by_application = 1; | 4919 uart->rx_stopped_by_application = 1; |
4905 } | 4920 } |
4906 | 4921 |
4907 } else { | 4922 } else { |
4908 | 4923 |
4909 /* | 4924 /* |
4910 * The receiver is started only if it is not stopped by the driver | 4925 * The receiver is started only if it is not stopped by the driver |
4911 * and if it is stopped by the application. | 4926 * and if it is stopped by the application. |
4912 */ | 4927 */ |
4913 | 4928 |
4921 | 4936 |
4922 #if ((CHIPSET != 5) && (CHIPSET != 6)) | 4937 #if ((CHIPSET != 5) && (CHIPSET != 6)) |
4923 /* | 4938 /* |
4924 * Re-enable sleep mode. | 4939 * Re-enable sleep mode. |
4925 */ | 4940 */ |
4926 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ | 4941 /* BELOW LINES WERE COMMENTED TO DISABLE SLEEP MODE IN DRIVER */ |
4927 /* | 4942 /* |
4928 WRITE_UART_REGISTER ( | 4943 WRITE_UART_REGISTER ( |
4929 uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); | 4944 uart, IER, READ_UART_REGISTER (uart, IER) | IER_SLEEP); |
4930 */ | 4945 */ |
4931 #endif | 4946 #endif |
4934 } | 4949 } |
4935 | 4950 |
4936 /******************************************************************************* | 4951 /******************************************************************************* |
4937 * | 4952 * |
4938 * UAF_InterruptHandler | 4953 * UAF_InterruptHandler |
4939 * | 4954 * |
4940 * Purpose : Interrupt handler. | 4955 * Purpose : Interrupt handler. |
4941 * | 4956 * |
4942 * Arguments: In : uart_id : origin of interrupt | 4957 * Arguments: In : uart_id : origin of interrupt |
4943 * interrupt_status: source of interrupt | 4958 * interrupt_status: source of interrupt |
4944 * Out: none | 4959 * Out: none |
5049 } | 5064 } |
5050 | 5065 |
5051 /******************************************************************************* | 5066 /******************************************************************************* |
5052 * | 5067 * |
5053 * UAF_CheckXEmpty | 5068 * UAF_CheckXEmpty |
5054 * | 5069 * |
5055 * Purpose : Checks the empty condition of the Transmitter. | 5070 * Purpose : Checks the empty condition of the Transmitter. |
5056 * | 5071 * |
5057 * Arguments: In : uartNo: Used UART. | 5072 * Arguments: In : uartNo: Used UART. |
5058 * Out: none | 5073 * Out: none |
5059 * | 5074 * |
5086 /* | 5101 /* |
5087 * There is no case where FD_INTERNAL_ERR may be returned. | 5102 * There is no case where FD_INTERNAL_ERR may be returned. |
5088 */ | 5103 */ |
5089 | 5104 |
5090 result = FD_OK; | 5105 result = FD_OK; |
5091 | 5106 |
5092 uart = &uart_parameters; | 5107 uart = &uart_parameters; |
5093 status = READ_UART_REGISTER (uart, LSR); | 5108 status = READ_UART_REGISTER (uart, LSR); |
5094 | 5109 |
5095 /* | 5110 /* |
5096 * Checks if: | 5111 * Checks if: |
5127 | 5142 |
5128 void | 5143 void |
5129 UAF_DTRInterruptHandler (void) | 5144 UAF_DTRInterruptHandler (void) |
5130 { | 5145 { |
5131 t_uart *uart; | 5146 t_uart *uart; |
5132 | 5147 |
5133 uart = &uart_parameters; | 5148 uart = &uart_parameters; |
5134 | 5149 |
5135 /* | 5150 /* |
5136 * Read the state of DTR and change the edge to detect the next change | 5151 * Read the state of DTR and change the edge to detect the next change |
5137 * of DTR. | 5152 * of DTR. |
5138 */ | 5153 */ |
5139 | 5154 |
5140 uart->dtr_level = AI_ReadBit (ARMIO_DTR); | 5155 uart->dtr_level = AI_ReadBit (ARMIO_DTR); |
5141 | 5156 |
5142 if (uart->dtr_level) | 5157 if (uart->dtr_level) |
5143 { | 5158 { |
5144 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); | 5159 AI_SelectIOForIT (ARMIO_DTR, ARMIO_FALLING_EDGE); |
5145 if (uart->flow_control_mode != fc_dtr && uart->baudrate == baudrate_value[FD_BAUD_AUTO]) | 5160 if (uart->flow_control_mode != fc_dtr && uart->baudrate == baudrate_value[FD_BAUD_AUTO]) |
5146 UAF_SetComPar (UAF_UART_1, FD_BAUD_AUTO, bpc_8, sb_1, pa_none); | 5161 UAF_SetComPar (UAF_UART_1, FD_BAUD_AUTO, bpc_8, sb_1, pa_none); |
5147 } | 5162 } |
5148 else | 5163 else |
5149 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); | 5164 AI_SelectIOForIT (ARMIO_DTR, ARMIO_RISING_EDGE); |
5150 | 5165 |
5151 /* | 5166 /* |
5152 * The reading callback function has to be called. But bytes received before | 5167 * The reading callback function has to be called. But bytes received before |
5153 * the change of state of DTR must be copied into the RX buffer before to | 5168 * the change of state of DTR must be copied into the RX buffer before to |
5154 * call it. | 5169 * call it. |
5155 */ | 5170 */ |
5156 | 5171 |
5157 if (READ_UART_REGISTER (uart, LSR) & DR) { /* If Rx FIFO is not empty */ | 5172 if (READ_UART_REGISTER (uart, LSR) & DR) { /* If Rx FIFO is not empty */ |
5158 | 5173 |
5159 /* | 5174 /* |
5160 * The Rx FIFO will be read to fill one of the two buffers and the Rx | 5175 * The Rx FIFO will be read to fill one of the two buffers and the Rx |
5161 * HISR will be activated. | 5176 * HISR will be activated. |
5162 */ | 5177 */ |
5163 | 5178 |
5164 uart->index_it = (uart->index_it + 1) & 0x01; /* 0 or 1 */ | 5179 uart->index_it = (uart->index_it + 1) & 0x01; /* 0 or 1 */ |
5165 uart->dtr_change_detected[uart->index_it] = 1; | 5180 uart->dtr_change_detected[uart->index_it] = 1; |
5166 uart->dtr_level_saved[uart->index_it] = uart->dtr_level; | 5181 uart->dtr_level_saved[uart->index_it] = uart->dtr_level; |
5167 read_rx_fifo (uart); | 5182 read_rx_fifo (uart); |
5168 | 5183 |
5169 } else | 5184 } else |
5170 (void) NU_Activate_HISR (&(uart->v24_hisr_ctrl_block)); | 5185 (void) NU_Activate_HISR (&(uart->v24_hisr_ctrl_block)); |
5171 | 5186 |
5172 } | 5187 } |
5173 #endif /* BOARD 8 or 9 or 40 or 41 */ | 5188 #endif /* BOARD 8 or 9 or 40 or 41 */ |
5174 | 5189 |
5175 #ifdef SERIAL_DYNAMIC_SWITCH | 5190 #ifdef SERIAL_DYNAMIC_SWITCH |
5176 /******************************************************************************* | 5191 /******************************************************************************* |
5177 * | 5192 * |
5178 * UAF_Exit | 5193 * UAF_Exit |
5179 * | 5194 * |
5180 * Purpose : | 5195 * Purpose : |
5181 * | 5196 * |
5182 * Arguments: In : uartNo: Used UART. | 5197 * Arguments: In : uartNo: Used UART. |
5183 * Out: none | 5198 * Out: none |
5184 * | 5199 * |
5185 * Returns : FD_OK : Successful operation. | 5200 * Returns : FD_OK : Successful operation. |