From 22711fe9be46b49792a6f8fec3c6ce9b0681c7a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9Clinger?= <“2918314399@qq.com“>
Date: Thu, 8 May 2025 17:17:18 +0800
Subject: [PATCH] add qkro_75 firmware
---
keyboards/qwertykeyss/qkro_75k/chconf.h | 826 ++++++++++++++++++
keyboards/qwertykeyss/qkro_75k/config.h | 62 ++
keyboards/qwertykeyss/qkro_75k/keyboard.json | 453 ++++++++++
.../qkro_75k/keymaps/default/keymap.c | 51 ++
keyboards/qwertykeyss/qkro_75k/mcuconf.h | 226 +++++
keyboards/qwertykeyss/qkro_75k/qkro_75k.c | 31 +
keyboards/qwertykeyss/qkro_75k/readme.md | 22 +
keyboards/qwertykeyss/qkro_75k/rules.mk | 30 +
8 files changed, 1701 insertions(+)
create mode 100644 keyboards/qwertykeyss/qkro_75k/chconf.h
create mode 100644 keyboards/qwertykeyss/qkro_75k/config.h
create mode 100644 keyboards/qwertykeyss/qkro_75k/keyboard.json
create mode 100644 keyboards/qwertykeyss/qkro_75k/keymaps/default/keymap.c
create mode 100644 keyboards/qwertykeyss/qkro_75k/mcuconf.h
create mode 100644 keyboards/qwertykeyss/qkro_75k/qkro_75k.c
create mode 100644 keyboards/qwertykeyss/qkro_75k/readme.md
create mode 100644 keyboards/qwertykeyss/qkro_75k/rules.mk
diff --git a/keyboards/qwertykeyss/qkro_75k/chconf.h b/keyboards/qwertykeyss/qkro_75k/chconf.h
new file mode 100644
index 00000000000..1a9821d1a8c
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/chconf.h
@@ -0,0 +1,826 @@
+/* Copyright 2024 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 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 .
+ */
+
+ /*
+ * This file was auto-generated by:
+ * `qmk chibios-confmigrate -i keyboards/wob/chconf.h -r platforms\chibios\boards\common\configs\chconf.h`
+ */
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_7_0_
+
+#define CH_CFG_ST_TIMEDELTA 0
+#define CH_CFG_ST_RESOLUTION 16
+
+#define CH_CFG_ST_FREQUENCY 1000
+/*===========================================================================*/
+/**
+ * @name System settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Handling of instances.
+ * @note If enabled then threads assigned to various instances can
+ * interact each other using the same synchronization objects.
+ * If disabled then each OS instance is a separate world, no
+ * direct interactions are handled by the OS.
+ */
+#if !defined(CH_CFG_SMP_MODE)
+#define CH_CFG_SMP_MODE FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 100000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED TRUE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Time Stamps APIs.
+ * @details If enabled then the time stamps APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TIMESTAMP)
+#define CH_CFG_USE_TIMESTAMP TRUE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT FALSE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES FALSE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name OSLIB options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Objects Caches APIs.
+ * @details If enabled then the objects caches APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_CACHES)
+#define CH_CFG_USE_OBJ_CACHES FALSE
+#endif
+
+/**
+ * @brief Delegate threads APIs.
+ * @details If enabled then the delegate threads APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_DELEGATES)
+#define CH_CFG_USE_DELEGATES FALSE
+#endif
+
+/**
+ * @brief Jobs Queues APIs.
+ * @details If enabled then the jobs queues APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_JOBS)
+#define CH_CFG_USE_JOBS FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add system custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add system initialization code here.*/ \
+}
+
+/**
+ * @brief OS instance structure extension.
+ * @details User fields added to the end of the @p os_instance_t structure.
+ */
+#define CH_CFG_OS_INSTANCE_EXTRA_FIELDS \
+ /* Add OS instance custom fields here.*/
+
+/**
+ * @brief OS instance initialization hook.
+ *
+ * @param[in] oip pointer to the @p os_instance_t structure
+ */
+#define CH_CFG_OS_INSTANCE_INIT_HOOK(oip) { \
+ /* Add OS instance initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ *
+ * @param[in] tp pointer to the @p thread_t structure
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ *
+ * @param[in] tp pointer to the @p thread_t structure
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ *
+ * @param[in] ntp thread being switched in
+ * @param[in] otp thread being switched out
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/**
+ * @brief Runtime Faults Collection Unit hook.
+ * @details This hook is invoked each time new faults are collected and stored.
+ */
+#define CH_CFG_RUNTIME_FAULTS_HOOK(mask) { \
+ /* Faults handling code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/qwertykeyss/qkro_75k/config.h b/keyboards/qwertykeyss/qkro_75k/config.h
new file mode 100644
index 00000000000..5286b748413
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/config.h
@@ -0,0 +1,62 @@
+/* Copyright 2024 Finalkey
+ * Copyright 2024 LiWenLiu
+ *
+ * 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 .
+ */
+#pragma once
+
+/* Define less important options */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+#define FORCE_NKRO
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+#define MATRIX_UNSELECT_DRIVE_HIGH
+#define CORTEX_ENABLE_WFI_IDLE FALSE
+
+/* Ensure we jump to bootloader if the RESET keycode was pressed */
+#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
+
+#define DEBOUNCE 2
+
+#define WS2812_BITBANG_NOP_FUDGE 0.3
+#define RGB_MATRIX_KEYPRESSES
+#define RGB_MATRIX_KEYRELEASES
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define RGB_DISABLE_AFTER_TIMEOUT 0
+#define RGB_MATRIX_SLEEP
diff --git a/keyboards/qwertykeyss/qkro_75k/keyboard.json b/keyboards/qwertykeyss/qkro_75k/keyboard.json
new file mode 100644
index 00000000000..523db7f19ed
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/keyboard.json
@@ -0,0 +1,453 @@
+{
+ "keyboard_name": "QKRO 75K",
+ "manufacturer": "QKRO_75K",
+ "maintainer": "QKRO_75K",
+ "url": "QKRO_75K_keyboard.com",
+ "usb": {
+ "vid": "0x36B0",
+ "pid": "0x3073",
+ "device_version": "0.0.0"
+ },
+ "matrix_pins": {
+ "cols": [ "D15", "D14", "C15", "C14", "C13", "D3", "D2", "C12", "C11", "C10", "A14", "C9", "C8", "C7", "C6", "B15" ],
+ "rows": [ "B0", "B3", "B4", "B5", "B6", "B7" ]
+ },
+ "diode_direction": "ROW2COL",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "nkro": true,
+ "mousekey": true,
+ "consolekey": true,
+ "command": false,
+ "rgb_matrix": false
+ },
+ "bootloader": "custom",
+ "layouts": {
+ "LAYOUT_default": {
+ "layout": [
+ {
+ "matrix": [ 0, 0 ],
+ "x": 0,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 1 ],
+ "x": 1.25,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 2 ],
+ "x": 2.25,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 3 ],
+ "x": 3.25,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 4 ],
+ "x": 4.25,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 5 ],
+ "x": 5.5,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 6 ],
+ "x": 6.5,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 7 ],
+ "x": 7.5,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 8 ],
+ "x": 8.5,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 9 ],
+ "x": 9.75,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 10 ],
+ "x": 10.75,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 11 ],
+ "x": 11.75,
+ "y": 0
+ },
+ {
+ "matrix": [ 0, 12 ],
+ "x": 12.75,
+ "y": 0
+ },
+ {
+ "matrix": [ 2, 14 ],
+ "x": 14,
+ "y": 0
+ },
+ {
+ "matrix": [ 1, 0 ],
+ "x": 0,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 1 ],
+ "x": 1,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 2 ],
+ "x": 2,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 3 ],
+ "x": 3,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 4 ],
+ "x": 4,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 5 ],
+ "x": 5,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 6 ],
+ "x": 6,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 7 ],
+ "x": 7,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 8 ],
+ "x": 8,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 9 ],
+ "x": 9,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 10 ],
+ "x": 10,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 11 ],
+ "x": 11,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 12 ],
+ "x": 12,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 1, 13 ],
+ "x": 14,
+ "y": 1.25
+ },
+ {
+ "matrix": [ 2, 15 ],
+ "x": 15,
+ "y": 1.25
+ },
+
+ {
+ "matrix": [ 2, 0 ],
+ "x": 0,
+ "y": 2.25,
+ "w": 1.5
+ },
+ {
+ "matrix": [ 2, 1 ],
+ "x": 1.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 2 ],
+ "x": 2.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 3 ],
+ "x": 3.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 4 ],
+ "x": 4.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 5 ],
+ "x": 5.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 6 ],
+ "x": 6.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 7 ],
+ "x": 7.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 8 ],
+ "x": 8.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 9 ],
+ "x": 9.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 10 ],
+ "x": 10.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 11 ],
+ "x": 11.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 12 ],
+ "x": 12.5,
+ "y": 2.25
+ },
+ {
+ "matrix": [ 2, 13 ],
+ "x": 13.5,
+ "y": 2.25,
+ "w": 1.5
+ },
+ {
+ "matrix": [ 3, 14 ],
+ "x": 15,
+ "y": 2.25
+ },
+
+ {
+ "matrix": [ 3, 0 ],
+ "x": 0,
+ "y": 3.25,
+ "w": 1.75
+ },
+ {
+ "matrix": [ 3, 1 ],
+ "x": 1.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 2 ],
+ "x": 2.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 3 ],
+ "x": 3.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 4 ],
+ "x": 4.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 5 ],
+ "x": 5.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 6 ],
+ "x": 6.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 7 ],
+ "x": 7.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 8 ],
+ "x": 8.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 9 ],
+ "x": 9.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 10 ],
+ "x": 10.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 11 ],
+ "x": 11.75,
+ "y": 3.25
+ },
+ {
+ "matrix": [ 3, 13 ],
+ "x": 13.75,
+ "y": 3.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 3, 15 ],
+ "x": 15,
+ "y": 3.25
+ },
+
+ {
+ "matrix": [ 4, 0 ],
+ "x": 0,
+ "y": 4.25,
+ "w": 2.25
+ },
+ {
+ "matrix": [ 4, 2 ],
+ "x": 2.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 3 ],
+ "x": 3.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 4 ],
+ "x": 4.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 5 ],
+ "x": 5.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 6 ],
+ "x": 6.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 7 ],
+ "x": 7.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 8 ],
+ "x": 8.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 9 ],
+ "x": 9.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 10 ],
+ "x": 10.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 11 ],
+ "x": 11.25,
+ "y": 4.25
+ },
+ {
+ "matrix": [ 4, 13 ],
+ "x": 12.25,
+ "y": 4.25,
+ "w": 1.75
+ },
+ {
+ "matrix": [ 4, 14 ],
+ "x": 14,
+ "y": 4.25
+ },
+
+ {
+ "matrix": [ 5, 0 ],
+ "x": 0,
+ "y": 5.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 5, 1 ],
+ "x": 1.25,
+ "y": 5.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 5, 2 ],
+ "x": 2.5,
+ "y": 5.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 5, 5 ],
+ "x": 3.75,
+ "y": 5.25,
+ "w": 6.25
+ },
+ {
+ "matrix": [ 5, 9 ],
+ "x": 10,
+ "y": 5.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 5, 10 ],
+ "x": 11.25,
+ "y": 5.25,
+ "w": 1.25
+ },
+ {
+ "matrix": [ 5, 12 ],
+ "x": 13,
+ "y": 5.25
+ },
+ {
+ "matrix": [ 5, 13 ],
+ "x": 13,
+ "y": 5.25
+ },
+ {
+ "matrix": [ 5, 14 ],
+ "x": 14,
+ "y": 5.25
+ },
+ {
+ "matrix": [ 5, 15 ],
+ "x": 15,
+ "y": 5.25
+ }
+ ]
+ }
+ }
+}
diff --git a/keyboards/qwertykeyss/qkro_75k/keymaps/default/keymap.c b/keyboards/qwertykeyss/qkro_75k/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f29d48511dc
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/keymaps/default/keymap.c
@@ -0,0 +1,51 @@
+/* Copyright 2023 Yiancar-Designs
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_default(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(2), KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_default(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(3), KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [2] = LAYOUT_default(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, TO(0), TO(1), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_NO, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [3] = LAYOUT_default(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, TO(0), TO(1), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_NO, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/qwertykeyss/qkro_75k/mcuconf.h b/keyboards/qwertykeyss/qkro_75k/mcuconf.h
new file mode 100644
index 00000000000..20c1dd7fb48
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/mcuconf.h
@@ -0,0 +1,226 @@
+/* Copyright 2024 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 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 .
+ */
+
+ /*
+ * This file was auto-generated by:
+ * `qmk chibios-confmigrate -i keyboards/wob/chconf.h -r lib\chibios-contrib\demos\ES32\FS026\cfg\mcuconf.h`
+ */
+
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
+#define ES32_FS026_MCUCONF
+#define ES32_ES32F0283_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define ES32_NO_INIT FALSE
+
+/*system_clk select
+
+MD_RCU_SW_SYSCLK_HRC = HRC selected as system clock
+MD_RCU_SW_SYSCLK_HOSC = HOSC selected as system clock
+MD_RCU_SW_SYSCLK_PLL0 = PLL0 selected as system clock
+MD_RCU_SW_SYSCLK_HRC48 = HRC48 selected as system clock
+*/
+#define ES32_SYSCLK_SOURSE_SELECT MD_RCU_SW_SYSCLK_PLL0
+
+/*external clk config*/
+#define ES32_HOSC_CLK_EN FALSE
+#define ES32_HOSC_CLK_FREQ 8
+
+/*pll clk config
+
+MD_RCU_PLLSRC_HRC = HRC selected as PLL reference clock
+MD_RCU_PLLSRC_HOSC = HOSC selected as PLL reference clock
+MD_RCU_PLLSRC_HRC48 = HRC48 selected as PLL reference clock
+
+MD_RCU_PLLCLK_PASS = 0
+MD_RCU_PLLCLK_4M = 4000000
+MD_RCU_PLLCLK_8M = 8000000
+MD_RCU_PLLCLK_12M = 12000000
+MD_RCU_PLLCLK_16M = 16000000
+MD_RCU_PLLCLK_24M = 24000000
+MD_RCU_PLLCLK_32M = 32000000
+MD_RCU_PLLCLK_36M = 36000000
+MD_RCU_PLLCLK_40M = 40000000
+MD_RCU_PLLCLK_48M = 48000000
+MD_RCU_PLLCLK_64M = 64000000
+MD_RCU_PLLCLK_72M = 72000000
+*/
+#define ES32_PLL_CLK_EN TRUE
+#define ES32_PLL_SOURSE_SELECT MD_RCU_PLLSRC_HRC48
+#define ES32_PLL_CLK_FREQ MD_RCU_PLLCLK_72M
+
+/*bus clk config
+
+MD_RCU_HPRE_SYSCLK_DIV_1 = SYSCLK not divided
+MD_RCU_HPRE_SYSCLK_DIV_2 = SYSCLK divided by 2
+MD_RCU_HPRE_SYSCLK_DIV_4 = SYSCLK divided by 4
+MD_RCU_HPRE_SYSCLK_DIV_8 = SYSCLK divided by 8
+MD_RCU_HPRE_SYSCLK_DIV_16 = SYSCLK divided by 16
+MD_RCU_HPRE_SYSCLK_DIV_64 = SYSCLK divided by 64
+MD_RCU_HPRE_SYSCLK_DIV_128 = SYSCLK divided by 128
+MD_RCU_HPRE_SYSCLK_DIV_256 = SYSCLK divided by 256
+MD_RCU_HPRE_SYSCLK_DIV_512 = @brief SYSCLK divided by 512
+
+MD_RCU_PPRE_HCLK_DIV_1 = HCLK not divided
+MD_RCU_PPRE_HCLK_DIV_2 = HCLK divided by 2
+MD_RCU_PPRE_HCLK_DIV_4 = HCLK divided by 4
+MD_RCU_PPRE_HCLK_DIV_8 = HCLK divided by 8
+MD_RCU_PPRE_HCLK_DIV_16 = HCLK divided by 16
+*/
+#define ES32_BUS_DIV_HPRE MD_RCU_HPRE_SYSCLK_DIV_1
+#define ES32_BUS_DIV_PPRE MD_RCU_PPRE_HCLK_DIV_1
+
+/*
+ * GPIO driver system settings.
+ */
+#define ES32_USB_USE_GPIO TRUE
+
+/*
+ * EXTI driver system settings.
+ */
+#define ES32_IRQ_EXTI0_1_PRIORITY 6
+#define ES32_IRQ_EXTI2_3_PRIORITY 6
+#define ES32_IRQ_EXTI4_15_PRIORITY 6
+
+/*
+ * GPT driver system settings.
+ */
+#define ES32_GPT_USE_AD16C4T1 FALSE
+#define ES32_GPT_USE_GP32C4T1 FALSE
+#define ES32_GPT_USE_GP16C4T1 FALSE
+#define ES32_GPT_USE_GP16C4T2 FALSE
+#define ES32_GPT_USE_GP16C4T3 FALSE
+#define ES32_GPT_USE_GP16C2T1 FALSE
+#define ES32_GPT_USE_GP16C2T2 FALSE
+#define ES32_GPT_USE_GP16C2T3 FALSE
+#define ES32_GPT_USE_GP16C2T4 FALSE
+#define ES32_GPT_USE_BS16T1 FALSE
+#define ES32_GPT_AD16C4T1_IRQ_PRIORITY 7
+#define ES32_GPT_GP32C4T1_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C4T1_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C4T2_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C4T3_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C2T1_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C2T2_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C2T3_IRQ_PRIORITY 7
+#define ES32_GPT_GP16C2T4_IRQ_PRIORITY 7
+#define ES32_GPT_BS16T1_IRQ_PRIORITY 7
+
+/*
+ * ICU driver system settings.
+ */
+#define ES32_ICU_USE_AD16C4T1 FALSE
+#define ES32_ICU_USE_GP32C4T1 FALSE
+#define ES32_ICU_USE_GP16C4T1 FALSE
+#define ES32_ICU_USE_GP16C4T2 FALSE
+#define ES32_ICU_USE_GP16C4T3 FALSE
+#define ES32_ICU_USE_GP16C2T1 FALSE
+#define ES32_ICU_USE_GP16C2T2 FALSE
+#define ES32_ICU_USE_GP16C2T3 FALSE
+#define ES32_ICU_USE_GP16C2T4 FALSE
+#define ES32_ICU_AD16C4T1_IRQ_PRIORITY 7
+#define ES32_ICU_GP32C4T1_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C4T1_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C4T2_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C4T3_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C2T1_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C2T2_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C2T3_IRQ_PRIORITY 7
+#define ES32_ICU_GP16C2T4_IRQ_PRIORITY 7
+
+/*
+ * I2C driver system settings.
+ */
+#define ES32_I2C_USE_I2C1 FALSE
+#define ES32_I2C_USE_I2C2 FALSE
+#define ES32_I2C_BUSY_TIMEOUT 50
+#define ES32_I2C_I2C1_IRQ_PRIORITY 5
+#define ES32_I2C_I2C2_IRQ_PRIORITY 5
+
+/*
+ * SERIAL driver system settings.
+ */
+#define ES32_SERIAL_USE_UART1 FALSE
+#define ES32_SERIAL_USE_UART2 FALSE
+#define ES32_SERIAL_USE_UART3 FALSE
+#define ES32_SERIAL_USE_UART4 FALSE
+#define ES32_SERIAL_UART1_PRIORITY 7
+#define ES32_SERIAL_UART2_PRIORITY 7
+#define ES32_SERIAL_UART3_PRIORITY 7
+#define ES32_SERIAL_UART4_PRIORITY 7
+
+/*
+ * SPI driver system settings.
+ */
+#define ES32_SPI_USE_SPI1 FALSE
+#define ES32_SPI_USE_SPI2 FALSE
+#define ES32_SPI_USE_SPI3 FALSE
+#define ES32_SPI_SPI1_IRQ_PRIORITY 10
+#define ES32_SPI_SPI2_IRQ_PRIORITY 10
+#define ES32_SPI_SPI3_IRQ_PRIORITY 10
+
+/*
+ * ST driver system settings.
+ */
+#define ES32_ST_IRQ_PRIORITY 8
+#define ES32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define ES32_UART_USE_UART1 FALSE
+#define ES32_UART_USE_UART2 FALSE
+#define ES32_UART_USE_UART3 FALSE
+#define ES32_UART_USE_UART4 FALSE
+#define ES32_UART_UART1_IRQ_PRIORITY 12
+#define ES32_UART_UART2_IRQ_PRIORITY 12
+#define ES32_UART_UART3_IRQ_PRIORITY 12
+#define ES32_UART_UART4_IRQ_PRIORITY 12
+
+/*
+ * PWM driver system settings.
+ */
+#define ES32_PWM_USE_AD16C4T1 FALSE
+#define ES32_PWM_USE_GP32C4T1 FALSE
+#define ES32_PWM_USE_GP16C4T1 FALSE
+#define ES32_PWM_USE_GP16C4T2 TRUE
+#define ES32_PWM_USE_GP16C4T3 FALSE
+#define ES32_PWM_USE_GP16C2T1 FALSE
+#define ES32_PWM_USE_GP16C2T2 FALSE
+#define ES32_PWM_USE_GP16C2T3 FALSE
+#define ES32_PWM_USE_GP16C2T4 FALSE
+#define ES32_PWM_AD16C4T1_IRQ_PRIORITY 7
+#define ES32_PWM_GP32C4T1_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C4T1_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C4T2_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C4T3_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C2T1_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C2T2_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C2T3_IRQ_PRIORITY 7
+#define ES32_PWM_GP16C2T4_IRQ_PRIORITY 7
+
+/*
+ * USB driver system settings.
+ */
+#define ES32_USB_USE_USB1 TRUE
+#define ES32_USB_USB1_IRQ_PRIORITY 13
+#define ES32_USE_USB_SOF_TRIM_HRC48 TRUE
+
+#endif /* MCUCONF_H */
diff --git a/keyboards/qwertykeyss/qkro_75k/qkro_75k.c b/keyboards/qwertykeyss/qkro_75k/qkro_75k.c
new file mode 100644
index 00000000000..ddfad3d3c88
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/qkro_75k.c
@@ -0,0 +1,31 @@
+/* Copyright 2024 Finalkey
+ * Copyright 2024 LiWenLiu
+ *
+ * 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 .
+ */
+#include "quantum.h"
+
+#ifdef RGB_MATRIX_ENABLE
+#define LED_CAP_INDEX (43)
+
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+
+ if (host_keyboard_led_state().caps_lock) {
+ rgb_matrix_set_color(LED_CAP_INDEX, RGB_MATRIX_MAXIMUM_BRIGHTNESS, RGB_MATRIX_MAXIMUM_BRIGHTNESS, RGB_MATRIX_MAXIMUM_BRIGHTNESS);
+
+ }
+
+ return false;
+}
+#endif
diff --git a/keyboards/qwertykeyss/qkro_75k/readme.md b/keyboards/qwertykeyss/qkro_75k/readme.md
new file mode 100644
index 00000000000..d7b8a6a4769
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/readme.md
@@ -0,0 +1,22 @@
+# QKRO75K
+
+
+
+A customizable 82key keyboard.
+
+* Keyboard Maintainer: [Linger7857](https://github.com/Linger7857)
+* Hardware Supported: QKRO75K PCB with ES32FS026 microcontroller
+* Hardware Availability: Check the wob page on [QKRO75K](https://qwertykey.eu)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ make QKRO75K/QKRO75K:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 1 ways:
+
+* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (Esc key) and plug in the keyboard
diff --git a/keyboards/qwertykeyss/qkro_75k/rules.mk b/keyboards/qwertykeyss/qkro_75k/rules.mk
new file mode 100644
index 00000000000..bcdbf8da68e
--- /dev/null
+++ b/keyboards/qwertykeyss/qkro_75k/rules.mk
@@ -0,0 +1,30 @@
+# Board: it should exist either in /os/hal/boards/
+# or /boards
+BOARD = FS026
+
+# Cortex version
+MCU = cortex-m0
+
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 6
+
+## chip/board settings
+# - the next two should match the directories in
+# /os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
+# OR
+# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = ES32
+MCU_SERIES = FS026
+
+# Linker script to use
+# - it should exist either in /os/common/startup/ARMCMx/compilers/GCC/ld/
+# or /ld/
+MCU_LDSCRIPT ?= FS026
+
+# Startup code to use
+# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP ?= FS026
+
+USE_FPU ?= no
+DEBOUNCE_TYPE = asym_eager_defer_pk
+