forked from mirrors/qmk_userspace
		
	Improve PS/2 mouse performance (#17111)
This commit is contained in:
		
					parent
					
						
							
								d44a950c10
							
						
					
				
			
			
				commit
				
					
						ecce9900c9
					
				
			
		
					 4 changed files with 22 additions and 6 deletions
				
			
		| 
						 | 
					@ -89,6 +89,7 @@ uint8_t ps2_host_send(uint8_t data);
 | 
				
			||||||
uint8_t ps2_host_recv_response(void);
 | 
					uint8_t ps2_host_recv_response(void);
 | 
				
			||||||
uint8_t ps2_host_recv(void);
 | 
					uint8_t ps2_host_recv(void);
 | 
				
			||||||
void    ps2_host_set_led(uint8_t usb_led);
 | 
					void    ps2_host_set_led(uint8_t usb_led);
 | 
				
			||||||
 | 
					bool    pbuf_has_data(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*--------------------------------------------------------------------
 | 
					/*--------------------------------------------------------------------
 | 
				
			||||||
 * static functions
 | 
					 * static functions
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,8 +66,8 @@ uint8_t ps2_error = PS2_ERR_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline uint8_t pbuf_dequeue(void);
 | 
					static inline uint8_t pbuf_dequeue(void);
 | 
				
			||||||
static inline void    pbuf_enqueue(uint8_t data);
 | 
					static inline void    pbuf_enqueue(uint8_t data);
 | 
				
			||||||
static inline bool    pbuf_has_data(void);
 | 
					 | 
				
			||||||
static inline void    pbuf_clear(void);
 | 
					static inline void    pbuf_clear(void);
 | 
				
			||||||
 | 
					bool                  pbuf_has_data(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(PROTOCOL_CHIBIOS)
 | 
					#if defined(PROTOCOL_CHIBIOS)
 | 
				
			||||||
void ps2_interrupt_service_routine(void);
 | 
					void ps2_interrupt_service_routine(void);
 | 
				
			||||||
| 
						 | 
					@ -309,7 +309,7 @@ static inline uint8_t pbuf_dequeue(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return val;
 | 
					    return val;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static inline bool pbuf_has_data(void) {
 | 
					bool pbuf_has_data(void) {
 | 
				
			||||||
#if defined(__AVR__)
 | 
					#if defined(__AVR__)
 | 
				
			||||||
    uint8_t sreg = SREG;
 | 
					    uint8_t sreg = SREG;
 | 
				
			||||||
    cli();
 | 
					    cli();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ void ps2_mouse_init(void) {
 | 
				
			||||||
    ps2_mouse_set_remote_mode();
 | 
					    ps2_mouse_set_remote_mode();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    ps2_mouse_enable_data_reporting();
 | 
					    ps2_mouse_enable_data_reporting();
 | 
				
			||||||
 | 
					    ps2_mouse_set_stream_mode();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef PS2_MOUSE_ENABLE_SCROLLING
 | 
					#ifdef PS2_MOUSE_ENABLE_SCROLLING
 | 
				
			||||||
| 
						 | 
					@ -75,19 +76,33 @@ void ps2_mouse_task(void) {
 | 
				
			||||||
    extern int     tp_buttons;
 | 
					    extern int     tp_buttons;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* receives packet from mouse */
 | 
					    /* receives packet from mouse */
 | 
				
			||||||
 | 
					#ifdef PS2_MOUSE_USE_REMOTE_MODE
 | 
				
			||||||
    uint8_t rcv;
 | 
					    uint8_t rcv;
 | 
				
			||||||
    rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
 | 
					    rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
 | 
				
			||||||
    if (rcv == PS2_ACK) {
 | 
					    if (rcv == PS2_ACK) {
 | 
				
			||||||
        mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
 | 
					        mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
 | 
				
			||||||
        mouse_report.x       = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
 | 
					        mouse_report.x       = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
 | 
				
			||||||
        mouse_report.y       = ps2_host_recv_response() * PS2_MOUSE_Y_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;
 | 
					        mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
 | 
				
			||||||
#endif
 | 
					#    endif
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
 | 
					        if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
 | 
				
			||||||
        return;
 | 
					        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 moves or buttons state changes */
 | 
				
			||||||
    if (mouse_report.x || mouse_report.y || mouse_report.v || ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {
 | 
					    if (mouse_report.x || mouse_report.y || mouse_report.v || ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,8 +72,8 @@ uint8_t ps2_error = PS2_ERR_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline uint8_t pbuf_dequeue(void);
 | 
					static inline uint8_t pbuf_dequeue(void);
 | 
				
			||||||
static inline void    pbuf_enqueue(uint8_t data);
 | 
					static inline void    pbuf_enqueue(uint8_t data);
 | 
				
			||||||
static inline bool    pbuf_has_data(void);
 | 
					 | 
				
			||||||
static inline void    pbuf_clear(void);
 | 
					static inline void    pbuf_clear(void);
 | 
				
			||||||
 | 
					bool                  pbuf_has_data(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ps2_host_init(void) {
 | 
					void ps2_host_init(void) {
 | 
				
			||||||
    idle(); // without this many USART errors occur when cable is disconnected
 | 
					    idle(); // without this many USART errors occur when cable is disconnected
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,7 @@ static inline uint8_t pbuf_dequeue(void) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return val;
 | 
					    return val;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static inline bool pbuf_has_data(void) {
 | 
					bool pbuf_has_data(void) {
 | 
				
			||||||
    uint8_t sreg = SREG;
 | 
					    uint8_t sreg = SREG;
 | 
				
			||||||
    cli();
 | 
					    cli();
 | 
				
			||||||
    bool has_data = (pbuf_head != pbuf_tail);
 | 
					    bool has_data = (pbuf_head != pbuf_tail);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue