Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LUFA: ATMega32u2 not remote wakeup #361

Closed
3 tasks done
tmk opened this issue Jun 13, 2016 · 5 comments
Closed
3 tasks done

LUFA: ATMega32u2 not remote wakeup #361

tmk opened this issue Jun 13, 2016 · 5 comments

Comments

@tmk
Copy link
Owner

tmk commented Jun 13, 2016

Alps64(ATMega32u2 and LUFA) can't wake Windows10 from sleep. HHKB can wake it, though.
Investigation of the differences is needed.

  • Firmware configuration
  • Windows power configuration
  • ATMega32u2(Alps64) vs u4(HHKB)
@tmk
Copy link
Owner Author

tmk commented Jun 14, 2016

ATMega32u2 has no VBUS monitoring feature unlike 32u4 and limited ability of USB event firing. LUFA cannot determine suspend and wakeup device state accurately with 32u2, it fires connect and disconnect respectively instead unless NO_LIMITED_CONTROLLER_CONNECT is not defined.

In TMK remote wakeup cannot be used because suspend state is not available for 32u2. To make use of suspend/wakeup state on the controller you need to define NO_LIMITED_CONTROLLER_CONNECT. As LUFA document says those states are not necessarily accurate but it seems like that is not problem for our purpose.

WORKAROUND:
Add this line in Makefile.

OPT_DEFS += -DNO_LIMITED_CONTROLLER_CONNECT

From LUFA document

http://www.fourwalledcubicle.com/files/LUFA/Doc/140302/html/group___group___events.html#gaf7772033ffb4f51edf02d791f976cfd5

void EVENT_USB_Device_Suspend ( void )
void EVENT_USB_Device_WakeUp ( void )

This event does not exist on the microcontrollers with limited USB VBUS sensing abilities when the NO_LIMITED_CONTROLLER_CONNECT compile time token is not set

void EVENT_USB_Device_Connect ( void )
void EVENT_USB_Device_Disconnect ( void )

This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers if NO_LIMITED_CONTROLLER_CONNECT is not defined.

For the microcontrollers with limited USB controller functionality, VBUS sensing is not available. this means that the current connection state is derived from the bus suspension and wake up events by default, which is not always accurate (host may suspend the bus while still connected). If the actual connection state needs to be determined, VBUS should be routed to an external pin, and the auto-detect behavior turned off by passing the NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection and disconnection events may be manually fired, and the USB_DeviceState global changed manually.

@tmk tmk changed the title Windows10 not wake with Alps64 LUFA: ATMega32u2 not remote wakeup Jun 14, 2016
@tmk
Copy link
Owner Author

tmk commented Jun 15, 2016

I guess lacking of VBUS monitoring affects when the device is self-powered, Host throws pulse on VBUS line to reset the device but self-powered 32u2 cannot detect this reset signal LUFA cannot discreminate suspend and resume on bus(D-/D+) from plug and unplug(including power control on VBUS by host), LUFA emulates this reset with fake pair of handles suspend/resume singals as disconnect and connect events at the sacrifice of suspend and resume event. But most of our device is bus-powered except for Bluetooth keyboard with battery, they are forced to be powered off and on again at the VBUS reset pulse power control by host and replug action by user so we will have no problem.

EDIT: Fixed at 2019-03-30

Battery powered devices should be concerned though. We probably have to use 32u4 or detect the VBUS pulse with pin change interruption for these devices. Without this we won't be able to control USB engine properly for power saving.

@tmk
Copy link
Owner Author

tmk commented Jun 15, 2016

We can define the macro by default.

diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index 87386be..d239585 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -37,6 +37,10 @@ LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABL
 #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT
 LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1
+# Remote wakeup fix for ATmega32U2        https://github.com/tmk/tmk_keyboard/issues/361
+ifeq ($(MCU),atmega32u2)
+       LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT
+endif

 OPT_DEFS += -DF_USB=$(F_USB)UL
 OPT_DEFS += -DARCH=ARCH_$(ARCH)

@tmk
Copy link
Owner Author

tmk commented Jun 18, 2016

With the patch above I confirmed alps64(32u2) wakes up Windows10 on Lenovo Thinkpad X201s(upgraded from Windows7).

But Windows10 with Intel x58 still doesn't work. This needs more test on various systems.
https://geekhack.org/index.php?topic=69740.msg2198714#msg2198714

I think this patch is correct move and it will be merged later anyway.

@tmk tmk added NOTE and removed TODO labels Jun 21, 2016
@tmk
Copy link
Owner Author

tmk commented Jun 21, 2016

Merged.
a65fa64

@tmk tmk closed this as completed Jun 21, 2016
kairyu pushed a commit to kairyu/tmk_keyboard that referenced this issue Jun 27, 2016
talmuth pushed a commit to talmuth/tmk_keyboard that referenced this issue Sep 19, 2016
* tmk/master:
  core: Change chibios repo directory names
  core: Fix keycode.txt
  README missing link
  Update orphan/README.md
  Move some projects to 'orphan' directory
  core: Fix USB remote wakeup on ATmega32U2 tmk#361
  usb_usb: Add multiple keyboard support
tmk added a commit that referenced this issue Dec 10, 2016
e5f9940 Merge commit '1bc3dd200b023cecf063a0cb3ba347f77f6d759d' into core_update
da03c50 Add note for L/R side bit being ignored
e80f3c1 Add in basic documentation for Macro system
35e8a76 core: Swap position of PEQL and PENT in unimap
00751f1 Merge pull request #406 from 39aldo39/patch-1
e50d7de V-USB remote wakeup
4340997 core: Fix typo in definition AC_g
958144d core: Debug print for system and consumer keys
e7e1030 core: Fix sleep_led
0866323 core: Change matrix_init and matrix_print
0dbf73d core: Add matrix_clear() and default impl.
3202ca3 core: Add suspend mode options
4cda3aa core: Fix suspend/wake for converters #386
4e15247 core: LUFA_DEBUG_SUART for serial debug
b9cf8e7 core: Fix mechanical locking supoort #390
12aa0fd Merge branch 'nemith-master'
fccb3fa core: Fix OPT_DEFS for mbed build
2e2d2c8 Merge branch 'master' of github.com:leizzer/tmk_keyboard
f1d3634 Change .gitignore for ChibiOS
3aab802 core: Fix build config in protocol.mk
5e43da0 core: Add short names in unimap
7a56998 core: Fix dfu wait in rules.mk
6d9c500 Merge branch 'mediakey-fix'
08382ac core: Fix 'make dfu' message
78cb04e Fix OS X Recognizing keyboard as Mouse/Tablet
a114714 core: 'make dfu' waits for bootloader to start
d0a8f13 core: Fix unimap UNIMAP_NO case
e17abef core: Change lufa NKRO report size 16 to 32 bytes
375b20f core: Fix common.mk for build options
394fdff core: Fix unimap layout comment
912326c core: Add unimap support
00f4011 core: Fix doc/keymap.md for new keymap framework
ddbd7b4 core: Add default implemenation of keymap read
671cacc core: action codes are action_t struct now
b4fdb27 core: Change chibios repo directory names
7daed10 core: Fix keycode.txt
90399d7 core: Fix USB remote wakeup on ATmega32U2 #361
3677e84 usb_usb: Add multiple keyboard support
54d5b26 core: Fix Logical Maximum in report descriptor
bd0d372 core: Fix LUFA report descriptor
95327b5 Merge pull request #355 from papodaca/XT
62bf548 core: change API of adb.c to accept device address
3097c9e Fix function name in host.h
836e209 Merge branch 'core_split_160522'
3918ea2 Merge commit '20b787fc1284176834cbe7ca2134e4b36bec5828'
7f87b11 core: Add comment of register 3 of ADB
ef6478a core: Add adb_host_talk()
5c665b4 update macro names in bluefruit
4f2c5bf Merge commit '71381457fa1311dfa0b58ba882a96db740640871'
53a9c08 Merge pull request #321 from njbair/master
f08a656 core: Fix media/consumer keys
d526de8 Clean up wording in keymap example
0bb3dbb Clarify layer precedence
d915c75 clarify layer documentation
72070d4 ps2_usb: Fix for VUSB configuration
170e2dc Mostly working. Is unstable, will emit bad codes after a while.
c8e45b5 core: Actionmap support
aabaa24 Codes appear to be detected correctly, the break codes are broken.

git-subtree-dir: tmk_core
git-subtree-split: e5f994033cbc8700745ac0c6d12772820492eed0
ageaenes pushed a commit to ageaenes/tmk_keyboard that referenced this issue Dec 10, 2016
e5f9940 Merge commit '1bc3dd200b023cecf063a0cb3ba347f77f6d759d' into core_update
da03c50 Add note for L/R side bit being ignored
e80f3c1 Add in basic documentation for Macro system
35e8a76 core: Swap position of PEQL and PENT in unimap
00751f1 Merge pull request tmk#406 from 39aldo39/patch-1
e50d7de V-USB remote wakeup
4340997 core: Fix typo in definition AC_g
958144d core: Debug print for system and consumer keys
e7e1030 core: Fix sleep_led
0866323 core: Change matrix_init and matrix_print
0dbf73d core: Add matrix_clear() and default impl.
3202ca3 core: Add suspend mode options
4cda3aa core: Fix suspend/wake for converters tmk#386
4e15247 core: LUFA_DEBUG_SUART for serial debug
b9cf8e7 core: Fix mechanical locking supoort tmk#390
12aa0fd Merge branch 'nemith-master'
fccb3fa core: Fix OPT_DEFS for mbed build
2e2d2c8 Merge branch 'master' of github.com:leizzer/tmk_keyboard
f1d3634 Change .gitignore for ChibiOS
3aab802 core: Fix build config in protocol.mk
5e43da0 core: Add short names in unimap
7a56998 core: Fix dfu wait in rules.mk
6d9c500 Merge branch 'mediakey-fix'
08382ac core: Fix 'make dfu' message
78cb04e Fix OS X Recognizing keyboard as Mouse/Tablet
a114714 core: 'make dfu' waits for bootloader to start
d0a8f13 core: Fix unimap UNIMAP_NO case
e17abef core: Change lufa NKRO report size 16 to 32 bytes
375b20f core: Fix common.mk for build options
394fdff core: Fix unimap layout comment
912326c core: Add unimap support
00f4011 core: Fix doc/keymap.md for new keymap framework
ddbd7b4 core: Add default implemenation of keymap read
671cacc core: action codes are action_t struct now
b4fdb27 core: Change chibios repo directory names
7daed10 core: Fix keycode.txt
90399d7 core: Fix USB remote wakeup on ATmega32U2 tmk#361
3677e84 usb_usb: Add multiple keyboard support
54d5b26 core: Fix Logical Maximum in report descriptor
bd0d372 core: Fix LUFA report descriptor
95327b5 Merge pull request tmk#355 from papodaca/XT
62bf548 core: change API of adb.c to accept device address
3097c9e Fix function name in host.h
836e209 Merge branch 'core_split_160522'
3918ea2 Merge commit '20b787fc1284176834cbe7ca2134e4b36bec5828'
7f87b11 core: Add comment of register 3 of ADB
ef6478a core: Add adb_host_talk()
5c665b4 update macro names in bluefruit
4f2c5bf Merge commit '71381457fa1311dfa0b58ba882a96db740640871'
53a9c08 Merge pull request tmk#321 from njbair/master
f08a656 core: Fix media/consumer keys
d526de8 Clean up wording in keymap example
0bb3dbb Clarify layer precedence
d915c75 clarify layer documentation
72070d4 ps2_usb: Fix for VUSB configuration
170e2dc Mostly working. Is unstable, will emit bad codes after a while.
c8e45b5 core: Actionmap support
aabaa24 Codes appear to be detected correctly, the break codes are broken.

git-subtree-dir: tmk_core
git-subtree-split: e5f994033cbc8700745ac0c6d12772820492eed0
tmk added a commit that referenced this issue Feb 27, 2023
the condition didn't work when variable MCU includes comment like:
    MCU ?= atmega32u2       # TMK converter
#753

This affects RemoteWakeup on atmega32u2:
#361
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant