@@ -644,6 +644,70 @@ void lpc_aux_put_char(uint8_t chr, int send_irq)
644644 LOG_INF ("AUX put %02x" , kb_char );
645645}
646646
647+ #ifdef CONFIG_THIRD_PARTY_CUSTOMIZED_DESIGN
648+
649+ /*
650+ * this can delay EC release irq and clear IBF
651+ * it will let host not send data too fast, make EC
652+ * have time to process 8042 data and also not lose data
653+ * after delay finish read HIKMDI clear IBF data and release 8042 irq
654+ */
655+ static void lpc_kbc_irq_handle (void )
656+ {
657+ int rv ;
658+
659+ rv = espi_write_lpc_request (espi_dev , E8042_RESUME_IRQ , 0 );
660+ if (rv ) {
661+ LOG_ERR ("ESPI write failed: E8042_RESUME_IRQ = %d" , rv );
662+ }
663+ }
664+ DECLARE_DEFERRED (lpc_kbc_irq_handle );
665+
666+ static void kbc_ibf_obe_handler (uint32_t data )
667+ {
668+ #ifdef HAS_TASK_KEYPROTO
669+ uint8_t is_ibf = is_8042_ibf (data );
670+ uint32_t status = I8042_AUX_DATA ;
671+ uint32_t request ;
672+ int rv ;
673+
674+ if (is_ibf == HOST_KBC_EVT_IBF ) {
675+
676+ /* reserve one buffer size for 8042 data handle. */
677+ if (keyboard_host_write_avaliable () <= 1 ) {
678+ /* Pause 8042 irq let KB task process data */
679+ rv = espi_write_lpc_request (espi_dev , E8042_PAUSE_IRQ , 0 );
680+ if (rv ) {
681+ LOG_ERR ("ESPI write failed: E8042_PAUSE_IRQ = %d" , rv );
682+ }
683+
684+ hook_call_deferred (& lpc_kbc_irq_handle_data , MSEC );
685+ } else {
686+ /* put data to queue and trigger 8042 task*/
687+ keyboard_host_write (get_8042_data (data ), get_8042_type (data ));
688+
689+ /* clear IBF let host send next data */
690+ rv = espi_read_lpc_request (espi_dev , E8042_CLEAR_IBF , & request );
691+ if (rv ) {
692+ LOG_ERR ("ESPI read failed: E8042_CLEAR_IBF = %d" , rv );
693+ return ;
694+ }
695+ }
696+ } else if (IS_ENABLED (CONFIG_8042_AUX )) {
697+ rv = espi_write_lpc_request (espi_dev , E8042_CLEAR_FLAG ,
698+ & status );
699+ if (rv ) {
700+ LOG_ERR ("ESPI write failed: E8042_CLEAR_FLAG = %d" , rv );
701+ }
702+ }
703+
704+ /* OBE data coming */
705+ if (is_ibf != HOST_KBC_EVT_IBF )
706+ task_wake (TASK_ID_KEYPROTO );
707+
708+ #endif
709+ }
710+ #else
647711static void kbc_ibf_obe_handler (uint32_t data )
648712{
649713#ifdef HAS_TASK_KEYPROTO
@@ -663,6 +727,7 @@ static void kbc_ibf_obe_handler(uint32_t data)
663727 task_wake (TASK_ID_KEYPROTO );
664728#endif
665729}
730+ #endif
666731
667732int lpc_keyboard_input_pending (void )
668733{
0 commit comments