Commit graph

1847 commits

Author SHA1 Message Date
tmk
b6ccbacdaa ibmpc_usb: Update prebuilt firmware files 2020-04-28 12:21:05 +09:00
tmk
aa276d55c4 ibmpc_usb: Add some comments 2020-04-28 12:18:56 +09:00
tmk
c4f65d4f5e ibmpc_usb: Remove G80-2551 support from Code Set 2 2020-04-28 12:07:19 +09:00
tmk
c6786290bc ibmpc_usb: Add G80-2551 support in Code Set 3
https://deskthority.net/wiki/Cherry_G80-2551
https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#g80-2551-in-code-set-3
https://geekhack.org/index.php?topic=103648.msg2894921#msg2894921
2020-04-28 11:59:20 +09:00
tmk
87bd991afa ibmpc_usb: Add codes in Set 3
GUI, Application, Henkan, Mehenkan, Kana used in PS/2 PC
keyboard when it is switched to Set 3
https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-AT-Keyboard-Protocol#g80-3600-and-skidata2-de-in-code-set-3
2020-04-28 11:33:02 +09:00
tmk
1575db9166 ibmpc_usb: Update prebuilt firmware hex files 2020-04-26 23:35:59 +09:00
tmk
da1ca3ab6f ibmpc_usb: Add support for G80-2551
Support for extra keys around cursor keys
https://deskthority.net/wiki/Cherry_G80-2551
https://geekhack.org/index.php?topic=103648.msg2893404#msg2893404
https://gist.github.com/tmk/22cb8680ca8ef854630ecd1953268c5b
2020-04-26 23:28:03 +09:00
tmk
890af7e7e3 ibmpc_usb: Change key mapping for Code Set 3 2020-04-26 18:39:47 +09:00
tmk
23305ad934 Fix TIMER_DIFF #646
Merge branch 'timer_diff_fixes' of https://github.com/purdeaandrei/tmk_keyboard into purdeaandrei-timer_diff_fixes
2020-04-14 12:59:41 +09:00
tmk
48058c638e sun_usb: Add prebuilt firmware files 2020-04-09 13:57:48 +09:00
tmk
e63aff8715 sun_usb: Add Makefile for ATmega32U4 2020-04-09 13:56:20 +09:00
tmk
05c2df1237 sun_usb: Update README and rename to .md 2020-04-08 17:54:15 +09:00
tmk
8898747b09 sun_usb: Add unimap support 2020-04-08 17:38:33 +09:00
Purdea Andrei
061e662345 tmk_core/common/timer.h: Improve code generation for TIMER_DIFF* macros
Because of integer promotion the compiler is having a hard time generating
efficient code to calculate TIMER_DIFF* macros in some situations.
In the below example, the return value is "int", and this is causing the
trouble.

Example C code:

int __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer)
{
    return TIMER_DIFF_8(current_timer, start_timer);
}

BEFORE: (with -Os)

00004c40 <test>:
    4c40:       28 2f           mov     r18, r24
    4c42:       30 e0           ldi     r19, 0x00       ; 0
    4c44:       46 2f           mov     r20, r22
    4c46:       50 e0           ldi     r21, 0x00       ; 0
    4c48:       86 17           cp      r24, r22
    4c4a:       20 f0           brcs    .+8             ; 0x4c54 <test+0x14>
    4c4c:       c9 01           movw    r24, r18
    4c4e:       84 1b           sub     r24, r20
    4c50:       95 0b           sbc     r25, r21
    4c52:       08 95           ret
    4c54:       c9 01           movw    r24, r18
    4c56:       84 1b           sub     r24, r20
    4c58:       95 0b           sbc     r25, r21
    4c5a:       93 95           inc     r25
    4c5c:       08 95           ret

AFTER: (with -Os)

00004c40 <test>:
    4c40:       86 1b           sub     r24, r22
    4c42:       90 e0           ldi     r25, 0x00       ; 0
    4c44:       08 95           ret

Note: the example is showing -Os but improvements can be seen at all optimization levels,
including -O0. We never use -O0, but I tested it to make sure that no extra code is
generated in that case.
2020-04-01 07:46:18 +03:00
Purdea Andrei
338a1506dc tmk_core/common/timer.h: Fixing TIMER_DIFF macro to calculate difference correctly after the timer wraps.
Let's go through an example, using the following macro:

If the first timer read is 0xe4 and the second one is 0x32, the timer wrapped.
If the timer would have had more bits, it's new value would have been 0x132,
and the correct difference in time is 0x132 - 0xe4 = 0x4e

old code TIMER_DIFF_8(0x32, 0xe4) = 0xff - 0xe4 + 0x32 = 0x4d, which is wrong.
new code TIMER_DIFF_8(0x32, 0xe4) = 0xff + 1 - 0xe4 + 0x32 = 0x4e, which is correct.

This also gives a chance for a smart compiler to optimize the code using normal
integer overflow.

For example on AVR, the following C code:
uint8_t __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer)
{
    return TIMER_DIFF_8(current_timer, start_timer);
}
With the original code, it gets translated to the following list of instructions:
00004c6e <test>:
    4c6e:       98 2f           mov     r25, r24
    4c70:       86 1b           sub     r24, r22
    4c72:       96 17           cp      r25, r22
    4c74:       08 f4           brcc    .+2             ; 0x4c78 <test+0xa>
    4c76:       81 50           subi    r24, 0x01       ; 1
    4c78:       08 95           ret
But with this commit, it gets translated to a single instruction:
00004c40 <test>:
    4c40:       86 1b           sub     r24, r22
    4c42:       08 95           ret

This unfortunately doesn't always work so nicely, for example the following C code:
int __attribute__ ((noinline)) test(uint8_t current_timer, uint8_t start_timer)
{
    return TIMER_DIFF_8(current_timer, start_timer);
}
(Note: return type changed to int)
With the original code it gets translated to:
00004c6e <test>:
    4c6e:       28 2f           mov     r18, r24
    4c70:       30 e0           ldi     r19, 0x00       ; 0
    4c72:       46 2f           mov     r20, r22
    4c74:       50 e0           ldi     r21, 0x00       ; 0
    4c76:       86 17           cp      r24, r22
    4c78:       20 f0           brcs    .+8             ; 0x4c82 <test+0x14>
    4c7a:       c9 01           movw    r24, r18
    4c7c:       84 1b           sub     r24, r20
    4c7e:       95 0b           sbc     r25, r21
    4c80:       08 95           ret
    4c82:       c9 01           movw    r24, r18
    4c84:       84 1b           sub     r24, r20
    4c86:       95 0b           sbc     r25, r21
    4c88:       81 50           subi    r24, 0x01       ; 1
    4c8a:       9f 4f           sbci    r25, 0xFF       ; 255
    4c8c:       08 95           ret
Wth this commit it gets translated to:
00004c40 <test>:
    4c40:       28 2f           mov     r18, r24
    4c42:       30 e0           ldi     r19, 0x00       ; 0
    4c44:       46 2f           mov     r20, r22
    4c46:       50 e0           ldi     r21, 0x00       ; 0
    4c48:       86 17           cp      r24, r22
    4c4a:       20 f0           brcs    .+8             ; 0x4c54 <test+0x14>
    4c4c:       c9 01           movw    r24, r18
    4c4e:       84 1b           sub     r24, r20
    4c50:       95 0b           sbc     r25, r21
    4c52:       08 95           ret
    4c54:       c9 01           movw    r24, r18
    4c56:       84 1b           sub     r24, r20
    4c58:       95 0b           sbc     r25, r21
    4c5a:       93 95           inc     r25
    4c5c:       08 95           ret
There is not much performance improvement in this case, however at least with this
commit it functions correctly.

Note: The following commit will improve compiler output for the latter example.
2020-04-01 07:45:05 +03:00
tmk
8f86d125c3 ibmpc_usb: Update firmware hex files 2020-03-22 21:30:22 +09:00
tmk
fefe1028de ibmpc_usb: Add comment on INTERRUPT_CONTROL_ENDPOINT 2020-03-20 14:43:52 +09:00
tmk
a7ccdc25b1 lufa: Add comment on INTERRUPT_CONTROL_ENDPOINT
This feature can block other executions and prevents converter
from handling signal.
2020-03-20 14:34:44 +09:00
tmk
ab16474335 lufa: Disable SOF interrupt
The interrupt takes 3us every 1ms and can prevent
signal handling of ibmpc converter.
2020-03-20 12:46:48 +09:00
tmk
4df25c2618 fc660c: Update firmware hex files 2020-03-13 13:51:50 +09:00
tmk
a4d4f14942 ibmpc_usb: Fix CS3 scan code in comment 2020-03-04 08:02:16 +09:00
tmk
f99d1b12e7 ibmpc_usb: Update README 2020-03-02 14:44:39 +09:00
tmk
4052955535 Merge branch 'ibmpc_update' 2020-03-02 14:36:38 +09:00
tmk
c7160e29bb ibmpc_usb: Update firmware binary 2020-03-02 14:33:25 +09:00
tmk
f9fb97707f ibmpc_usb: Change keymap for application key 2020-03-02 14:21:54 +09:00
tmk
f8685ce694 ibmpc: Fix debug print 2020-03-02 14:11:16 +09:00
tmk
8e7027f115 ibmpc_usb: Check overrun error for CS2 and CS3 2020-03-02 14:10:27 +09:00
tmk
28cd55c1bf ibmpc_usb: Check invalid code for CS1 2020-03-02 14:09:34 +09:00
tmk
2c9ae5ac95 ibmpc: Protocol detection between AT and XT 2020-03-02 11:04:30 +09:00
tmk
0481aa08e5 ibmpc: Check buffer full and error code FF 2020-03-02 01:48:11 +09:00
tmk
0b1fbeb135 ibmpc: Fix comments 2020-03-02 01:21:04 +09:00
tmk
b7412f6228 ibmpc: Add timeout check 2020-03-02 00:14:09 +09:00
tmk
c023e5feea ibmpc_usb: Wait BAT(AA) code forever 2020-03-01 23:33:29 +09:00
tmk
0c80bfca71 ibmpc_usb: Error recovery with invalid scan code 2020-03-01 23:23:55 +09:00
tmk
2f640de68d ibmpc: Refactor code 2020-02-29 17:29:55 +09:00
tmk
4588ae8dac ibmpc: Fix debug print and wait time 2020-02-29 17:29:55 +09:00
tmk
83ebf5212d ibmpc_usb: Fix init code not to block main loop
blocking loop prevents console output at startup
2020-02-29 17:29:55 +09:00
tmk
9acc900ffb ibmpc: Add two-byte buffer for data received 2020-02-29 17:29:55 +09:00
tmk
e89ade52e1 ibmpc: Fix stop bit check code in ISR
removing function call makes prologue/epilogue shorter
2020-02-29 17:29:55 +09:00
tmk
a42cc4bddb ibmpc_usb: Fix hard reset code 2020-02-29 17:29:55 +09:00
tmk
c2e8c0d43e ibmpc: Change ISR code
It reads data line within 3us
2020-02-29 17:29:54 +09:00
tmk
e7d6d24c17 ibm_usb: Fix interrupt enable macro
clear interrupt flag before enabling to ditch unwanted interrupt
2020-02-29 17:29:54 +09:00
tmk
9a06c701b0 ibmpc_usb: Fix keyboard initialize 2020-02-29 17:29:54 +09:00
tmk
15ab461f44 ibmpc: Add ibmpc_host_clear_isr 2020-02-29 17:29:54 +09:00
tmk
b2fb5b715c ibmpc: Add intruppt disable and enable function 2020-02-29 17:29:54 +09:00
tmk
cb026d74a5 ibmpc_usb: Fix Disable/Enable keyboard
- Return without enabling with F4 for 84-key AT wrongly before this fix
- disable/enable doesn't seems to be needed
2020-02-29 17:29:54 +09:00
tmk
7587fe3382 ibmpc: Fix how to initialize keyboard 2020-02-29 17:29:54 +09:00
tmk
f68a1f5590 ibmpc: Fix error handling for keyobard hotswap 2020-02-29 17:29:54 +09:00
tmk
f7b74361a0 ibmpc: Fix START case in ISR 2020-02-29 17:29:54 +09:00
tmk
3e2900dcc8 ibmpc: Read data line earlier in ISR as possible 2020-02-29 17:29:54 +09:00