Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
UART9BIT.CPP@8:716d4274f7b7, 2019-08-26 (annotated)
- Committer:
- mark.chen@ebn.com.tw
- Date:
- Mon Aug 26 13:33:10 2019 +0800
- Revision:
- 8:716d4274f7b7
- Parent:
- 7:af4ceb878eee
- Child:
- 9:bd6af3d4c651
Update 20190826
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| MarkChen | 0:f0f0961f1727 | 1 | /* mbed Microcontroller Library | 
| MarkChen | 0:f0f0961f1727 | 2 | * Copyright (c) 2015-2016 Nuvoton | 
| MarkChen | 0:f0f0961f1727 | 3 | * | 
| MarkChen | 0:f0f0961f1727 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
| MarkChen | 0:f0f0961f1727 | 5 | * you may not use this file except in compliance with the License. | 
| MarkChen | 0:f0f0961f1727 | 6 | * You may obtain a copy of the License at | 
| MarkChen | 0:f0f0961f1727 | 7 | * | 
| MarkChen | 0:f0f0961f1727 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 | 
| MarkChen | 0:f0f0961f1727 | 9 | * | 
| MarkChen | 0:f0f0961f1727 | 10 | * Unless required by applicable law or agreed to in writing, software | 
| MarkChen | 0:f0f0961f1727 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
| MarkChen | 0:f0f0961f1727 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| MarkChen | 0:f0f0961f1727 | 13 | * See the License for the specific language governing permissions and | 
| MarkChen | 0:f0f0961f1727 | 14 | * limitations under the License. | 
| MarkChen | 0:f0f0961f1727 | 15 | */ | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 16 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 17 | |
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 18 | #include "UART9BIT.h" | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 19 | #include "serial_api9bit.h" | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 20 | |
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 21 | |
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 22 | UART9BIT::UART9BIT(PinName tx, PinName rx, int baud,bool en9bit) :_thunk9_irq(this), Serial( tx, rx, baud) | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 23 | { | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 24 | Enable9Bit=en9bit; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 25 | if(en9bit) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 26 | format(9,UART9BIT::None,1); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 27 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 28 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 29 | void UART9BIT::format(int bits, Parity parity, int stop_bits) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 30 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 31 | lock(); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 32 | serial_format_9bit(&_serial, bits, (SerialParity)parity, stop_bits); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 33 | unlock(); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 34 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 35 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 36 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 37 | void UART9BIT::interrupt_handler_asynch(void) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 38 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 39 | int event; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 40 | int rx_event = event & SERIAL_EVENT_RX_MASK; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 41 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 42 | if(Enable9Bit) | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 43 | event=serial_irq_handler_asynch9bit(&_serial); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 44 | else | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 45 | event=serial_irq_handler_asynch(&_serial); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 46 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 47 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 48 | if (_rx_asynch_set && rx_event) { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 49 | event_callback_t cb = _rx_callback; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 50 | _rx_asynch_set = false; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 51 | _rx_callback = NULL; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 52 | if (cb) { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 53 | cb.call(rx_event); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 54 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 55 | sleep_manager_unlock_deep_sleep(); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 56 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 57 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 58 | int tx_event = event & SERIAL_EVENT_TX_MASK; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 59 | if (_tx_asynch_set && tx_event) { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 60 | event_callback_t cb = _tx_callback; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 61 | _tx_asynch_set = false; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 62 | _tx_callback = NULL; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 63 | if (cb) { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 64 | cb.call(tx_event); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 65 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 66 | sleep_manager_unlock_deep_sleep(); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 67 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 68 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 69 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 70 | int UART9BIT::write(const uint16_t *buffer, int length, const event_callback_t &callback, int event) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 71 | { | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 72 | int result = 0; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 73 | lock(); | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 74 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 75 | if (!serial_tx_active(&_serial) && !_tx_asynch_set) { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 76 | start_write((void *)buffer, length, 16, callback, event); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 77 | } else { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 78 | result = -1; // transaction ongoing | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 79 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 80 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 81 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 82 | unlock(); | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 83 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 84 | return result; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 85 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 86 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 87 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 88 | void UART9BIT::start_write(const void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 89 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 90 | _tx_asynch_set = true; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 91 | _tx_callback = callback; | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 92 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 93 | _thunk9_irq.callback(&UART9BIT::interrupt_handler_asynch); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 94 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 95 | sleep_manager_lock_deep_sleep(); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 96 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 97 | if(Enable9Bit) | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 98 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 99 | serial_tx_asynch9bit(&_serial, buffer, buffer_size, buffer_width, _thunk9_irq.entry(), event, _tx_usage); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 100 | } | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 101 | else | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 102 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 103 | serial_tx_asynch(&_serial, buffer, buffer_size, buffer_width, _thunk9_irq.entry(), event, _tx_usage); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 104 | } | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 105 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 106 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 107 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 108 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 109 | void UART9BIT::start_read(void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event, unsigned char char_match) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 110 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 111 | _rx_asynch_set = true; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 112 | _rx_callback = callback; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 113 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 114 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 115 | _thunk9_irq.callback(&UART9BIT::interrupt_handler_asynch); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 116 | sleep_manager_lock_deep_sleep(); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 117 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 118 | if(Enable9Bit) | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 119 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 120 | serial_rx_asynch9bit(&_serial, buffer, buffer_size, buffer_width, _thunk9_irq.entry(), event, char_match, _rx_usage); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 121 | printf("serial_rx_asynch9bit \r\n"); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 122 | } | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 123 | else | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 124 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 125 | serial_rx_asynch(&_serial, buffer, buffer_size, buffer_width, _thunk9_irq.entry(), event, char_match, _rx_usage); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 126 | } | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 127 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 128 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 129 | |
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 130 | uint16_t UART9BIT::getu16() | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 131 | { | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 132 | return serial_getc_9bit(&_serial); | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 133 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 134 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 135 | int UART9BIT::read(uint16_t *buffer, int length, const event_callback_t &callback, int event, unsigned char char_match) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 136 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 137 | int result = 0; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 138 | lock(); | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 139 | if (!serial_rx_active(&_serial) && !_rx_asynch_set) { | 
| mark.chen@ebn.com.tw | 8:716d4274f7b7 | 140 | start_read((void *)buffer, length, 8, callback, event, char_match); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 141 | } else { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 142 | result = -1; // transaction ongoing | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 143 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 144 | unlock(); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 145 | return result; | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 146 | } | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 147 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 148 | int UART9BIT::GitRxDataLen(void) | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 149 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 150 | int retcnt=0; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 151 | retcnt=_serial.rx_buff.pos; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 152 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 153 | return retcnt; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 154 | } | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 155 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 156 | void UART9BIT::SetRxDataLen(size_t len) | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 157 | { | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 158 | int retcnt=0; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 159 | _serial.rx_buff.pos=len; | 
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 160 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 161 | |
| mark.chen@ebn.com.tw | 7:af4ceb878eee | 162 | } | 
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 163 | |
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 164 | |
| mark.chen@ebn.com.tw | 1:9d4632d0b16f | 165 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 166 | void UART9BIT::GetUartName(void) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 167 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 168 | switch(_serial.serial.uart) | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 169 | { | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 170 | case UART_0: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 171 | printf("Uart 0 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 172 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 173 | case UART_1: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 174 | printf("Uart 1 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 175 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 176 | case UART_2: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 177 | printf("Uart 2 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 178 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 179 | case UART_3: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 180 | printf("Uart 3 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 181 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 182 | case UART_4: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 183 | printf("Uart 4 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 184 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 185 | case UART_5: | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 186 | printf("Uart 5 init \r\n"); | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 187 | break; | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 188 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 189 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 190 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 191 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 192 | } | 
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 193 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 194 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 195 | |
| mark.chen@ebn.com.tw | 6:64f5dad70ee2 | 196 |