successfully read data from the matrix
This commit is contained in:
		
							parent
							
								
									19fd20261b
								
							
						
					
					
						commit
						d7fc236540
					
				
					 4 changed files with 93 additions and 75 deletions
				
			
		|  | @ -30,13 +30,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies |  * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies | ||||||
|  * Schematic is available at https://deskthority.net/w/images/a/a4/Frosty_Flake_Schematics.pdf
 |  * Ported from the Bathroom Epiphanies TMK Firmware: | ||||||
|  |  * https://github.com/BathroomEpiphanies/epiphanies_tmk_keyboard/tree/master/be_controllers
 | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /* key matrix size */ | /* key matrix size */ | ||||||
| #define MATRIX_ROWS 8    // Row0 to Row7 in the schematic
 | #define MATRIX_ROWS 18 | ||||||
| #define MATRIX_COLS 18   // ColA to ColR in the schematic
 | #define MATRIX_COLS 8 | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Keyboard Matrix Assignments |  * Keyboard Matrix Assignments | ||||||
|  |  | ||||||
|  | @ -3,9 +3,9 @@ | ||||||
| #   the appropriate keymap folder that will get included automatically
 | #   the appropriate keymap folder that will get included automatically
 | ||||||
| #
 | #
 | ||||||
| BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000) | BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000) | ||||||
| MOUSEKEY_ENABLE = yes       # Mouse keys(+4700) | MOUSEKEY_ENABLE = no       # Mouse keys(+4700) | ||||||
| EXTRAKEY_ENABLE = yes       # Audio control and System control(+450) | EXTRAKEY_ENABLE = yes       # Audio control and System control(+450) | ||||||
| CONSOLE_ENABLE = no         # Console for debug(+400) | CONSOLE_ENABLE = yes         # Console for debug(+400) | ||||||
| COMMAND_ENABLE = yes        # Commands for debug and configuration | COMMAND_ENABLE = yes        # Commands for debug and configuration | ||||||
| NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | ||||||
| BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality | BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality | ||||||
|  |  | ||||||
|  | @ -28,11 +28,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void matrix_init_user(void) { | void matrix_init_user(void) { | ||||||
| 
 |     debug_enable = true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void matrix_scan_user(void) { | void matrix_scan_user(void) { | ||||||
| 
 |     if (matrix_is_modified()) | ||||||
|  |         matrix_print(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool process_record_user(uint16_t keycode, keyrecord_t *record) { | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||||
|  | @ -41,4 +42,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||||
| 
 | 
 | ||||||
| void led_set_user(uint8_t usb_led) { | void led_set_user(uint8_t usb_led) { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -1,5 +1,3 @@ | ||||||
| //TODO(gabe): customize for frosty flake
 |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|   Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> |   Copyright 2014 Ralf Schmitt <ralf@bunkertor.net> | ||||||
| 
 | 
 | ||||||
|  | @ -26,16 +24,71 @@ | ||||||
| #include "util.h" | #include "util.h" | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
| 
 | 
 | ||||||
|  | #ifndef CONFIG_SPECIFIC_H | ||||||
|  | #define CONFIG_SPECIFIC_H | ||||||
|  | 
 | ||||||
|  | #define CONFIG_LED_IO \ | ||||||
|  |   DDRB |= (1<<7); \ | ||||||
|  |   DDRC |= (1<<5) | (1<<6); | ||||||
|  | 
 | ||||||
|  | #define USB_LED_CAPS_LOCK_ON    PORTC &= ~(1<<5) | ||||||
|  | #define USB_LED_CAPS_LOCK_OFF   PORTC |=  (1<<5) | ||||||
|  | #define USB_LED_NUM_LOCK_ON     PORTB &= ~(1<<7) | ||||||
|  | #define USB_LED_NUM_LOCK_OFF    PORTB |=  (1<<7) | ||||||
|  | #define USB_LED_SCROLL_LOCK_ON  PORTC &= ~(1<<6) | ||||||
|  | #define USB_LED_SCROLL_LOCK_OFF PORTC |=  (1<<6) | ||||||
|  | 
 | ||||||
|  | #define CONFIG_MATRIX_IO   \ | ||||||
|  |   /* Column output pins */ \ | ||||||
|  |   DDRD  |=  0b01111011;    \ | ||||||
|  |   /* Row input pins */     \ | ||||||
|  |   DDRC  &= ~0b10000000;    \ | ||||||
|  |   DDRB  &= ~0b01111111;    \ | ||||||
|  |   PORTC |=  0b10000000;    \ | ||||||
|  |   PORTB |=  0b01111111; | ||||||
|  | 
 | ||||||
|  | #define MATRIX_ROW_SCAN                      \ | ||||||
|  |   (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | \ | ||||||
|  |   (PINB&(1<<5) ? 0 : ((matrix_row_t)1<<1)) | \ | ||||||
|  |   (PINB&(1<<4) ? 0 : ((matrix_row_t)1<<2)) | \ | ||||||
|  |   (PINB&(1<<6) ? 0 : ((matrix_row_t)1<<3)) | \ | ||||||
|  |   (PINB&(1<<1) ? 0 : ((matrix_row_t)1<<4)) | \ | ||||||
|  |   (PINB&(1<<2) ? 0 : ((matrix_row_t)1<<5)) | \ | ||||||
|  |   (PINB&(1<<3) ? 0 : ((matrix_row_t)1<<6)) | \ | ||||||
|  |   (PINB&(1<<0) ? 0 : ((matrix_row_t)1<<7)) | ||||||
|  | 
 | ||||||
|  | #define MATRIX_ROW_SELECT                                     \ | ||||||
|  |   case  0: PORTD = (PORTD & ~0b01111011) | 0b00011011; break; \ | ||||||
|  |   case  1: PORTD = (PORTD & ~0b01111011) | 0b01000011; break; \ | ||||||
|  |   case  2: PORTD = (PORTD & ~0b01111011) | 0b01101010; break; \ | ||||||
|  |   case  3: PORTD = (PORTD & ~0b01111011) | 0b01111001; break; \ | ||||||
|  |   case  4: PORTD = (PORTD & ~0b01111011) | 0b01100010; break; \ | ||||||
|  |   case  5: PORTD = (PORTD & ~0b01111011) | 0b01110001; break; \ | ||||||
|  |   case  6: PORTD = (PORTD & ~0b01111011) | 0b01100001; break; \ | ||||||
|  |   case  7: PORTD = (PORTD & ~0b01111011) | 0b01110000; break; \ | ||||||
|  |   case  8: PORTD = (PORTD & ~0b01111011) | 0b01100000; break; \ | ||||||
|  |   case  9: PORTD = (PORTD & ~0b01111011) | 0b01101000; break; \ | ||||||
|  |   case 10: PORTD = (PORTD & ~0b01111011) | 0b00101011; break; \ | ||||||
|  |   case 11: PORTD = (PORTD & ~0b01111011) | 0b00110011; break; \ | ||||||
|  |   case 12: PORTD = (PORTD & ~0b01111011) | 0b00100011; break; \ | ||||||
|  |   case 13: PORTD = (PORTD & ~0b01111011) | 0b01111000; break; \ | ||||||
|  |   case 14: PORTD = (PORTD & ~0b01111011) | 0b00010011; break; \ | ||||||
|  |   case 15: PORTD = (PORTD & ~0b01111011) | 0b01101001; break; \ | ||||||
|  |   case 16: PORTD = (PORTD & ~0b01111011) | 0b00001011; break; \ | ||||||
|  |   case 17: PORTD = (PORTD & ~0b01111011) | 0b00111011; break; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifndef DEBOUNCING_DELAY | #ifndef DEBOUNCING_DELAY | ||||||
| #   define DEBOUNCING_DELAY 5 | #   define DEBOUNCING_DELAY 0 | ||||||
| #endif | #endif | ||||||
| static uint8_t debouncing = DEBOUNCING_DELAY; | static uint8_t debouncing = DEBOUNCING_DELAY; | ||||||
| 
 | 
 | ||||||
| static matrix_row_t matrix[MATRIX_ROWS]; | static matrix_row_t matrix[MATRIX_ROWS]; | ||||||
| static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | ||||||
| 
 | 
 | ||||||
| static uint8_t read_rows(void); | static matrix_row_t scan_row(void); | ||||||
| static void select_col(uint8_t col); | static void select_row(uint8_t row); | ||||||
| 
 | 
 | ||||||
| inline uint8_t matrix_rows(void) { | inline uint8_t matrix_rows(void) { | ||||||
|   return MATRIX_ROWS; |   return MATRIX_ROWS; | ||||||
|  | @ -45,58 +98,40 @@ inline uint8_t matrix_cols(void) { | ||||||
|   return MATRIX_COLS; |   return MATRIX_COLS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Column pin configuration
 |  | ||||||
|  * |  | ||||||
|  * col: 0    1    2    3    4    5    6    7 |  | ||||||
|  * pin: PC7  PD5  PD3  PD1  PC2  PD6  PD4  PD2 |  | ||||||
|  * |  | ||||||
|  * Rrr pin configuration  |  | ||||||
|  * |  | ||||||
|  * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low |  | ||||||
|  * active), together with 2 rrrs driven directly from the micro |  | ||||||
|  * controller, to control the 18 rrrs. The rrrs are driven from |  | ||||||
|  * pins B6,5,4,3,2,1,0. |  | ||||||
|  */ |  | ||||||
| void matrix_init(void) { | void matrix_init(void) { | ||||||
|   DDRC  &= ~0b10000100;  // Row input pins
 |   CONFIG_MATRIX_IO; | ||||||
|   DDRD  &= ~0b01111110; |  | ||||||
|   PORTC |=  0b10000100; |  | ||||||
|   PORTD |=  0b01111110; |  | ||||||
| 
 |  | ||||||
|   DDRB  |=  0b01111111;  // Column output pins
 |  | ||||||
| 
 | 
 | ||||||
|   for (uint8_t i=0; i < MATRIX_ROWS; i++)  { |   for (uint8_t i=0; i < MATRIX_ROWS; i++)  { | ||||||
|     matrix[i] = 0; |     matrix[i] = 0; | ||||||
|     matrix_debouncing[i] = 0; |     matrix_debouncing[i] = 0; | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   matrix_init_quantum(); |   matrix_init_quantum(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint8_t matrix_scan(void) { | uint8_t matrix_scan(void) { | ||||||
|   for (uint8_t col = 0; col < MATRIX_COLS; col++) { |   for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | ||||||
|     select_col(col); |     select_row(row); | ||||||
|     _delay_us(3); |     _delay_us(3); | ||||||
|     uint8_t rows = read_rows(); |     matrix_row_t row_scan = scan_row(); | ||||||
|     for (uint8_t row = 0; row < MATRIX_ROWS; row++) { |     for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||||||
|       bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); |       bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col); | ||||||
|       bool curr_bit = rows & (1<<row); |       bool curr_bit = row_scan & (1<<col); | ||||||
|       if (prev_bit != curr_bit) { |       if (prev_bit != curr_bit) { | ||||||
|         matrix_debouncing[row] ^= ((matrix_row_t)1<<col); |         matrix_debouncing[row] ^= ((matrix_row_t)1<<col); | ||||||
|         debouncing = DEBOUNCING_DELAY; |         debouncing = DEBOUNCING_DELAY; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|    | 
 | ||||||
|   if (debouncing) { |   if (debouncing) { | ||||||
|     if (--debouncing) { |     if (--debouncing) | ||||||
|       _delay_ms(1); |       _delay_ms(1); | ||||||
|     } |     else | ||||||
|     else { |       for (uint8_t i = 0; i < MATRIX_ROWS; i++) | ||||||
|       for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |  | ||||||
|         matrix[i] = matrix_debouncing[i]; |         matrix[i] = matrix_debouncing[i]; | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   matrix_scan_quantum(); |   matrix_scan_quantum(); | ||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  | @ -117,9 +152,15 @@ inline matrix_row_t matrix_get_row(uint8_t row) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void matrix_print(void) { | void matrix_print(void) { | ||||||
|   print("\nr/c 0123456789ABCDEF\n"); |   print("\nr/c 01234567\n"); | ||||||
|   for (uint8_t row = 0; row < MATRIX_ROWS; row++) { |   for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | ||||||
|     xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row))); |     matrix_row_t row_scan = matrix_get_row(row); | ||||||
|  |     xprintf("%02X: ", row); | ||||||
|  |     for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||||||
|  |       bool curr_bit = row_scan & (1<<col); | ||||||
|  |       xprintf("%c", curr_bit ? '*' : '.'); | ||||||
|  |     } | ||||||
|  |     print("\n"); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -131,37 +172,12 @@ uint8_t matrix_key_count(void) { | ||||||
|   return count; |   return count; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static uint8_t read_rows(void) { | static matrix_row_t scan_row(void) { | ||||||
|   return |   return MATRIX_ROW_SCAN; | ||||||
|     (PINC&(1<<7) ? 0 : (1<<0)) | |  | ||||||
|     (PIND&(1<<5) ? 0 : (1<<1)) | |  | ||||||
|     (PIND&(1<<3) ? 0 : (1<<2)) | |  | ||||||
|     (PIND&(1<<1) ? 0 : (1<<3)) | |  | ||||||
|     (PINC&(1<<2) ? 0 : (1<<4)) | |  | ||||||
|     (PIND&(1<<2) ? 0 : (1<<5)) | |  | ||||||
|     (PIND&(1<<4) ? 0 : (1<<6)) | |  | ||||||
|     (PIND&(1<<6) ? 0 : (1<<7)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void select_col(uint8_t col) { | static void select_row(uint8_t row) { | ||||||
|   switch (col) { |   switch (row) { | ||||||
|   case  0: PORTB = (PORTB & ~0b01111111) | 0b01100100; break; |     MATRIX_ROW_SELECT; | ||||||
|   case  1: PORTB = (PORTB & ~0b01111111) | 0b01101100; break; |  | ||||||
|   case  2: PORTB = (PORTB & ~0b01111111) | 0b01100010; break; |  | ||||||
|   case  3: PORTB = (PORTB & ~0b01111111) | 0b01111010; break; |  | ||||||
|   case  4: PORTB = (PORTB & ~0b01111111) | 0b01100110; break; |  | ||||||
|   case  5: PORTB = (PORTB & ~0b01111111) | 0b01110110; break; |  | ||||||
|   case  6: PORTB = (PORTB & ~0b01111111) | 0b01101110; break; |  | ||||||
|   case  7: PORTB = (PORTB & ~0b01111111) | 0b01111110; break; |  | ||||||
|   case  8: PORTB = (PORTB & ~0b01111111) | 0b01000001; break; |  | ||||||
|   case  9: PORTB = (PORTB & ~0b01111111) | 0b00100001; break; |  | ||||||
|   case 10: PORTB = (PORTB & ~0b01111111) | 0b01101010; break; |  | ||||||
|   case 11: PORTB = (PORTB & ~0b01111111) | 0b01110010; break; |  | ||||||
|   case 12: PORTB = (PORTB & ~0b01111111) | 0b01111100; break; |  | ||||||
|   case 13: PORTB = (PORTB & ~0b01111111) | 0b01110100; break; |  | ||||||
|   case 14: PORTB = (PORTB & ~0b01111111) | 0b01111000; break; |  | ||||||
|   case 15: PORTB = (PORTB & ~0b01111111) | 0b01110000; break; |  | ||||||
|   case 16: PORTB = (PORTB & ~0b01111111) | 0b01100000; break; |  | ||||||
|   case 17: PORTB = (PORTB & ~0b01111111) | 0b01101000; break; |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gabriel Young
						Gabriel Young