aboutsummaryrefslogtreecommitdiff
path: root/keyboards/helix/rev2/matrix.c
diff options
context:
space:
mode:
authorMakotoKurauchi <pluis@me.com>2018-08-11 00:22:09 +0900
committerDrashna Jaelre <drashna@live.com>2018-08-10 08:22:09 -0700
commitfeb5e4aaebb78842c090230f68ea9de80a5c17e6 (patch)
tree2cab4463fd3f01c4bb47175ec54ad61f1994ce2d /keyboards/helix/rev2/matrix.c
parent90d8ed6c448a7b09e0a459181f889e3153d960ee (diff)
downloadqmk_firmware-feb5e4aaebb78842c090230f68ea9de80a5c17e6.tar.gz
qmk_firmware-feb5e4aaebb78842c090230f68ea9de80a5c17e6.zip
Keyboard: Helix serial improvements (#3608)
* add change_reciver2sender()/change_sender2reciver() This is a change to improve readability. * txled, rxled off in matrix_init() * add serial_send_packet() / serial_recive_packet() This is a change to reduce object size. * add serial_low() at ISR() top * add __attribute__((always_inline)) to some functions * modify serial_send_packet()/serial_recive_packet() A little, object size reduction. A little, speedup. * add debug code to helix/serial.c * Adjust sampling timing of serial signal being received * add split_scomm.c/split_scomm.h and change serial.c/serial.h serial.c was divided into 2 layers, split_scom.c and serial.c. The upper layer split_scomm.c is called from matrix.c. The lower layer serial.c accesses the hardware. * add split_scomm.c/split_scomm.h into helix/rev1 * reduce object size helix/rev2/matrix.c * remove checksum check, add parity check * force occur parity error for test * parity test ok. remove test code * change some comment & add skip code when buffer_size == 0 * serial.c: multiple types of transaction support Add 4 bits transaction-type field at packet top. Select Transaction Descriptor Table entry by transaction-type. * helix serial master-slave transaction optimize Using multi-type transaction feature of serial.c, communication contents between master slaves were optimized. * add debug code for retry * add comment into each config.h * fix ISR status drop * add a debug macro 'debug_retry_chg()' * reduce led_test size * remove debug code from helix/serial.c and etc. * helix:five_rows change TAPPING_TERM value 140 * Improved compatibility with let's split of serial.c. Finish helix/serial.c improvement. - The difference with the original let's split's serial.c - It's high-speed about 4 times. - Stable bi-directional data transfer. (Helix need master to slave transfer) - serial.h was divided 2 files, serial_config.h and sereial.h - With multiple types of transaction support, communication contents can be optimized. (NEW flexible API) - USE OLD Simple APIs (compatible with let's split serial.c) - files : - serial_config.h -- hardware configuration (need include by config.h) - serial.c/serial.h -- serial communication - USE NEW flexible APIs. (Support multi-type transaction function.) serial.c was divided into 2 layers, split_scom.c and serial.c. The upper layer split_scomm.c is called from matrix.c. The lower layer serial.c accesses the hardware. - files - split_scomm.c -- communication buffer is defined in here. call by matrix.c. - split_scomm.h -- buffer size is defined in here. include by matrix.c, split_util.c - serial_config.h -- hardware configuration (need include by config.h) To use the NEW API, specify #define SERIAL_USE_MULTI_TRANSACTION - serial.c/serial.h -- serial communication lower layer - NEW APIs for serial.c / serial.h (The lower layer) // Soft Serial Transaction Descriptor typedef struct _SSTD_t { uint8_t *status; uint8_t initiator2target_buffer_size; uint8_t *initiator2target_buffer; uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; // initiator is transaction start side void soft_serial_initiator_init(SSTD_t *sstd_table); // target is interrupt accept side void soft_serial_target_init(SSTD_t *sstd_table); int soft_serial_transaction(int sstd_index); int soft_serial_get_and_clean_target_status(int sstd_index); - NEW APIs for split_scomm.c / split_scomm.h (The upper layer) move from old serial.c the following buffer and functions serial_slave_buffer[] serial_master_buffer[] void serial_master_init(void) void serial_slave_init(void) int serial_update_buffers(void) define SERIAL_xxxxx_BUFFER_LENGTH move from serial_config.h to split_scomm.h
Diffstat (limited to 'keyboards/helix/rev2/matrix.c')
-rw-r--r--keyboards/helix/rev2/matrix.c58
1 files changed, 34 insertions, 24 deletions
diff --git a/keyboards/helix/rev2/matrix.c b/keyboards/helix/rev2/matrix.c
index 8a1ce3af1..322959dbb 100644
--- a/keyboards/helix/rev2/matrix.c
+++ b/keyboards/helix/rev2/matrix.c
@@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */ 20 */
21#include <stdint.h> 21#include <stdint.h>
22#include <stdbool.h> 22#include <stdbool.h>
23#include <string.h>
23#include <avr/io.h> 24#include <avr/io.h>
24#include <avr/wdt.h> 25#include <avr/wdt.h>
25#include <avr/interrupt.h> 26#include <avr/interrupt.h>
@@ -34,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
34#ifdef USE_MATRIX_I2C 35#ifdef USE_MATRIX_I2C
35# include "i2c.h" 36# include "i2c.h"
36#else // USE_SERIAL 37#else // USE_SERIAL
37# include "serial.h" 38# include "split_scomm.h"
38#endif 39#endif
39 40
40#ifndef DEBOUNCE 41#ifndef DEBOUNCE
@@ -102,6 +103,8 @@ void matrix_init(void)
102 init_cols(); 103 init_cols();
103 104
104 TX_RX_LED_INIT; 105 TX_RX_LED_INIT;
106 TXLED0;
107 RXLED0;
105 108
106 // initialize matrix state: all keys off 109 // initialize matrix state: all keys off
107 for (uint8_t i=0; i < MATRIX_ROWS; i++) { 110 for (uint8_t i=0; i < MATRIX_ROWS; i++) {
@@ -178,17 +181,20 @@ i2c_error: // the cable is disconnceted, or something else went wrong
178 181
179#else // USE_SERIAL 182#else // USE_SERIAL
180 183
181int serial_transaction(void) { 184int serial_transaction(int master_changed) {
182 int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; 185 int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
186#ifdef SERIAL_USE_MULTI_TRANSACTION
187 int ret=serial_update_buffers(master_changed);
188#else
183 int ret=serial_update_buffers(); 189 int ret=serial_update_buffers();
190#endif
184 if (ret ) { 191 if (ret ) {
185 if(ret==2)RXLED1; 192 if(ret==2) RXLED1;
186 return 1; 193 return 1;
187 } 194 }
188RXLED0; 195 RXLED0;
189 for (int i = 0; i < ROWS_PER_HAND; ++i) { 196 memcpy(&matrix[slaveOffset],
190 matrix[slaveOffset+i] = serial_slave_buffer[i]; 197 (void *)serial_slave_buffer, sizeof(serial_slave_buffer));
191 }
192 return 0; 198 return 0;
193} 199}
194#endif 200#endif
@@ -199,19 +205,9 @@ uint8_t matrix_scan(void)
199 matrix_master_scan(); 205 matrix_master_scan();
200 }else{ 206 }else{
201 matrix_slave_scan(); 207 matrix_slave_scan();
202 208 int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
203// if(serial_slave_DATA_CORRUPT()){ 209 memcpy(&matrix[offset],
204// TXLED0; 210 (void *)serial_master_buffer, sizeof(serial_master_buffer));
205 int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
206
207 for (int i = 0; i < ROWS_PER_HAND; ++i) {
208 matrix[offset+i] = serial_master_buffer[i];
209 }
210
211// }else{
212// TXLED1;
213// }
214
215 matrix_scan_quantum(); 211 matrix_scan_quantum();
216 } 212 }
217 return 1; 213 return 1;
@@ -221,6 +217,7 @@ uint8_t matrix_scan(void)
221uint8_t matrix_master_scan(void) { 217uint8_t matrix_master_scan(void) {
222 218
223 int ret = _matrix_scan(); 219 int ret = _matrix_scan();
220 int mchanged = 1;
224 221
225#ifndef KEYBOARD_helix_rev1 222#ifndef KEYBOARD_helix_rev1
226 int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; 223 int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
@@ -231,16 +228,19 @@ uint8_t matrix_master_scan(void) {
231// i2c_slave_buffer[i] = matrix[offset+i]; 228// i2c_slave_buffer[i] = matrix[offset+i];
232// } 229// }
233#else // USE_SERIAL 230#else // USE_SERIAL
234 for (int i = 0; i < ROWS_PER_HAND; ++i) { 231 #ifdef SERIAL_USE_MULTI_TRANSACTION
235 serial_master_buffer[i] = matrix[offset+i]; 232 mchanged = memcmp((void *)serial_master_buffer,
236 } 233 &matrix[offset], sizeof(serial_master_buffer));
234 #endif
235 memcpy((void *)serial_master_buffer,
236 &matrix[offset], sizeof(serial_master_buffer));
237#endif 237#endif
238#endif 238#endif
239 239
240#ifdef USE_MATRIX_I2C 240#ifdef USE_MATRIX_I2C
241 if( i2c_transaction() ) { 241 if( i2c_transaction() ) {
242#else // USE_SERIAL 242#else // USE_SERIAL
243 if( serial_transaction() ) { 243 if( serial_transaction(mchanged) ) {
244#endif 244#endif
245 // turn on the indicator led when halves are disconnected 245 // turn on the indicator led when halves are disconnected
246 TXLED1; 246 TXLED1;
@@ -274,9 +274,19 @@ void matrix_slave_scan(void) {
274 i2c_slave_buffer[i] = matrix[offset+i]; 274 i2c_slave_buffer[i] = matrix[offset+i];
275 } 275 }
276#else // USE_SERIAL 276#else // USE_SERIAL
277 #ifdef SERIAL_USE_MULTI_TRANSACTION
278 int change = 0;
279 #endif
277 for (int i = 0; i < ROWS_PER_HAND; ++i) { 280 for (int i = 0; i < ROWS_PER_HAND; ++i) {
281 #ifdef SERIAL_USE_MULTI_TRANSACTION
282 if( serial_slave_buffer[i] != matrix[offset+i] )
283 change = 1;
284 #endif
278 serial_slave_buffer[i] = matrix[offset+i]; 285 serial_slave_buffer[i] = matrix[offset+i];
279 } 286 }
287 #ifdef SERIAL_USE_MULTI_TRANSACTION
288 slave_buffer_change_count += change;
289 #endif
280#endif 290#endif
281} 291}
282 292