diff options
Diffstat (limited to 'drivers/chibios/serial_usart.c')
| -rw-r--r-- | drivers/chibios/serial_usart.c | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/drivers/chibios/serial_usart.c b/drivers/chibios/serial_usart.c index cae29388c..9f180d2d7 100644 --- a/drivers/chibios/serial_usart.c +++ b/drivers/chibios/serial_usart.c | |||
| @@ -113,37 +113,29 @@ void usart_slave_init(void) { | |||
| 113 | chThdCreateStatic(waSlaveThread, sizeof(waSlaveThread), HIGHPRIO, SlaveThread, NULL); | 113 | chThdCreateStatic(waSlaveThread, sizeof(waSlaveThread), HIGHPRIO, SlaveThread, NULL); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | static SSTD_t* Transaction_table = NULL; | 116 | void soft_serial_initiator_init(void) { usart_master_init(); } |
| 117 | static uint8_t Transaction_table_size = 0; | ||
| 118 | 117 | ||
| 119 | void soft_serial_initiator_init(SSTD_t* sstd_table, int sstd_table_size) { | 118 | void soft_serial_target_init(void) { usart_slave_init(); } |
| 120 | Transaction_table = sstd_table; | ||
| 121 | Transaction_table_size = (uint8_t)sstd_table_size; | ||
| 122 | |||
| 123 | usart_master_init(); | ||
| 124 | } | ||
| 125 | |||
| 126 | void soft_serial_target_init(SSTD_t* sstd_table, int sstd_table_size) { | ||
| 127 | Transaction_table = sstd_table; | ||
| 128 | Transaction_table_size = (uint8_t)sstd_table_size; | ||
| 129 | |||
| 130 | usart_slave_init(); | ||
| 131 | } | ||
| 132 | 119 | ||
| 133 | void handle_soft_serial_slave(void) { | 120 | void handle_soft_serial_slave(void) { |
| 134 | uint8_t sstd_index = sdGet(&SERIAL_USART_DRIVER); // first chunk is always transaction id | 121 | uint8_t sstd_index = sdGet(&SERIAL_USART_DRIVER); // first chunk is always transaction id |
| 135 | SSTD_t* trans = &Transaction_table[sstd_index]; | 122 | split_transaction_desc_t* trans = &split_transaction_table[sstd_index]; |
| 136 | 123 | ||
| 137 | // Always write back the sstd_index as part of a basic handshake | 124 | // Always write back the sstd_index as part of a basic handshake |
| 138 | sstd_index ^= HANDSHAKE_MAGIC; | 125 | sstd_index ^= HANDSHAKE_MAGIC; |
| 139 | sdWrite(&SERIAL_USART_DRIVER, &sstd_index, sizeof(sstd_index)); | 126 | sdWrite(&SERIAL_USART_DRIVER, &sstd_index, sizeof(sstd_index)); |
| 140 | 127 | ||
| 141 | if (trans->initiator2target_buffer_size) { | 128 | if (trans->initiator2target_buffer_size) { |
| 142 | sdRead(&SERIAL_USART_DRIVER, trans->initiator2target_buffer, trans->initiator2target_buffer_size); | 129 | sdRead(&SERIAL_USART_DRIVER, split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size); |
| 130 | } | ||
| 131 | |||
| 132 | // Allow any slave processing to occur | ||
| 133 | if (trans->slave_callback) { | ||
| 134 | trans->slave_callback(trans->initiator2target_buffer_size, split_trans_initiator2target_buffer(trans), trans->target2initiator_buffer_size, split_trans_target2initiator_buffer(trans)); | ||
| 143 | } | 135 | } |
| 144 | 136 | ||
| 145 | if (trans->target2initiator_buffer_size) { | 137 | if (trans->target2initiator_buffer_size) { |
| 146 | sdWrite(&SERIAL_USART_DRIVER, trans->target2initiator_buffer, trans->target2initiator_buffer_size); | 138 | sdWrite(&SERIAL_USART_DRIVER, split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size); |
| 147 | } | 139 | } |
| 148 | 140 | ||
| 149 | if (trans->status) { | 141 | if (trans->status) { |
| @@ -160,17 +152,14 @@ void handle_soft_serial_slave(void) { | |||
| 160 | // TRANSACTION_END | 152 | // TRANSACTION_END |
| 161 | // TRANSACTION_NO_RESPONSE | 153 | // TRANSACTION_NO_RESPONSE |
| 162 | // TRANSACTION_DATA_ERROR | 154 | // TRANSACTION_DATA_ERROR |
| 163 | #ifndef SERIAL_USE_MULTI_TRANSACTION | ||
| 164 | int soft_serial_transaction(void) { | ||
| 165 | uint8_t sstd_index = 0; | ||
| 166 | #else | ||
| 167 | int soft_serial_transaction(int index) { | 155 | int soft_serial_transaction(int index) { |
| 168 | uint8_t sstd_index = index; | 156 | uint8_t sstd_index = index; |
| 169 | #endif | ||
| 170 | 157 | ||
| 171 | if (sstd_index > Transaction_table_size) return TRANSACTION_TYPE_ERROR; | 158 | if (sstd_index > NUM_TOTAL_TRANSACTIONS) return TRANSACTION_TYPE_ERROR; |
| 172 | SSTD_t* trans = &Transaction_table[sstd_index]; | 159 | split_transaction_desc_t* trans = &split_transaction_table[sstd_index]; |
| 173 | msg_t res = 0; | 160 | msg_t res = 0; |
| 161 | |||
| 162 | if (!trans->status) return TRANSACTION_TYPE_ERROR; // not registered | ||
| 174 | 163 | ||
| 175 | sdClear(&SERIAL_USART_DRIVER); | 164 | sdClear(&SERIAL_USART_DRIVER); |
| 176 | 165 | ||
| @@ -189,7 +178,7 @@ int soft_serial_transaction(int index) { | |||
| 189 | } | 178 | } |
| 190 | 179 | ||
| 191 | if (trans->initiator2target_buffer_size) { | 180 | if (trans->initiator2target_buffer_size) { |
| 192 | res = sdWriteTimeout(&SERIAL_USART_DRIVER, trans->initiator2target_buffer, trans->initiator2target_buffer_size, TIME_MS2I(SERIAL_USART_TIMEOUT)); | 181 | res = sdWriteTimeout(&SERIAL_USART_DRIVER, split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size, TIME_MS2I(SERIAL_USART_TIMEOUT)); |
| 193 | if (res < 0) { | 182 | if (res < 0) { |
| 194 | dprintf("serial::usart_transmit NO_RESPONSE\n"); | 183 | dprintf("serial::usart_transmit NO_RESPONSE\n"); |
| 195 | return TRANSACTION_NO_RESPONSE; | 184 | return TRANSACTION_NO_RESPONSE; |
| @@ -197,7 +186,7 @@ int soft_serial_transaction(int index) { | |||
| 197 | } | 186 | } |
| 198 | 187 | ||
| 199 | if (trans->target2initiator_buffer_size) { | 188 | if (trans->target2initiator_buffer_size) { |
| 200 | res = sdReadTimeout(&SERIAL_USART_DRIVER, trans->target2initiator_buffer, trans->target2initiator_buffer_size, TIME_MS2I(SERIAL_USART_TIMEOUT)); | 189 | res = sdReadTimeout(&SERIAL_USART_DRIVER, split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size, TIME_MS2I(SERIAL_USART_TIMEOUT)); |
| 201 | if (res < 0) { | 190 | if (res < 0) { |
| 202 | dprintf("serial::usart_receive NO_RESPONSE\n"); | 191 | dprintf("serial::usart_receive NO_RESPONSE\n"); |
| 203 | return TRANSACTION_NO_RESPONSE; | 192 | return TRANSACTION_NO_RESPONSE; |
