Selaa lähdekoodia

Improve PS/2 mouse performance (#17111)

Andrew Dunai 3 vuotta sitten
vanhempi
commit
ecce9900c9

+ 1 - 0
drivers/ps2/ps2.h

@@ -89,6 +89,7 @@ uint8_t ps2_host_send(uint8_t data);
 uint8_t ps2_host_recv_response(void);
 uint8_t ps2_host_recv(void);
 void    ps2_host_set_led(uint8_t usb_led);
+bool    pbuf_has_data(void);
 
 /*--------------------------------------------------------------------
  * static functions

+ 2 - 2
drivers/ps2/ps2_interrupt.c

@@ -66,8 +66,8 @@ uint8_t ps2_error = PS2_ERR_NONE;
 
 static inline uint8_t pbuf_dequeue(void);
 static inline void    pbuf_enqueue(uint8_t data);
-static inline bool    pbuf_has_data(void);
 static inline void    pbuf_clear(void);
+bool                  pbuf_has_data(void);
 
 #if defined(PROTOCOL_CHIBIOS)
 void ps2_interrupt_service_routine(void);
@@ -309,7 +309,7 @@ static inline uint8_t pbuf_dequeue(void) {
 
     return val;
 }
-static inline bool pbuf_has_data(void) {
+bool pbuf_has_data(void) {
 #if defined(__AVR__)
     uint8_t sreg = SREG;
     cli();

+ 17 - 2
drivers/ps2/ps2_mouse.c

@@ -53,6 +53,7 @@ void ps2_mouse_init(void) {
     ps2_mouse_set_remote_mode();
 #else
     ps2_mouse_enable_data_reporting();
+    ps2_mouse_set_stream_mode();
 #endif
 
 #ifdef PS2_MOUSE_ENABLE_SCROLLING
@@ -75,19 +76,33 @@ void ps2_mouse_task(void) {
     extern int     tp_buttons;
 
     /* receives packet from mouse */
+#ifdef PS2_MOUSE_USE_REMOTE_MODE
     uint8_t rcv;
     rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
     if (rcv == PS2_ACK) {
         mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
         mouse_report.x       = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
         mouse_report.y       = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
-#ifdef PS2_MOUSE_ENABLE_SCROLLING
+#    ifdef PS2_MOUSE_ENABLE_SCROLLING
         mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
-#endif
+#    endif
+    } else {
+        if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
+        return;
+    }
+#else
+    if (pbuf_has_data()) {
+        mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
+        mouse_report.x       = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
+        mouse_report.y       = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
+#    ifdef PS2_MOUSE_ENABLE_SCROLLING
+        mouse_report.v       = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
+#    endif
     } else {
         if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
         return;
     }
+#endif
 
     /* if mouse moves or buttons state changes */
     if (mouse_report.x || mouse_report.y || mouse_report.v || ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {

+ 2 - 2
platforms/avr/drivers/ps2/ps2_usart.c

@@ -72,8 +72,8 @@ uint8_t ps2_error = PS2_ERR_NONE;
 
 static inline uint8_t pbuf_dequeue(void);
 static inline void    pbuf_enqueue(uint8_t data);
-static inline bool    pbuf_has_data(void);
 static inline void    pbuf_clear(void);
+bool                  pbuf_has_data(void);
 
 void ps2_host_init(void) {
     idle(); // without this many USART errors occur when cable is disconnected
@@ -212,7 +212,7 @@ static inline uint8_t pbuf_dequeue(void) {
 
     return val;
 }
-static inline bool pbuf_has_data(void) {
+bool pbuf_has_data(void) {
     uint8_t sreg = SREG;
     cli();
     bool has_data = (pbuf_head != pbuf_tail);