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(); |