|
@@ -1767,6 +1767,9 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|
|
int la_idx = cec_log_addr2idx(adap, dest_laddr);
|
|
|
bool from_unregistered = init_laddr == 0xf;
|
|
|
struct cec_msg tx_cec_msg = { };
|
|
|
+#ifdef CONFIG_MEDIA_CEC_RC
|
|
|
+ int scancode;
|
|
|
+#endif
|
|
|
|
|
|
dprintk(2, "%s: %*ph\n", __func__, msg->len, msg->msg);
|
|
|
|
|
@@ -1855,11 +1858,9 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|
|
*/
|
|
|
case 0x60:
|
|
|
if (msg->len == 2)
|
|
|
- rc_keydown(adap->rc, RC_TYPE_CEC,
|
|
|
- msg->msg[2], 0);
|
|
|
+ scancode = msg->msg[2];
|
|
|
else
|
|
|
- rc_keydown(adap->rc, RC_TYPE_CEC,
|
|
|
- msg->msg[2] << 8 | msg->msg[3], 0);
|
|
|
+ scancode = msg->msg[2] << 8 | msg->msg[3];
|
|
|
break;
|
|
|
/*
|
|
|
* Other function messages that are not handled.
|
|
@@ -1872,11 +1873,54 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|
|
*/
|
|
|
case 0x56: case 0x57:
|
|
|
case 0x67: case 0x68: case 0x69: case 0x6a:
|
|
|
+ scancode = -1;
|
|
|
break;
|
|
|
default:
|
|
|
- rc_keydown(adap->rc, RC_TYPE_CEC, msg->msg[2], 0);
|
|
|
+ scancode = msg->msg[2];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Was repeating, but keypress timed out */
|
|
|
+ if (adap->rc_repeating && !adap->rc->keypressed) {
|
|
|
+ adap->rc_repeating = false;
|
|
|
+ adap->rc_last_scancode = -1;
|
|
|
+ }
|
|
|
+ /* Different keypress from last time, ends repeat mode */
|
|
|
+ if (adap->rc_last_scancode != scancode) {
|
|
|
+ rc_keyup(adap->rc);
|
|
|
+ adap->rc_repeating = false;
|
|
|
+ }
|
|
|
+ /* We can't handle this scancode */
|
|
|
+ if (scancode < 0) {
|
|
|
+ adap->rc_last_scancode = scancode;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Send key press */
|
|
|
+ rc_keydown(adap->rc, RC_TYPE_CEC, scancode, 0);
|
|
|
+
|
|
|
+ /* When in repeating mode, we're done */
|
|
|
+ if (adap->rc_repeating)
|
|
|
+ break;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We are not repeating, but the new scancode is
|
|
|
+ * the same as the last one, and this second key press is
|
|
|
+ * within 550 ms (the 'Follower Safety Timeout') from the
|
|
|
+ * previous key press, so we now enable the repeating mode.
|
|
|
+ */
|
|
|
+ if (adap->rc_last_scancode == scancode &&
|
|
|
+ msg->rx_ts - adap->rc_last_keypress < 550 * NSEC_PER_MSEC) {
|
|
|
+ adap->rc_repeating = true;
|
|
|
break;
|
|
|
}
|
|
|
+ /*
|
|
|
+ * Not in repeating mode, so avoid triggering repeat mode
|
|
|
+ * by calling keyup.
|
|
|
+ */
|
|
|
+ rc_keyup(adap->rc);
|
|
|
+ adap->rc_last_scancode = scancode;
|
|
|
+ adap->rc_last_keypress = msg->rx_ts;
|
|
|
#endif
|
|
|
break;
|
|
|
|
|
@@ -1886,6 +1930,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|
|
break;
|
|
|
#ifdef CONFIG_MEDIA_CEC_RC
|
|
|
rc_keyup(adap->rc);
|
|
|
+ adap->rc_repeating = false;
|
|
|
+ adap->rc_last_scancode = -1;
|
|
|
#endif
|
|
|
break;
|
|
|
|