diff options
Diffstat (limited to 'drivers/chibios/serial.c')
| -rw-r--r-- | drivers/chibios/serial.c | 52 |
1 files changed, 20 insertions, 32 deletions
diff --git a/drivers/chibios/serial.c b/drivers/chibios/serial.c index 54f7e1321..f54fbcee4 100644 --- a/drivers/chibios/serial.c +++ b/drivers/chibios/serial.c | |||
| @@ -74,21 +74,12 @@ static THD_FUNCTION(Thread1, arg) { | |||
| 74 | } | 74 | } |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | static SSTD_t *Transaction_table = NULL; | 77 | void soft_serial_initiator_init(void) { |
| 78 | static uint8_t Transaction_table_size = 0; | ||
| 79 | |||
| 80 | void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { | ||
| 81 | Transaction_table = sstd_table; | ||
| 82 | Transaction_table_size = (uint8_t)sstd_table_size; | ||
| 83 | |||
| 84 | serial_output(); | 78 | serial_output(); |
| 85 | serial_high(); | 79 | serial_high(); |
| 86 | } | 80 | } |
| 87 | 81 | ||
| 88 | void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { | 82 | void soft_serial_target_init(void) { |
| 89 | Transaction_table = sstd_table; | ||
| 90 | Transaction_table_size = (uint8_t)sstd_table_size; | ||
| 91 | |||
| 92 | serial_input(); | 83 | serial_input(); |
| 93 | 84 | ||
| 94 | palEnablePadEvent(PAL_PORT(SOFT_SERIAL_PIN), PAL_PAD(SOFT_SERIAL_PIN), PAL_EVENT_MODE_FALLING_EDGE); | 85 | palEnablePadEvent(PAL_PORT(SOFT_SERIAL_PIN), PAL_PAD(SOFT_SERIAL_PIN), PAL_EVENT_MODE_FALLING_EDGE); |
| @@ -154,16 +145,14 @@ void interrupt_handler(void *arg) { | |||
| 154 | uint8_t checksum_computed = 0; | 145 | uint8_t checksum_computed = 0; |
| 155 | int sstd_index = 0; | 146 | int sstd_index = 0; |
| 156 | 147 | ||
| 157 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
| 158 | sstd_index = serial_read_byte(); | 148 | sstd_index = serial_read_byte(); |
| 159 | sync_send(); | 149 | sync_send(); |
| 160 | #endif | ||
| 161 | 150 | ||
| 162 | SSTD_t *trans = &Transaction_table[sstd_index]; | 151 | split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; |
| 163 | for (int i = 0; i < trans->initiator2target_buffer_size; ++i) { | 152 | for (int i = 0; i < trans->initiator2target_buffer_size; ++i) { |
| 164 | trans->initiator2target_buffer[i] = serial_read_byte(); | 153 | split_trans_initiator2target_buffer(trans)[i] = serial_read_byte(); |
| 165 | sync_send(); | 154 | sync_send(); |
| 166 | checksum_computed += trans->initiator2target_buffer[i]; | 155 | checksum_computed += split_trans_initiator2target_buffer(trans)[i]; |
| 167 | } | 156 | } |
| 168 | checksum_computed ^= 7; | 157 | checksum_computed ^= 7; |
| 169 | uint8_t checksum_received = serial_read_byte(); | 158 | uint8_t checksum_received = serial_read_byte(); |
| @@ -172,12 +161,17 @@ void interrupt_handler(void *arg) { | |||
| 172 | // wait for the sync to finish sending | 161 | // wait for the sync to finish sending |
| 173 | serial_delay(); | 162 | serial_delay(); |
| 174 | 163 | ||
| 164 | // Allow any slave processing to occur | ||
| 165 | if (trans->slave_callback) { | ||
| 166 | trans->slave_callback(trans->initiator2target_buffer_size, split_trans_initiator2target_buffer(trans), trans->target2initiator_buffer_size, split_trans_target2initiator_buffer(trans)); | ||
| 167 | } | ||
| 168 | |||
| 175 | uint8_t checksum = 0; | 169 | uint8_t checksum = 0; |
| 176 | for (int i = 0; i < trans->target2initiator_buffer_size; ++i) { | 170 | for (int i = 0; i < trans->target2initiator_buffer_size; ++i) { |
| 177 | serial_write_byte(trans->target2initiator_buffer[i]); | 171 | serial_write_byte(split_trans_target2initiator_buffer(trans)[i]); |
| 178 | sync_send(); | 172 | sync_send(); |
| 179 | serial_delay_half(); | 173 | serial_delay_half(); |
| 180 | checksum += trans->target2initiator_buffer[i]; | 174 | checksum += split_trans_target2initiator_buffer(trans)[i]; |
| 181 | } | 175 | } |
| 182 | serial_write_byte(checksum ^ 7); | 176 | serial_write_byte(checksum ^ 7); |
| 183 | sync_send(); | 177 | sync_send(); |
| @@ -206,15 +200,10 @@ void interrupt_handler(void *arg) { | |||
| 206 | // TRANSACTION_NO_RESPONSE | 200 | // TRANSACTION_NO_RESPONSE |
| 207 | // TRANSACTION_DATA_ERROR | 201 | // TRANSACTION_DATA_ERROR |
| 208 | // this code is very time dependent, so we need to disable interrupts | 202 | // this code is very time dependent, so we need to disable interrupts |
| 209 | #ifndef SERIAL_USE_MULTI_TRANSACTION | ||
| 210 | int soft_serial_transaction(void) { | ||
| 211 | int sstd_index = 0; | ||
| 212 | #else | ||
| 213 | int soft_serial_transaction(int sstd_index) { | 203 | int soft_serial_transaction(int sstd_index) { |
| 214 | #endif | 204 | if (sstd_index > NUM_TOTAL_TRANSACTIONS) return TRANSACTION_TYPE_ERROR; |
| 215 | 205 | split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; | |
| 216 | if (sstd_index > Transaction_table_size) return TRANSACTION_TYPE_ERROR; | 206 | if (!trans->status) return TRANSACTION_TYPE_ERROR; // not registered |
| 217 | SSTD_t *trans = &Transaction_table[sstd_index]; | ||
| 218 | 207 | ||
| 219 | // TODO: remove extra delay between transactions | 208 | // TODO: remove extra delay between transactions |
| 220 | serial_delay(); | 209 | serial_delay(); |
| @@ -244,14 +233,13 @@ int soft_serial_transaction(int sstd_index) { | |||
| 244 | 233 | ||
| 245 | uint8_t checksum = 0; | 234 | uint8_t checksum = 0; |
| 246 | // send data to the slave | 235 | // send data to the slave |
| 247 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
| 248 | serial_write_byte(sstd_index); // first chunk is transaction id | 236 | serial_write_byte(sstd_index); // first chunk is transaction id |
| 249 | sync_recv(); | 237 | sync_recv(); |
| 250 | #endif | 238 | |
| 251 | for (int i = 0; i < trans->initiator2target_buffer_size; ++i) { | 239 | for (int i = 0; i < trans->initiator2target_buffer_size; ++i) { |
| 252 | serial_write_byte(trans->initiator2target_buffer[i]); | 240 | serial_write_byte(split_trans_initiator2target_buffer(trans)[i]); |
| 253 | sync_recv(); | 241 | sync_recv(); |
| 254 | checksum += trans->initiator2target_buffer[i]; | 242 | checksum += split_trans_initiator2target_buffer(trans)[i]; |
| 255 | } | 243 | } |
| 256 | serial_write_byte(checksum ^ 7); | 244 | serial_write_byte(checksum ^ 7); |
| 257 | sync_recv(); | 245 | sync_recv(); |
| @@ -262,9 +250,9 @@ int soft_serial_transaction(int sstd_index) { | |||
| 262 | // receive data from the slave | 250 | // receive data from the slave |
| 263 | uint8_t checksum_computed = 0; | 251 | uint8_t checksum_computed = 0; |
| 264 | for (int i = 0; i < trans->target2initiator_buffer_size; ++i) { | 252 | for (int i = 0; i < trans->target2initiator_buffer_size; ++i) { |
| 265 | trans->target2initiator_buffer[i] = serial_read_byte(); | 253 | split_trans_target2initiator_buffer(trans)[i] = serial_read_byte(); |
| 266 | sync_recv(); | 254 | sync_recv(); |
| 267 | checksum_computed += trans->target2initiator_buffer[i]; | 255 | checksum_computed += split_trans_target2initiator_buffer(trans)[i]; |
| 268 | } | 256 | } |
| 269 | checksum_computed ^= 7; | 257 | checksum_computed ^= 7; |
| 270 | uint8_t checksum_received = serial_read_byte(); | 258 | uint8_t checksum_received = serial_read_byte(); |
