forked from qmk/qmk_firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
95 additions
and
84 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,27 @@ | ||
PROTOCOL_DIR = protocol | ||
|
||
|
||
ifdef PS2_MOUSE_ENABLE | ||
SRC += $(PROTOCOL_DIR)/ps2_mouse.c | ||
OPT_DEFS += -DPS2_MOUSE_ENABLE | ||
OPT_DEFS += -DMOUSE_ENABLE | ||
endif | ||
|
||
ifdef PS2_USE_BUSYWAIT | ||
SRC += protocol/ps2.c | ||
OPT_DEFS += -DPS2_USE_BUSYWAIT | ||
endif | ||
|
||
ifdef PS2_USE_INT | ||
SRC += protocol/ps2.c | ||
OPT_DEFS += -DPS2_USE_INT | ||
endif | ||
|
||
ifdef PS2_USE_USART | ||
SRC += protocol/ps2_usart.c | ||
OPT_DEFS += -DPS2_USE_USART | ||
endif | ||
|
||
|
||
# Search Path | ||
VPATH += $(TOP_DIR)/protocol |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/* | ||
Copyright 2011 Jun Wako <[email protected]> | ||
Copyright 2011,2013 Jun Wako <[email protected]> | ||
This program is free software: you can redistribute it and/or modify | ||
it under the terms of the GNU General Public License as published by | ||
|
@@ -32,27 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |
# define phex16(h) | ||
#endif | ||
|
||
// disable when errors occur 255 times. | ||
#define ERROR_RETURN() do { \ | ||
if (ps2_error) { \ | ||
if (ps2_mouse_error_count < 255) { \ | ||
ps2_mouse_error_count++; \ | ||
} else { \ | ||
ps2_mouse_error_count = 0; \ | ||
ps2_mouse_enable = false; \ | ||
} \ | ||
return ps2_error; \ | ||
} \ | ||
} while (0) | ||
|
||
|
||
/* | ||
TODO | ||
---- | ||
- Stream mode | ||
- Tracpoint command support: needed | ||
- Middle button + move = Wheel traslation | ||
*/ | ||
bool ps2_mouse_enable = true; | ||
uint8_t ps2_mouse_x = 0; | ||
uint8_t ps2_mouse_y = 0; | ||
|
@@ -69,85 +49,50 @@ uint8_t ps2_mouse_init(void) { | |
|
||
ps2_host_init(); | ||
|
||
// Reset | ||
rcv = ps2_host_send(0xFF); | ||
print("ps2_mouse_init: send 0xFF: "); | ||
phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
// Not reliable: sometime fail to initialize mouse | ||
|
||
// ACK | ||
rcv = ps2_host_recv(); | ||
print("ps2_mouse_init: read ACK: "); | ||
// send Reset | ||
_delay_ms(1000); // wait for powering up | ||
rcv = ps2_host_send(0xFF); | ||
print("ps2_mouse_init: send Reset: "); | ||
phex(rcv); phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// BAT takes some time | ||
_delay_ms(100); | ||
// read completion code of BAT | ||
//_delay_ms(1000); // wait for Basic Assurance Test | ||
rcv = ps2_host_recv(); | ||
print("ps2_mouse_init: read BAT: "); | ||
phex(rcv); phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// Device ID | ||
// read Device ID | ||
rcv = ps2_host_recv(); | ||
print("ps2_mouse_init: read DevID: "); | ||
phex(rcv); phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// Enable data reporting | ||
ps2_host_send(0xF4); | ||
// send Enable Data Reporting | ||
rcv = ps2_host_send(0xF4); | ||
print("ps2_mouse_init: send 0xF4: "); | ||
phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// ACK | ||
rcv = ps2_host_recv(); | ||
print("ps2_mouse_init: read ACK: "); | ||
phex(rcv); phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// Set Remote mode | ||
ps2_host_send(0xF0); | ||
// send Set Remote mode | ||
rcv = ps2_host_send(0xF0); | ||
print("ps2_mouse_init: send 0xF0: "); | ||
phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
// ACK | ||
rcv = ps2_host_recv(); | ||
print("ps2_mouse_init: read ACK: "); | ||
phex(rcv); phex(ps2_error); print("\n"); | ||
ERROR_RETURN(); | ||
|
||
return 0; | ||
} | ||
|
||
/* | ||
Data format: | ||
bit: 7 6 5 4 3 2 1 0 | ||
----------------------------------------------------------------------- | ||
0 btn: Yovflw Xovflw Ysign Xsign 1 Middle Right Left | ||
1 x: X movement(0-255) | ||
2 y: Y movement(0-255) | ||
*/ | ||
uint8_t ps2_mouse_read(void) | ||
{ | ||
uint8_t rcv; | ||
|
||
if (!ps2_mouse_enable) return 1; | ||
|
||
ps2_host_send(0xEB); | ||
ERROR_RETURN(); | ||
|
||
rcv=ps2_host_recv(); | ||
ERROR_RETURN(); | ||
rcv = ps2_host_send(0xEB); | ||
|
||
if(rcv==0xFA) { | ||
ps2_mouse_btn = ps2_host_recv(); | ||
ERROR_RETURN(); | ||
ps2_mouse_x = ps2_host_recv(); | ||
ERROR_RETURN(); | ||
ps2_mouse_y = ps2_host_recv(); | ||
ERROR_RETURN(); | ||
ps2_mouse_btn = ps2_host_recv_response(); | ||
ps2_mouse_x = ps2_host_recv_response(); | ||
ps2_mouse_y = ps2_host_recv_response(); | ||
} | ||
return 0; | ||
} | ||
|
@@ -216,3 +161,36 @@ void ps2_mouse_print(void) | |
phex(ps2_mouse_x); print(" "); | ||
phex(ps2_mouse_y); print("\n"); | ||
} | ||
|
||
|
||
/* PS/2 Mouse Synopsis | ||
* http://www.computer-engineering.org/ps2mouse/ | ||
* | ||
* Command: | ||
* 0xFF: Reset | ||
* 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled | ||
* 0xF5: Disable Data Reporting | ||
* 0xF4: Enable Data Reporting | ||
* 0xF3: Set Sample Rate | ||
* 0xF2: Get Device ID | ||
* 0xF0: Set Remote Mode | ||
* 0xEB: Read Data | ||
* 0xEA: Set Stream Mode | ||
* 0xE9: Status Request | ||
* 0xE8: Set Resolution | ||
* 0xE7: Set Scaling 2:1 | ||
* 0xE6: Set Scaling 1:1 | ||
* | ||
* Mode: | ||
* Stream Mode: devices sends the data when it changs its state | ||
* Remote Mode: host polls the data periodically | ||
* | ||
* This code uses Remote Mode and polls the data with Read Data(0xEB). | ||
* | ||
* Data format: | ||
* byte|7 6 5 4 3 2 1 0 | ||
* ----+-------------------------------------------------------------- | ||
* 0|Yovflw Xovflw Ysign Xsign 1 Middle Right Left | ||
* 1| X movement(0-255) | ||
* 2| Y movement(0-255) | ||
*/ |