Bind Bluetooth driver to host_driver_t (#25199)
				
					
				
			This commit is contained in:
		
							parent
							
								
									614b631ee2
								
							
						
					
					
						commit
						842c840145
					
				| @ -898,16 +898,17 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | ||||
|     NO_USB_STARTUP_CHECK := yes | ||||
|     CONNECTION_ENABLE := yes | ||||
|     COMMON_VPATH += $(DRIVER_PATH)/bluetooth | ||||
|     SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c | ||||
| 
 | ||||
|     ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le) | ||||
|         SPI_DRIVER_REQUIRED = yes | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp | ||||
|     endif | ||||
| 
 | ||||
|     ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42) | ||||
|         UART_DRIVER_REQUIRED = yes | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c | ||||
|         SRC += $(DRIVER_PATH)/bluetooth/rn42.c | ||||
|     endif | ||||
| endif | ||||
|  | ||||
| @ -1,62 +1,26 @@ | ||||
| /*
 | ||||
|  * Copyright 2022 | ||||
|  * | ||||
|  * 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 2 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/>.
 | ||||
|  */ | ||||
| // Copyright 2025 QMK
 | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| 
 | ||||
| #include "bluetooth.h" | ||||
| 
 | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
| #    include "bluefruit_le.h" | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
| #    include "rn42.h" | ||||
| #endif | ||||
| __attribute__((weak)) void bluetooth_init(void) {} | ||||
| 
 | ||||
| void bluetooth_init(void) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_init(); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_init(); | ||||
| #endif | ||||
| __attribute__((weak)) void bluetooth_task(void) {} | ||||
| 
 | ||||
| __attribute__((weak)) bool bluetooth_is_connected(void) { | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void bluetooth_task(void) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_task(); | ||||
| #endif | ||||
| __attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void bluetooth_send_keyboard(report_keyboard_t *report) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_keyboard(report); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_keyboard(report); | ||||
| #endif | ||||
| } | ||||
| __attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {} | ||||
| 
 | ||||
| void bluetooth_send_mouse(report_mouse_t *report) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_mouse(report); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_mouse(report); | ||||
| #endif | ||||
| } | ||||
| __attribute__((weak)) void bluetooth_send_nkro(report_nkro_t *report) {} | ||||
| 
 | ||||
| void bluetooth_send_consumer(uint16_t usage) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_consumer(usage); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_consumer(usage); | ||||
| #endif | ||||
| } | ||||
| __attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {} | ||||
| 
 | ||||
| __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {} | ||||
| 
 | ||||
| __attribute__((weak)) void bluetooth_send_system(uint16_t usage) {} | ||||
|  | ||||
| @ -30,6 +30,18 @@ void bluetooth_init(void); | ||||
|  */ | ||||
| void bluetooth_task(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Detects if Bluetooth is connected. | ||||
|  * | ||||
|  * \return `true` if connected, `false` otherwise. | ||||
|  */ | ||||
| bool bluetooth_is_connected(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Get current LED state. | ||||
|  */ | ||||
| uint8_t bluetooth_keyboard_leds(void); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Send a keyboard report. | ||||
|  * | ||||
| @ -37,6 +49,13 @@ void bluetooth_task(void); | ||||
|  */ | ||||
| void bluetooth_send_keyboard(report_keyboard_t *report); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Send a nkro report. | ||||
|  * | ||||
|  * \param report The nkro report to send. | ||||
|  */ | ||||
| void bluetooth_send_nkro(report_nkro_t *report); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Send a mouse report. | ||||
|  * | ||||
| @ -50,3 +69,10 @@ void bluetooth_send_mouse(report_mouse_t *report); | ||||
|  * \param usage The consumer usage to send. | ||||
|  */ | ||||
| void bluetooth_send_consumer(uint16_t usage); | ||||
| 
 | ||||
| /**
 | ||||
|  * \brief Send a system usage. | ||||
|  * | ||||
|  * \param usage The system usage to send. | ||||
|  */ | ||||
| void bluetooth_send_system(uint16_t usage); | ||||
|  | ||||
							
								
								
									
										71
									
								
								drivers/bluetooth/bluetooth_drivers.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								drivers/bluetooth/bluetooth_drivers.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| /*
 | ||||
|  * Copyright 2022 | ||||
|  * | ||||
|  * 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 2 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 "bluetooth.h" | ||||
| 
 | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
| #    include "bluefruit_le.h" | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
| #    include "rn42.h" | ||||
| #endif | ||||
| 
 | ||||
| void bluetooth_init(void) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_init(); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_init(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void bluetooth_task(void) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_task(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| bool bluetooth_is_connected(void) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     return bluefruit_le_is_connected(); | ||||
| #else | ||||
|     // TODO: drivers should check if BT is connected here
 | ||||
|     return true; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void bluetooth_send_keyboard(report_keyboard_t *report) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_keyboard(report); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_keyboard(report); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void bluetooth_send_mouse(report_mouse_t *report) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_mouse(report); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_mouse(report); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void bluetooth_send_consumer(uint16_t usage) { | ||||
| #if defined(BLUETOOTH_BLUEFRUIT_LE) | ||||
|     bluefruit_le_send_consumer(usage); | ||||
| #elif defined(BLUETOOTH_RN42) | ||||
|     rn42_send_consumer(usage); | ||||
| #endif | ||||
| } | ||||
| @ -5,6 +5,10 @@ | ||||
| #include "usb_util.h" | ||||
| #include "util.h" | ||||
| 
 | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
| #    include "bluetooth.h" | ||||
| #endif | ||||
| 
 | ||||
| // ======== DEPRECATED DEFINES - DO NOT USE ========
 | ||||
| #ifdef OUTPUT_DEFAULT | ||||
| #    undef CONNECTION_HOST_DEFAULT | ||||
| @ -14,16 +18,6 @@ | ||||
| __attribute__((weak)) void set_output_user(uint8_t output) {} | ||||
| // ========
 | ||||
| 
 | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
| #    ifdef BLUETOOTH_BLUEFRUIT_LE | ||||
| #        include "bluefruit_le.h" | ||||
| #        define bluetooth_is_connected() bluefruit_le_is_connected() | ||||
| #    else | ||||
| // TODO: drivers should check if BT is connected here
 | ||||
| #        define bluetooth_is_connected() true | ||||
| #    endif | ||||
| #endif | ||||
| 
 | ||||
| #define CONNECTION_HOST_INVALID 0xFF | ||||
| 
 | ||||
| #ifndef CONNECTION_HOST_DEFAULT | ||||
|  | ||||
| @ -30,12 +30,31 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| #    include "joystick.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
| #    ifndef CONNECTION_ENABLE | ||||
| #        error CONNECTION_ENABLE required and not enabled | ||||
| #    endif | ||||
| #ifdef CONNECTION_ENABLE | ||||
| #    include "connection.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
| #    include "bluetooth.h" | ||||
| 
 | ||||
| static void bluetooth_send_extra(report_extra_t *report) { | ||||
|     switch (report->report_id) { | ||||
|         case REPORT_ID_SYSTEM: | ||||
|             bluetooth_send_system(report->usage); | ||||
|             return; | ||||
|         case REPORT_ID_CONSUMER: | ||||
|             bluetooth_send_consumer(report->usage); | ||||
|             return; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| host_driver_t bt_driver = { | ||||
|     .keyboard_leds = bluetooth_keyboard_leds, | ||||
|     .send_keyboard = bluetooth_send_keyboard, | ||||
|     .send_nkro     = bluetooth_send_nkro, | ||||
|     .send_mouse    = bluetooth_send_mouse, | ||||
|     .send_extra    = bluetooth_send_extra, | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NKRO_ENABLE | ||||
| @ -55,6 +74,22 @@ host_driver_t *host_get_driver(void) { | ||||
|     return driver; | ||||
| } | ||||
| 
 | ||||
| static host_driver_t *host_get_active_driver(void) { | ||||
| #ifdef CONNECTION_ENABLE | ||||
|     switch (connection_get_host()) { | ||||
| #    ifdef BLUETOOTH_ENABLE | ||||
|         case CONNECTION_HOST_BLUETOOTH: | ||||
|             return &bt_driver; | ||||
| #    endif | ||||
|         case CONNECTION_HOST_NONE: | ||||
|             return NULL; | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
| #endif | ||||
|     return driver; | ||||
| } | ||||
| 
 | ||||
| #ifdef SPLIT_KEYBOARD | ||||
| uint8_t split_led_state = 0; | ||||
| void    set_split_host_keyboard_leds(uint8_t led_state) { | ||||
| @ -66,7 +101,10 @@ uint8_t host_keyboard_leds(void) { | ||||
| #ifdef SPLIT_KEYBOARD | ||||
|     if (!is_keyboard_master()) return split_led_state; | ||||
| #endif | ||||
|     if (!driver) return 0; | ||||
| 
 | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->keyboard_leds) return 0; | ||||
| 
 | ||||
|     return (*driver->keyboard_leds)(); | ||||
| } | ||||
| 
 | ||||
| @ -76,14 +114,9 @@ led_t host_keyboard_led_state(void) { | ||||
| 
 | ||||
| /* send report */ | ||||
| void host_keyboard_send(report_keyboard_t *report) { | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
|     if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { | ||||
|         bluetooth_send_keyboard(report); | ||||
|         return; | ||||
|     } | ||||
| #endif | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->send_keyboard) return; | ||||
| 
 | ||||
|     if (!driver) return; | ||||
| #ifdef KEYBOARD_SHARED_EP | ||||
|     report->report_id = REPORT_ID_KEYBOARD; | ||||
| #endif | ||||
| @ -99,7 +132,9 @@ void host_keyboard_send(report_keyboard_t *report) { | ||||
| } | ||||
| 
 | ||||
| void host_nkro_send(report_nkro_t *report) { | ||||
|     if (!driver) return; | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->send_nkro) return; | ||||
| 
 | ||||
|     report->report_id = REPORT_ID_NKRO; | ||||
|     (*driver->send_nkro)(report); | ||||
| 
 | ||||
| @ -113,14 +148,9 @@ void host_nkro_send(report_nkro_t *report) { | ||||
| } | ||||
| 
 | ||||
| void host_mouse_send(report_mouse_t *report) { | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
|     if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { | ||||
|         bluetooth_send_mouse(report); | ||||
|         return; | ||||
|     } | ||||
| #endif | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->send_mouse) return; | ||||
| 
 | ||||
|     if (!driver) return; | ||||
| #ifdef MOUSE_SHARED_EP | ||||
|     report->report_id = REPORT_ID_MOUSE; | ||||
| #endif | ||||
| @ -136,7 +166,8 @@ void host_system_send(uint16_t usage) { | ||||
|     if (usage == last_system_usage) return; | ||||
|     last_system_usage = usage; | ||||
| 
 | ||||
|     if (!driver) return; | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->send_extra) return; | ||||
| 
 | ||||
|     report_extra_t report = { | ||||
|         .report_id = REPORT_ID_SYSTEM, | ||||
| @ -149,14 +180,8 @@ void host_consumer_send(uint16_t usage) { | ||||
|     if (usage == last_consumer_usage) return; | ||||
|     last_consumer_usage = usage; | ||||
| 
 | ||||
| #ifdef BLUETOOTH_ENABLE | ||||
|     if (connection_get_host() == CONNECTION_HOST_BLUETOOTH) { | ||||
|         bluetooth_send_consumer(usage); | ||||
|         return; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     if (!driver) return; | ||||
|     host_driver_t *driver = host_get_active_driver(); | ||||
|     if (!driver || !driver->send_extra) return; | ||||
| 
 | ||||
|     report_extra_t report = { | ||||
|         .report_id = REPORT_ID_CONSUMER, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user