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