@@ -33,6 +33,7 @@ void rf_send_blank_report();
3333bool rf_get_status (uint8_t status_bytes [2 ]);
3434void rf_cmd_01 (uint8_t mode , uint8_t pairing );
3535void rf_cmd_02 (uint8_t * buffer );
36+ void rf_cmd_02_nkro (__xdata uint8_t mods , __xdata uint8_t * nkro_buffer );
3637void rf_cmd_03 (uint8_t param );
3738void rf_cmd_04 ();
3839void rf_cmd_05 (uint16_t consumer , uint16_t system );
@@ -70,46 +71,78 @@ void rf_init()
7071 rf_send_blank_report ();
7172}
7273
73- void rf_send_report (report_keyboard_t * report )
74- {
75- __xdata uint8_t buffer [6 ];
74+ __xdata uint8_t kro6buffer [6 ];
7675
77- buffer [0 ] = report -> raw [0 ];
78- buffer [1 ] = report -> raw [2 ];
79- buffer [2 ] = report -> raw [3 ];
80- buffer [3 ] = report -> raw [4 ];
81- buffer [4 ] = report -> raw [5 ];
82- buffer [5 ] = report -> raw [6 ];
76+ void rf_send_report (__xdata report_keyboard_t * report )
77+ {
78+ kro6buffer [0 ] = report -> raw [0 ];
79+ kro6buffer [1 ] = report -> raw [2 ];
80+ kro6buffer [2 ] = report -> raw [3 ];
81+ kro6buffer [3 ] = report -> raw [4 ];
82+ kro6buffer [4 ] = report -> raw [5 ];
83+ kro6buffer [5 ] = report -> raw [6 ];
8384
8485 bool blank = true;
85- for (int i = 0 ; i < 6 ; i ++ ) {
86- if (buffer [i ] != 0 ) {
86+ for (__xdata int i = 0 ; i < 6 ; i ++ ) {
87+ if (kro6buffer [i ] != 0 ) {
88+ blank = false;
89+ }
90+ }
91+
92+ if (blank ) {
93+ // blanking sequence
94+ kro6buffer [1 ] = 0x00 ;
95+ rf_cmd_02 (kro6buffer );
96+ kro6buffer [1 ] = 0x01 ;
97+ rf_cmd_02 (kro6buffer );
98+ kro6buffer [1 ] = 0x00 ;
99+ rf_cmd_02 (kro6buffer );
100+ kro6buffer [1 ] = 0x01 ;
101+ rf_cmd_02 (kro6buffer );
102+ kro6buffer [1 ] = 0x00 ;
103+ rf_cmd_02 (kro6buffer );
104+ kro6buffer [1 ] = 0x01 ;
105+ rf_cmd_02 (kro6buffer );
106+ kro6buffer [1 ] = 0x00 ;
107+ rf_cmd_02 (kro6buffer );
108+ } else {
109+ rf_cmd_02 (kro6buffer );
110+ }
111+ }
112+
113+ void rf_send_nkro (__xdata report_nkro_t * report )
114+ {
115+ __xdata bool blank = true;
116+ for (__xdata int i = 1 ; i < NKRO_REPORT_SIZE - 1 ; i ++ ) {
117+ if (report -> raw [i ] != 0 ) {
87118 blank = false;
88119 }
89120 }
90121
122+ dprintf ("is blank: %d\r\n" , blank ); // FIXME: a delay is necessary here
123+
91124 if (blank ) {
92125 // blanking sequence
93- buffer [1 ] = 0x00 ;
94- rf_cmd_02 (buffer );
95- buffer [1 ] = 0x01 ;
96- rf_cmd_02 (buffer );
97- buffer [1 ] = 0x00 ;
98- rf_cmd_02 (buffer );
99- buffer [1 ] = 0x01 ;
100- rf_cmd_02 (buffer );
101- buffer [1 ] = 0x00 ;
102- rf_cmd_02 (buffer );
103- buffer [1 ] = 0x01 ;
104- rf_cmd_02 (buffer );
105- buffer [1 ] = 0x00 ;
106- rf_cmd_02 (buffer );
126+ kro6buffer [1 ] = 0x00 ;
127+ rf_cmd_02 (kro6buffer );
128+ kro6buffer [1 ] = 0x01 ;
129+ rf_cmd_02 (kro6buffer );
130+ kro6buffer [1 ] = 0x00 ;
131+ rf_cmd_02 (kro6buffer );
132+ kro6buffer [1 ] = 0x01 ;
133+ rf_cmd_02 (kro6buffer );
134+ kro6buffer [1 ] = 0x00 ;
135+ rf_cmd_02 (kro6buffer );
136+ kro6buffer [1 ] = 0x01 ;
137+ rf_cmd_02 (kro6buffer );
138+ kro6buffer [1 ] = 0x00 ;
139+ rf_cmd_02 (kro6buffer );
107140 } else {
108- rf_cmd_02 ( buffer );
141+ rf_cmd_02_nkro ( report -> mods , report -> bits );
109142 }
110143}
111144
112- void rf_send_extra (report_extra_t * report )
145+ void rf_send_extra (__xdata report_extra_t * report )
113146{
114147 switch (report -> report_id ) {
115148 case REPORT_ID_SYSTEM :
@@ -215,7 +248,6 @@ void rf_cmd_02(uint8_t *buffer)
215248 rf_tx_buf [6 ] = buffer [3 ];
216249 rf_tx_buf [7 ] = buffer [4 ];
217250 rf_tx_buf [8 ] = buffer [5 ];
218- // FIXME: last keyboard report key is lost
219251 rf_tx_buf [9 ] = 0x00 ; // 0x00 or 0x01
220252
221253 for (int i = 10 ; i < 31 ; i ++ ) { // FIXME: NKRO bytes are blanked out until they are implemented
@@ -227,6 +259,51 @@ void rf_cmd_02(uint8_t *buffer)
227259 bb_spi_xfer (rf_tx_buf , len );
228260}
229261
262+ void rf_cmd_02_nkro (__xdata uint8_t mods , __xdata uint8_t * nkro_buffer )
263+ {
264+ const uint8_t len = 32 ;
265+
266+ rf_tx_buf [0 ] = MAGIC_BYTE ;
267+ rf_tx_buf [1 ] = len - 3 ;
268+ rf_tx_buf [2 ] = CMD_REPORT ;
269+ rf_tx_buf [3 ] = mods ;
270+
271+ rf_tx_buf [4 ] = 0x00 ;
272+ rf_tx_buf [5 ] = 0x00 ;
273+ rf_tx_buf [6 ] = 0x00 ;
274+ rf_tx_buf [7 ] = 0x00 ;
275+ rf_tx_buf [8 ] = 0x00 ;
276+
277+ rf_tx_buf [9 ] = 0x00 ; // 0x00 or 0x01
278+
279+ rf_tx_buf [10 ] = nkro_buffer [0 ];
280+ rf_tx_buf [11 ] = nkro_buffer [1 ];
281+ rf_tx_buf [12 ] = nkro_buffer [2 ];
282+ rf_tx_buf [13 ] = nkro_buffer [3 ];
283+ rf_tx_buf [14 ] = nkro_buffer [4 ];
284+ rf_tx_buf [15 ] = nkro_buffer [5 ];
285+ rf_tx_buf [16 ] = nkro_buffer [6 ];
286+ rf_tx_buf [17 ] = nkro_buffer [7 ];
287+ rf_tx_buf [18 ] = nkro_buffer [8 ];
288+ rf_tx_buf [19 ] = nkro_buffer [9 ];
289+ rf_tx_buf [20 ] = nkro_buffer [10 ];
290+ rf_tx_buf [21 ] = nkro_buffer [11 ];
291+ rf_tx_buf [22 ] = nkro_buffer [12 ];
292+ rf_tx_buf [23 ] = nkro_buffer [13 ];
293+ rf_tx_buf [24 ] = nkro_buffer [14 ];
294+ rf_tx_buf [25 ] = nkro_buffer [15 ];
295+ rf_tx_buf [26 ] = nkro_buffer [16 ];
296+ rf_tx_buf [27 ] = nkro_buffer [17 ];
297+ rf_tx_buf [28 ] = nkro_buffer [18 ];
298+ rf_tx_buf [29 ] = nkro_buffer [19 ];
299+
300+ rf_tx_buf [30 ] = 0x00 ;
301+
302+ rf_tx_buf [31 ] = checksum (rf_tx_buf , len - 1 );
303+
304+ bb_spi_xfer (rf_tx_buf , len );
305+ }
306+
230307void rf_cmd_03 (uint8_t param ) // ?? or 0x02
231308{
232309 const uint8_t len = 6 ;
0 commit comments