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

Refactor of USB code within split_common #11890

Merged
merged 5 commits into from
Feb 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 24 additions & 46 deletions quantum/split_common/split_util.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "split_util.h"
#include "matrix.h"
#include "keyboard.h"
Expand All @@ -6,14 +21,7 @@
#include "transport.h"
#include "quantum.h"
#include "wait.h"

#ifdef PROTOCOL_LUFA
# include <LUFA/Drivers/USB/USB.h>
#endif

#ifdef PROTOCOL_VUSB
# include <usbdrv/usbdrv.h>
#endif
#include "usb_util.h"

#ifdef EE_HANDS
# include "eeconfig.h"
Expand All @@ -31,56 +39,21 @@
# define SPLIT_USB_TIMEOUT_POLL 10
#endif

#ifdef PROTOCOL_CHIBIOS
# define SPLIT_USB_DETECT // Force this on for now
#endif

volatile bool isLeftHand = true;

#if defined(SPLIT_USB_DETECT)
# if defined(PROTOCOL_LUFA)
static inline bool usbHasActiveConnection(void) { return USB_Device_IsAddressSet(); }
static inline void usbDisable(void) {
USB_Disable();
USB_DeviceState = DEVICE_STATE_Unattached;
}
# elif defined(PROTOCOL_CHIBIOS)
static inline bool usbHasActiveConnection(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; }
static inline void usbDisable(void) { usbStop(&USBD1); }
# elif defined(PROTOCOL_VUSB)
static inline bool usbHasActiveConnection(void) {
usbPoll();
return usbConfiguration;
}
static inline void usbDisable(void) { usbDeviceDisconnect(); }
# else
static inline bool usbHasActiveConnection(void) { return true; }
static inline void usbDisable(void) {}
# endif

bool usbIsActive(void) {
static bool usbIsActive(void) {
for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) {
// This will return true if a USB connection has been established
if (usbHasActiveConnection()) {
if (usb_connected_state()) {
return true;
}
wait_ms(SPLIT_USB_TIMEOUT_POLL);
}

// Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow
usbDisable();

return false;
}
#elif defined(PROTOCOL_LUFA) && defined(OTGPADE)
static inline bool usbIsActive(void) {
USB_OTGPAD_On(); // enables VBUS pad
wait_us(5);

return USB_VBUS_GetStatus(); // checks state of VBUS
}
#else
static inline bool usbIsActive(void) { return true; }
static inline bool usbIsActive(void) { return usb_vbus_state(); }
#endif

#ifdef SPLIT_HAND_MATRIX_GRID
Expand Down Expand Up @@ -126,6 +99,11 @@ __attribute__((weak)) bool is_keyboard_master(void) {
// only check once, as this is called often
if (usbstate == UNKNOWN) {
usbstate = usbIsActive() ? MASTER : SLAVE;

// Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow
if (usbstate == SLAVE) {
usb_disable();
}
}

return (usbstate == MASTER);
Expand Down
1 change: 1 addition & 0 deletions tmk_core/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/sendchar_null.c \
$(COMMON_DIR)/eeconfig.c \
$(COMMON_DIR)/report.c \
$(COMMON_DIR)/usb_util.c \
$(PLATFORM_COMMON_DIR)/suspend.c \
$(PLATFORM_COMMON_DIR)/timer.c \
$(COMMON_DIR)/sync_timer.c \
Expand Down
2 changes: 2 additions & 0 deletions tmk_core/common/chibios/chibios_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
#pragma once

#define SPLIT_USB_DETECT // Force this on for now

#if defined(STM32F1XX)
# define USE_GPIOV1
#endif
Expand Down
29 changes: 29 additions & 0 deletions tmk_core/common/usb_util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "usb_util.h"
#include "wait.h"

__attribute__((weak)) void usb_disable(void) {}
__attribute__((weak)) bool usb_connected_state(void) { return true; }
__attribute__((weak)) bool usb_vbus_state(void) {
#ifdef USB_VBUS_PIN
setPinInput(USB_VBUS_PIN);
wait_us(5);
return readPin(USB_VBUS_PIN);
#else
return true;
#endif
}
22 changes: 22 additions & 0 deletions tmk_core/common/usb_util.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once

#include <stdbool.h>

void usb_disable(void);
bool usb_connected_state(void);
bool usb_vbus_state(void);
1 change: 1 addition & 0 deletions tmk_core/protocol/chibios.mk
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ SRC += $(CHIBIOS_DIR)/usb_main.c
SRC += $(CHIBIOS_DIR)/main.c
SRC += usb_descriptor.c
SRC += $(CHIBIOS_DIR)/usb_driver.c
SRC += $(CHIBIOS_DIR)/usb_util.c
SRC += $(LIBSRC)

VPATH += $(TMK_PATH)/$(PROTOCOL_DIR)
Expand Down
21 changes: 21 additions & 0 deletions tmk_core/protocol/chibios/usb_util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <hal.h>
#include "usb_util.h"

void usb_disable(void) { usbStop(&USBD1); }

bool usb_connected_state(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; }
1 change: 1 addition & 0 deletions tmk_core/protocol/lufa.mk
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ ifeq ($(strip $(VIRTSER_ENABLE)), yes)
endif

SRC += $(LUFA_SRC)
SRC += $(LUFA_DIR)/usb_util.c

# Search Path
VPATH += $(TMK_PATH)/$(LUFA_DIR)
Expand Down
34 changes: 34 additions & 0 deletions tmk_core/protocol/lufa/usb_util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <LUFA/Drivers/USB/USB.h>
#include "usb_util.h"
#include "wait.h"

void usb_disable(void) {
USB_Disable();
USB_DeviceState = DEVICE_STATE_Unattached;
}

bool usb_connected_state(void) { return USB_Device_IsAddressSet(); }

#if defined(OTGPADE)
bool usb_vbus_state(void) {
USB_OTGPAD_On(); // enables VBUS pad
wait_us(5);

return USB_VBUS_GetStatus(); // checks state of VBUS
}
#endif
1 change: 1 addition & 0 deletions tmk_core/protocol/vusb.mk
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ VUSB_PATH = $(LIB_PATH)/vusb

SRC += $(VUSB_DIR)/main.c \
$(VUSB_DIR)/vusb.c \
$(VUSB_DIR)/usb_util.c \
$(VUSB_PATH)/usbdrv/usbdrv.c \
$(VUSB_PATH)/usbdrv/usbdrvasm.S \
$(VUSB_PATH)/usbdrv/oddebug.c
Expand Down
24 changes: 24 additions & 0 deletions tmk_core/protocol/vusb/usb_util.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/* Copyright 2021 QMK
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <usbdrv/usbdrv.h>
#include "usb_util.h"

void usb_disable(void) { usbDeviceDisconnect(); }

bool usb_connected_state(void) {
usbPoll();
return usbConfiguration;
}