mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Deprecate split transactions status field (#16023)
This commit is contained in:
		
							parent
							
								
									ed8ab3e32c
								
							
						
					
					
						commit
						be59e8af2b
					
				| @ -26,21 +26,4 @@ void soft_serial_initiator_init(void); | |||||||
| // target is interrupt accept side
 | // target is interrupt accept side
 | ||||||
| void soft_serial_target_init(void); | void soft_serial_target_init(void); | ||||||
| 
 | 
 | ||||||
| // initiator result
 | bool soft_serial_transaction(int sstd_index); | ||||||
| #define TRANSACTION_END 0 |  | ||||||
| #define TRANSACTION_NO_RESPONSE 0x1 |  | ||||||
| #define TRANSACTION_DATA_ERROR 0x2 |  | ||||||
| #define TRANSACTION_TYPE_ERROR 0x4 |  | ||||||
| int soft_serial_transaction(int sstd_index); |  | ||||||
| 
 |  | ||||||
| // target status
 |  | ||||||
| // *SSTD_t.status has
 |  | ||||||
| //   initiator:
 |  | ||||||
| //       TRANSACTION_END
 |  | ||||||
| //    or TRANSACTION_NO_RESPONSE
 |  | ||||||
| //    or TRANSACTION_DATA_ERROR
 |  | ||||||
| //   target:
 |  | ||||||
| //       TRANSACTION_DATA_ERROR
 |  | ||||||
| //    or TRANSACTION_ACCEPTED
 |  | ||||||
| #define TRANSACTION_ACCEPTED 0x8 |  | ||||||
| int soft_serial_get_and_clean_status(int sstd_index); |  | ||||||
|  | |||||||
| @ -409,13 +409,7 @@ ISR(SERIAL_PIN_INTERRUPT) { | |||||||
| 
 | 
 | ||||||
|     // target recive phase
 |     // target recive phase
 | ||||||
|     if (trans->initiator2target_buffer_size > 0) { |     if (trans->initiator2target_buffer_size > 0) { | ||||||
|         if (serial_recive_packet((uint8_t *)split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size)) { |         serial_recive_packet((uint8_t *)split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size); | ||||||
|             *trans->status = TRANSACTION_ACCEPTED; |  | ||||||
|         } else { |  | ||||||
|             *trans->status = TRANSACTION_DATA_ERROR; |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         *trans->status = TRANSACTION_ACCEPTED; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     sync_recv();  // weit initiator output to high
 |     sync_recv();  // weit initiator output to high
 | ||||||
| @ -424,19 +418,13 @@ ISR(SERIAL_PIN_INTERRUPT) { | |||||||
| /////////
 | /////////
 | ||||||
| //  start transaction by initiator
 | //  start transaction by initiator
 | ||||||
| //
 | //
 | ||||||
| // int  soft_serial_transaction(int sstd_index)
 | // bool  soft_serial_transaction(int sstd_index)
 | ||||||
| //
 | //
 | ||||||
| // Returns:
 |  | ||||||
| //    TRANSACTION_END
 |  | ||||||
| //    TRANSACTION_NO_RESPONSE
 |  | ||||||
| //    TRANSACTION_DATA_ERROR
 |  | ||||||
| // this code is very time dependent, so we need to disable interrupts
 | // this code is very time dependent, so we need to disable interrupts
 | ||||||
| int soft_serial_transaction(int sstd_index) { | bool soft_serial_transaction(int sstd_index) { | ||||||
|     if (sstd_index > NUM_TOTAL_TRANSACTIONS) return TRANSACTION_TYPE_ERROR; |     if (sstd_index > NUM_TOTAL_TRANSACTIONS) return false; | ||||||
|     split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; |     split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; | ||||||
| 
 | 
 | ||||||
|     if (!trans->status) return TRANSACTION_TYPE_ERROR;  // not registered
 |  | ||||||
| 
 |  | ||||||
|     cli(); |     cli(); | ||||||
| 
 | 
 | ||||||
|     // signal to the target that we want to start a transaction
 |     // signal to the target that we want to start a transaction
 | ||||||
| @ -463,9 +451,8 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|             // slave failed to pull the line low, assume not present
 |             // slave failed to pull the line low, assume not present
 | ||||||
|             serial_output(); |             serial_output(); | ||||||
|             serial_high(); |             serial_high(); | ||||||
|             *trans->status = TRANSACTION_NO_RESPONSE; |  | ||||||
|             sei(); |             sei(); | ||||||
|             return TRANSACTION_NO_RESPONSE; |             return false; | ||||||
|         } |         } | ||||||
|         _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); |         _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); | ||||||
|     } |     } | ||||||
| @ -476,9 +463,8 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|         if (!serial_recive_packet((uint8_t *)split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { |         if (!serial_recive_packet((uint8_t *)split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { | ||||||
|             serial_output(); |             serial_output(); | ||||||
|             serial_high(); |             serial_high(); | ||||||
|             *trans->status = TRANSACTION_DATA_ERROR; |  | ||||||
|             sei(); |             sei(); | ||||||
|             return TRANSACTION_DATA_ERROR; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -493,19 +479,8 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|     // always, release the line when not in use
 |     // always, release the line when not in use
 | ||||||
|     sync_send(); |     sync_send(); | ||||||
| 
 | 
 | ||||||
|     *trans->status = TRANSACTION_END; |  | ||||||
|     sei(); |     sei(); | ||||||
|     return TRANSACTION_END; |     return true; | ||||||
| } |  | ||||||
| 
 |  | ||||||
| int soft_serial_get_and_clean_status(int sstd_index) { |  | ||||||
|     split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; |  | ||||||
|     cli(); |  | ||||||
|     int retval     = *trans->status; |  | ||||||
|     *trans->status = 0; |  | ||||||
|     ; |  | ||||||
|     sei(); |  | ||||||
|     return retval; |  | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -179,8 +179,6 @@ void interrupt_handler(void *arg) { | |||||||
|     // wait for the sync to finish sending
 |     // wait for the sync to finish sending
 | ||||||
|     serial_delay(); |     serial_delay(); | ||||||
| 
 | 
 | ||||||
|     *trans->status = (checksum_computed == checksum_received) ? TRANSACTION_ACCEPTED : TRANSACTION_DATA_ERROR; |  | ||||||
| 
 |  | ||||||
|     // end transaction
 |     // end transaction
 | ||||||
|     serial_input(); |     serial_input(); | ||||||
| 
 | 
 | ||||||
| @ -193,17 +191,12 @@ void interrupt_handler(void *arg) { | |||||||
| /////////
 | /////////
 | ||||||
| //  start transaction by initiator
 | //  start transaction by initiator
 | ||||||
| //
 | //
 | ||||||
| // int  soft_serial_transaction(int sstd_index)
 | // bool  soft_serial_transaction(int sstd_index)
 | ||||||
| //
 | //
 | ||||||
| // Returns:
 |  | ||||||
| //    TRANSACTION_END
 |  | ||||||
| //    TRANSACTION_NO_RESPONSE
 |  | ||||||
| //    TRANSACTION_DATA_ERROR
 |  | ||||||
| // this code is very time dependent, so we need to disable interrupts
 | // this code is very time dependent, so we need to disable interrupts
 | ||||||
| int soft_serial_transaction(int sstd_index) { | bool soft_serial_transaction(int sstd_index) { | ||||||
|     if (sstd_index > NUM_TOTAL_TRANSACTIONS) return TRANSACTION_TYPE_ERROR; |     if (sstd_index > NUM_TOTAL_TRANSACTIONS) return false; | ||||||
|     split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; |     split_transaction_desc_t *trans = &split_transaction_table[sstd_index]; | ||||||
|     if (!trans->status) return TRANSACTION_TYPE_ERROR;  // not registered
 |  | ||||||
| 
 | 
 | ||||||
|     // TODO: remove extra delay between transactions
 |     // TODO: remove extra delay between transactions
 | ||||||
|     serial_delay(); |     serial_delay(); | ||||||
| @ -226,7 +219,7 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|         // slave failed to pull the line low, assume not present
 |         // slave failed to pull the line low, assume not present
 | ||||||
|         dprintf("serial::NO_RESPONSE\n"); |         dprintf("serial::NO_RESPONSE\n"); | ||||||
|         chSysUnlock(); |         chSysUnlock(); | ||||||
|         return TRANSACTION_NO_RESPONSE; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // if the slave is present syncronize with it
 |     // if the slave is present syncronize with it
 | ||||||
| @ -266,7 +259,7 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|         serial_high(); |         serial_high(); | ||||||
| 
 | 
 | ||||||
|         chSysUnlock(); |         chSysUnlock(); | ||||||
|         return TRANSACTION_DATA_ERROR; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // always, release the line when not in use
 |     // always, release the line when not in use
 | ||||||
| @ -274,5 +267,5 @@ int soft_serial_transaction(int sstd_index) { | |||||||
|     serial_output(); |     serial_output(); | ||||||
| 
 | 
 | ||||||
|     chSysUnlock(); |     chSysUnlock(); | ||||||
|     return TRANSACTION_END; |     return true; | ||||||
| } | } | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ static SerialDriver* serial_driver = &SERIAL_USART_DRIVER; | |||||||
| static inline bool react_to_transactions(void); | static inline bool react_to_transactions(void); | ||||||
| static inline bool __attribute__((nonnull)) receive(uint8_t* destination, const size_t size); | static inline bool __attribute__((nonnull)) receive(uint8_t* destination, const size_t size); | ||||||
| static inline bool __attribute__((nonnull)) send(const uint8_t* source, const size_t size); | static inline bool __attribute__((nonnull)) send(const uint8_t* source, const size_t size); | ||||||
| static inline int  initiate_transaction(uint8_t sstd_index); | static inline bool initiate_transaction(uint8_t sstd_index); | ||||||
| static inline void usart_clear(void); | static inline void usart_clear(void); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
| @ -206,14 +206,12 @@ static inline bool react_to_transactions(void) { | |||||||
|      to signal that the slave is ready to receive possible transaction buffers  */ |      to signal that the slave is ready to receive possible transaction buffers  */ | ||||||
|     sstd_index ^= HANDSHAKE_MAGIC; |     sstd_index ^= HANDSHAKE_MAGIC; | ||||||
|     if (!send(&sstd_index, sizeof(sstd_index))) { |     if (!send(&sstd_index, sizeof(sstd_index))) { | ||||||
|         *trans->status = TRANSACTION_DATA_ERROR; |  | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Receive transaction buffer from the master. If this transaction requires it.*/ |     /* Receive transaction buffer from the master. If this transaction requires it.*/ | ||||||
|     if (trans->initiator2target_buffer_size) { |     if (trans->initiator2target_buffer_size) { | ||||||
|         if (!receive(split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size)) { |         if (!receive(split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size)) { | ||||||
|             *trans->status = TRANSACTION_DATA_ERROR; |  | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -226,12 +224,10 @@ static inline bool react_to_transactions(void) { | |||||||
|     /* Send transaction buffer to the master. If this transaction requires it. */ |     /* Send transaction buffer to the master. If this transaction requires it. */ | ||||||
|     if (trans->target2initiator_buffer_size) { |     if (trans->target2initiator_buffer_size) { | ||||||
|         if (!send(split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { |         if (!send(split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { | ||||||
|             *trans->status = TRANSACTION_DATA_ERROR; |  | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     *trans->status = TRANSACTION_ACCEPTED; |  | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -252,11 +248,9 @@ void soft_serial_initiator_init(void) { | |||||||
|  * @brief Start transaction from the master half to the slave half. |  * @brief Start transaction from the master half to the slave half. | ||||||
|  * |  * | ||||||
|  * @param index Transaction Table index of the transaction to start. |  * @param index Transaction Table index of the transaction to start. | ||||||
|  * @return int TRANSACTION_NO_RESPONSE in case of Timeout. |  * @return bool Indicates success of transaction. | ||||||
|  *             TRANSACTION_TYPE_ERROR in case of invalid transaction index. |  | ||||||
|  *             TRANSACTION_END in case of success. |  | ||||||
|  */ |  */ | ||||||
| int soft_serial_transaction(int index) { | bool soft_serial_transaction(int index) { | ||||||
|     /* Clear the receive queue, to start with a clean slate.
 |     /* Clear the receive queue, to start with a clean slate.
 | ||||||
|      * Parts of failed transactions or spurious bytes could still be in it. */ |      * Parts of failed transactions or spurious bytes could still be in it. */ | ||||||
|     usart_clear(); |     usart_clear(); | ||||||
| @ -266,25 +260,19 @@ int soft_serial_transaction(int index) { | |||||||
| /**
 | /**
 | ||||||
|  * @brief Initiate transaction to slave half. |  * @brief Initiate transaction to slave half. | ||||||
|  */ |  */ | ||||||
| static inline int initiate_transaction(uint8_t sstd_index) { | static inline bool initiate_transaction(uint8_t sstd_index) { | ||||||
|     /* Sanity check that we are actually starting a valid transaction. */ |     /* Sanity check that we are actually starting a valid transaction. */ | ||||||
|     if (sstd_index >= NUM_TOTAL_TRANSACTIONS) { |     if (sstd_index >= NUM_TOTAL_TRANSACTIONS) { | ||||||
|         dprintln("USART: Illegal transaction Id."); |         dprintln("USART: Illegal transaction Id."); | ||||||
|         return TRANSACTION_TYPE_ERROR; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     split_transaction_desc_t* trans = &split_transaction_table[sstd_index]; |     split_transaction_desc_t* trans = &split_transaction_table[sstd_index]; | ||||||
| 
 | 
 | ||||||
|     /* Transaction is not registered. Abort. */ |  | ||||||
|     if (!trans->status) { |  | ||||||
|         dprintln("USART: Transaction not registered."); |  | ||||||
|         return TRANSACTION_TYPE_ERROR; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* Send transaction table index to the slave, which doubles as basic handshake token. */ |     /* Send transaction table index to the slave, which doubles as basic handshake token. */ | ||||||
|     if (!send(&sstd_index, sizeof(sstd_index))) { |     if (!send(&sstd_index, sizeof(sstd_index))) { | ||||||
|         dprintln("USART: Send Handshake failed."); |         dprintln("USART: Send Handshake failed."); | ||||||
|         return TRANSACTION_TYPE_ERROR; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     uint8_t sstd_index_shake = 0xFF; |     uint8_t sstd_index_shake = 0xFF; | ||||||
| @ -295,14 +283,14 @@ static inline int initiate_transaction(uint8_t sstd_index) { | |||||||
|      */ |      */ | ||||||
|     if (!receive(&sstd_index_shake, sizeof(sstd_index_shake)) || (sstd_index_shake != (sstd_index ^ HANDSHAKE_MAGIC))) { |     if (!receive(&sstd_index_shake, sizeof(sstd_index_shake)) || (sstd_index_shake != (sstd_index ^ HANDSHAKE_MAGIC))) { | ||||||
|         dprintln("USART: Handshake failed."); |         dprintln("USART: Handshake failed."); | ||||||
|         return TRANSACTION_NO_RESPONSE; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Send transaction buffer to the slave. If this transaction requires it. */ |     /* Send transaction buffer to the slave. If this transaction requires it. */ | ||||||
|     if (trans->initiator2target_buffer_size) { |     if (trans->initiator2target_buffer_size) { | ||||||
|         if (!send(split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size)) { |         if (!send(split_trans_initiator2target_buffer(trans), trans->initiator2target_buffer_size)) { | ||||||
|             dprintln("USART: Send failed."); |             dprintln("USART: Send failed."); | ||||||
|             return TRANSACTION_NO_RESPONSE; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -310,9 +298,9 @@ static inline int initiate_transaction(uint8_t sstd_index) { | |||||||
|     if (trans->target2initiator_buffer_size) { |     if (trans->target2initiator_buffer_size) { | ||||||
|         if (!receive(split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { |         if (!receive(split_trans_target2initiator_buffer(trans), trans->target2initiator_buffer_size)) { | ||||||
|             dprintln("USART: Receive failed."); |             dprintln("USART: Receive failed."); | ||||||
|             return TRANSACTION_NO_RESPONSE; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return TRANSACTION_END; |     return true; | ||||||
| } | } | ||||||
|  | |||||||
| @ -35,11 +35,11 @@ | |||||||
| #define sizeof_member(type, member) sizeof(((type *)NULL)->member) | #define sizeof_member(type, member) sizeof(((type *)NULL)->member) | ||||||
| 
 | 
 | ||||||
| #define trans_initiator2target_initializer_cb(member, cb) \ | #define trans_initiator2target_initializer_cb(member, cb) \ | ||||||
|     { &dummy, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), 0, 0, cb } |     { sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), 0, 0, cb } | ||||||
| #define trans_initiator2target_initializer(member) trans_initiator2target_initializer_cb(member, NULL) | #define trans_initiator2target_initializer(member) trans_initiator2target_initializer_cb(member, NULL) | ||||||
| 
 | 
 | ||||||
| #define trans_target2initiator_initializer_cb(member, cb) \ | #define trans_target2initiator_initializer_cb(member, cb) \ | ||||||
|     { &dummy, 0, 0, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), cb } |     { 0, 0, sizeof_member(split_shared_memory_t, member), offsetof(split_shared_memory_t, member), cb } | ||||||
| #define trans_target2initiator_initializer(member) trans_target2initiator_initializer_cb(member, NULL) | #define trans_target2initiator_initializer(member) trans_target2initiator_initializer_cb(member, NULL) | ||||||
| 
 | 
 | ||||||
| #define transport_write(id, data, length) transport_execute_transaction(id, data, length, NULL, 0) | #define transport_write(id, data, length) transport_execute_transaction(id, data, length, NULL, 0) | ||||||
| @ -658,10 +658,9 @@ static void pointing_handlers_slave(matrix_row_t master_matrix[], matrix_row_t s | |||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
| uint8_t                  dummy; |  | ||||||
| split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { | split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = { | ||||||
|     // Set defaults
 |     // Set defaults
 | ||||||
|     [0 ...(NUM_TOTAL_TRANSACTIONS - 1)] = {NULL, 0, 0, 0, 0, 0}, |     [0 ...(NUM_TOTAL_TRANSACTIONS - 1)] = {0, 0, 0, 0, 0}, | ||||||
| 
 | 
 | ||||||
| #ifdef USE_I2C | #ifdef USE_I2C | ||||||
|     [I2C_EXECUTE_CALLBACK] = trans_initiator2target_initializer(transaction_id), |     [I2C_EXECUTE_CALLBACK] = trans_initiator2target_initializer(transaction_id), | ||||||
|  | |||||||
| @ -27,7 +27,6 @@ typedef void (*slave_callback_t)(uint8_t initiator2target_buffer_size, const voi | |||||||
| 
 | 
 | ||||||
| // Split transaction Descriptor
 | // Split transaction Descriptor
 | ||||||
| typedef struct _split_transaction_desc_t { | typedef struct _split_transaction_desc_t { | ||||||
|     uint8_t *        status; |  | ||||||
|     uint8_t          initiator2target_buffer_size; |     uint8_t          initiator2target_buffer_size; | ||||||
|     uint16_t         initiator2target_offset; |     uint16_t         initiator2target_offset; | ||||||
|     uint8_t          target2initiator_buffer_size; |     uint8_t          target2initiator_buffer_size; | ||||||
|  | |||||||
| @ -99,7 +99,7 @@ bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, | |||||||
|         memcpy(split_trans_initiator2target_buffer(trans), initiator2target_buf, len); |         memcpy(split_trans_initiator2target_buffer(trans), initiator2target_buf, len); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (soft_serial_transaction(id) != TRANSACTION_END) { |     if (!soft_serial_transaction(id)) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Stefan Kerkmann
						Stefan Kerkmann