diff --git a/keyboards/yandrstudio/boy40ble/config.h b/keyboards/yandrstudio/boy40ble/config.h index 18c398ce2a86..be6aa5ae0d19 100644 --- a/keyboards/yandrstudio/boy40ble/config.h +++ b/keyboards/yandrstudio/boy40ble/config.h @@ -19,7 +19,7 @@ /* USB Device descriptor parameter */ #define VENDOR_ID 0xAA96 -#define PRODUCT_ID 0xAAA6 +#define PRODUCT_ID 0xAAAB #define DEVICE_VER 0x0001 #define MANUFACTURER JasonRen biu #define PRODUCT boy40ble diff --git a/keyboards/yandrstudio/boy40ble/via-info.json b/keyboards/yandrstudio/boy40ble/via-info.json index 33f5da83d849..c5e005ceb97f 100644 --- a/keyboards/yandrstudio/boy40ble/via-info.json +++ b/keyboards/yandrstudio/boy40ble/via-info.json @@ -1,7 +1,7 @@ { "name": "Boy40_Y&R", "vendorId": "0xAA96", - "productId": "0xAAA6", + "productId": "0xAAAB", "lighting": "qmk_rgblight", "matrix": { "rows": 4, "cols": 12 }, "layouts": { diff --git a/keyboards/yandrstudio/boyPad/boyPad.c b/keyboards/yandrstudio/boyPad/boyPad.c new file mode 100644 index 000000000000..1c249415f4f2 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/boyPad.c @@ -0,0 +1,59 @@ +/* Copyright 2021 JasonRen(biu) + * + * 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 + + +#ifdef RGB_MATRIX_ENABLE +led_config_t g_led_config = { + { + { 0, 1, 2, 3 }, \ + { 6, 5, 4, NO_LED }, \ + { 7, 8, 9, 10 }, \ + { 13, 12, 11, NO_LED }, \ + { NO_LED, 14, 15, 16 } \ + }, + { + // LED Index to Physical Position + {0,0}, {75,0}, {149,0}, {224,0}, \ + {224,16}, {149,16}, {75,16}, \ + {0,32}, {75,32}, {149,32}, {224,32}, \ + {224,48}, {149,48}, {75,48},\ + {75,64}, {149,64}, {224,64}\ + }, + { + // LED Index to Flag + 4, 4, 4, 4, \ + 4, 4, 4, \ + 4, 4, 4, 4, \ + 4, 4, 4, \ + 4, 4, 4 \ + } +}; + + +#endif + +#ifdef RGB_DISABLE_WHEN_USB_SUSPENDED +void suspend_power_down_kb(void) { + rgb_matrix_set_suspend_state(true); + suspend_power_down_user(); +} + +void suspend_wakeup_init_kb(void) { + rgb_matrix_set_suspend_state(false); + suspend_wakeup_init_user(); +} +#endif diff --git a/keyboards/yandrstudio/boyPad/boyPad.h b/keyboards/yandrstudio/boyPad/boyPad.h new file mode 100644 index 000000000000..cd03c3f2423f --- /dev/null +++ b/keyboards/yandrstudio/boyPad/boyPad.h @@ -0,0 +1,46 @@ +/* Copyright 2020 zvecr + * + * 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 + +#include "quantum.h" + +/* + * ┌───┬───┬───┬───┐ + * │00 │01 │02 │03 │ + * ├───┼───┼───┼───┤ + * │10 │11 │12 │ │ + * ├───┼───┼───┤23 │ + * │20 │21 │22 │ │ + * ├───┼───┼───┼───┤ + * │30 │31 │32 │ │ + * ├───┴───┼───┤43 │ + * │41 │42 │ │ + * └───────┴───┴───┘ + */ + +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, \ + k20, k21, k22, k23, \ + k30, k31, k32, \ + k41, k42, k43 \ +) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, KC_NO }, \ + { k20, k21, k22, k23 }, \ + { k30, k31, k32, KC_NO }, \ + { KC_NO, k41, k42, k43 } \ +} diff --git a/keyboards/yandrstudio/boyPad/config.h b/keyboards/yandrstudio/boyPad/config.h new file mode 100644 index 000000000000..0c177ebeb9df --- /dev/null +++ b/keyboards/yandrstudio/boyPad/config.h @@ -0,0 +1,53 @@ +/* Copyright 2021 JasonRen(biu) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xAA96 +#define PRODUCT_ID 0xAAAC +#define DEVICE_VER 0x0001 +#define MANUFACTURER JasonRen biu +#define PRODUCT boy40ble + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 4 + +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 +#define MATRIX_COL_PINS { B15, A8, A9, A1} +#define MATRIX_ROW_PINS { B12, B13, B14, A5, A2} + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + + +// enable the nkro when using the VIA. +#define FORCE_NKRO + +// fix VIA RGB_light +#define VIA_HAS_BROKEN_KEYCODES + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + + + + diff --git a/keyboards/yandrstudio/boyPad/f401/board.h b/keyboards/yandrstudio/boyPad/f401/board.h new file mode 100644 index 000000000000..d6432824e162 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/board.h @@ -0,0 +1,25 @@ +/* Copyright 2020 Nick Brassel (tzarc) + * + * 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 . + */ +#pragma once + +#include_next "board.h" + + +#undef STM32_HSECLK +#define STM32_HSECLK 8000000 + + +#define BOARD_YANDR_BIU_F401 diff --git a/keyboards/yandrstudio/boyPad/f401/chconf.h b/keyboards/yandrstudio/boyPad/f401/chconf.h new file mode 100644 index 000000000000..4820db8dcbeb --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/chconf.h @@ -0,0 +1,34 @@ +/* Copyright 2020 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 . + */ + +#pragma once + +#define CH_CFG_ST_FREQUENCY 10000 + +#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE + +#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE + +#define CH_CFG_FACTORY_SEMAPHORES TRUE + +#define CH_CFG_FACTORY_MAILBOXES TRUE + +#define CH_CFG_FACTORY_OBJ_FIFOS TRUE + +#define CH_CFG_FACTORY_PIPES TRUE + +#include_next + diff --git a/keyboards/yandrstudio/boyPad/f401/config.h b/keyboards/yandrstudio/boyPad/f401/config.h new file mode 100644 index 000000000000..a4db3013c014 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/config.h @@ -0,0 +1,62 @@ +/* Copyright 2021 JasonRen(biu) + * + * 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 + +#include "config_common.h" + + +/* RGN Matrix */ +#ifdef RGB_MATRIX_ENABLE + +# define RGB_DI_PIN A7 +# define RGBLED_NUM 17 +# define DRIVER_LED_TOTAL RGBLED_NUM + +#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2 +#define WS2812_PWM_CHANNEL 2 // default: 2 +#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU. +#define WS2812_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU. + + +# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 180 +# define RGBLIGHT_VAL_STEP 18 +# define RGB_DISABLE_WHEN_USB_SUSPENDED true +# define RGB_MATRIX_CENTER { 32, 96 } +# define RGB_MATRIX_KEYPRESSES +# define RGB_MATRIX_FRAMEBUFFER_EFFECTS + +#endif + + +#ifdef RGBLIGHT_ENABLE + +# define RGB_DI_PIN A7 +# define RGBLED_NUM 17 +# define RGBLIGHT_ANIMATIONS +# define DRIVER_LED_TOTAL RGBLED_NUM + + +#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2 +#define WS2812_PWM_CHANNEL 2 // default: 2 +#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2 +#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU. +#define WS2812_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU. + +#endif + + + diff --git a/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32.c b/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32.c new file mode 100644 index 000000000000..12071a21291e --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32.c @@ -0,0 +1,217 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from http://engsta.com/stm32-flash-memory-eeprom-emulator/ by + * Artur F. + * + * Modifications for QMK and STM32F303 by Yiancar + * update for STM32F4 support and the the flashing algorithm by yulei + * Adjust the file structure to custom EEPROM_DRIVER by jiaxin96 for support stm32f401cc + */ + +#include +#include +#include "eeprom_stm32_custom.h" +#include "eeprom_driver.h" +/***************************************************************************** + * Allows to use the internal flash to store non volatile data. To initialize + * the functionality use the EEPROM_Init() function. Be sure that by reprogramming + * of the controller just affected pages will be deleted. In other case the non + * volatile data will be lost. + ******************************************************************************/ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Functions -----------------------------------------------------------------*/ + +#define IS_VALID_ADDRESS(x) ((x) < FEE_MAX_BYTES) + +uint8_t DataBuf[FEE_MAX_BYTES]; +static void EEPROM_Backup(void); +static FLASH_Status EEPROM_Restore(void); +static uint32_t EEPROM_FindValidAddress(void); +static void EEPROM_Clear(void); + +/***************************************************************************** + * Unlock the FLASH programming and initialized the DataBuf + ******************************************************************************/ +uint16_t EEPROM_Init(void) { + // unlock flash + FLASH_Unlock(); + + // initialize DataBuf + EEPROM_Backup(); + + // Clear Flags + // FLASH_ClearFlag(FLASH_SR_EOP|FLASH_SR_PGERR|FLASH_SR_WRPERR); + + return FEE_DENSITY_BYTES; +} +void eeprom_driver_init(void) { + EEPROM_Init(); +} + +/***************************************************************************** + * Erase the whole reserved Flash Space used for user Data + ******************************************************************************/ +void EEPROM_Erase(void) { + // erase all flash pages + EEPROM_Clear(); + + // reset the content of the buffer + memset(&DataBuf[0], FEE_EMPTY_BYTE, sizeof(DataBuf)); +} +void eeprom_driver_erase(void) { + EEPROM_Erase(); +} +/***************************************************************************** + * Write data with its eeprom address to flash if there has empty words, + * otherwise backup the current valid data, erase all flash pages, + * and finally restore the valid data. + *******************************************************************************/ +uint16_t EEPROM_WriteDataByte(uint16_t Address, uint8_t DataByte) { + FLASH_Status FlashStatus = FLASH_COMPLETE; + + uint32_t addr; + // exit if not a valid address + if (!IS_VALID_ADDRESS(Address)) { + return 0; + } + +// we are sure the address will not be out of bound +#pragma GCC diagnostic ignored "-Warray-bounds" + // same value, do not need program + if (DataBuf[Address] == DataByte) { + return FlashStatus; + } + + // find the address can be written + addr = EEPROM_FindValidAddress(); + DataBuf[Address] = DataByte; +#pragma GCC diagnostic pop + if (addr == FEE_EMPTY_VALUE) { + // EEPROM is full, need to erase and reprogramming + EEPROM_Clear(); + EEPROM_Restore(); + } else { + FLASH_ProgramHalfWord(FEE_ADDR_ADDRESS(addr), Address); + FLASH_ProgramHalfWord(FEE_DATA_ADDRESS(addr), DataByte); + } + + return FlashStatus; +} +/***************************************************************************** + * Read once data byte from a specified address. + *******************************************************************************/ +uint8_t EEPROM_ReadDataByte(uint16_t Address) { + if (!IS_VALID_ADDRESS(Address)) { + return FEE_EMPTY_BYTE; + } + + // Get Byte from caches + return DataBuf[Address]; +} + +/***************************************************************************** + * helper functions + *******************************************************************************/ +// backup the current data +void EEPROM_Backup(void) +{ + uint32_t begin = FEE_PAGE_BASE_ADDRESS; + uint32_t end = FEE_PAGE_END_ADDRESS; + memset(&DataBuf[0], FEE_EMPTY_BYTE, sizeof(DataBuf)); + while( begin < end) { + uint16_t addr = *(__IO uint16_t*)(FEE_ADDR_ADDRESS(begin)); + if (IS_VALID_ADDRESS(addr)) { + DataBuf[addr] = *(__IO uint16_t*)(FEE_DATA_ADDRESS(begin)); + } else if( addr == FEE_EMPTY_WORD) { + uint16_t data = *(__IO uint16_t*)(FEE_DATA_ADDRESS(begin)); + if (data == FEE_EMPTY_WORD) { + // we reached the end of valid data + break; + } + } + begin += 4; + } +} +// restore data from DataBuf +FLASH_Status EEPROM_Restore(void) { + uint32_t cur = FEE_PAGE_BASE_ADDRESS; + for (uint8_t i = 0; i < FEE_MAX_BYTES; i++) { + if (DataBuf[i] != FEE_EMPTY_BYTE) { + FLASH_ProgramHalfWord(FEE_ADDR_ADDRESS(cur), i); + FLASH_ProgramHalfWord(FEE_DATA_ADDRESS(cur), DataBuf[i]); + cur += 4; + } + } + return FLASH_COMPLETE; +} +// find an empty place for programming +uint32_t EEPROM_FindValidAddress(void) { + uint32_t begin = FEE_PAGE_BASE_ADDRESS; + uint32_t end = FEE_PAGE_END_ADDRESS; + while( begin < end) { + uint32_t data = *(__IO uint32_t*)(begin); + if (data == FEE_EMPTY_VALUE) { + return begin; + } + begin += 4; + } + return FEE_EMPTY_VALUE; +} + +void EEPROM_Clear(void) +{ +#if defined(EEPROM_EMU_STM32F401xC) + FLASH_ErasePage(FEE_SECTOR_ID); +#else + int page_num = 0; + + // delete all pages from specified start page to the last page + do { + FLASH_ErasePage(FEE_PAGE_BASE_ADDRESS + (page_num * FEE_PAGE_SIZE)); + page_num++; + } while (page_num < FEE_DENSITY_PAGES); +#endif +} +/***************************************************************************** + * Wrap library in AVR style functions. + *******************************************************************************/ +uint8_t eeprom_read_byte_f4(const uint8_t *Address) { + const uint16_t p = (const uint32_t)Address; + return EEPROM_ReadDataByte(p); +} + +void eeprom_write_byte_f4(uint8_t *Address, uint8_t Value) { + uint16_t p = (uint32_t)Address; + EEPROM_WriteDataByte(p, Value); +} + + +void eeprom_read_block(void *buf, const void *addr, size_t len) { + const uint8_t *p = (const uint8_t *)addr; + uint8_t * dest = (uint8_t *)buf; + while (len--) { + *dest++ = eeprom_read_byte_f4(p++); + } +} + +void eeprom_write_block(const void *buf, void *addr, size_t len) { + uint8_t * p = (uint8_t *)addr; + const uint8_t *src = (const uint8_t *)buf; + while (len--) { + eeprom_write_byte_f4(p++, *src++); + } +} + + diff --git a/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32_custom.h b/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32_custom.h new file mode 100644 index 000000000000..096842aaaf16 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/eep/eeprom_stm32_custom.h @@ -0,0 +1,104 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from http://engsta.com/stm32-flash-memory-eeprom-emulator/ by + * Artur F. + * + * Modifications for QMK and STM32F303 by Yiancar + * + * This library assumes 8-bit data locations. To add a new MCU, please provide the flash + * page size and the total flash size in Kb. The number of available pages must be a multiple + * of 2. Only half of the pages account for the total EEPROM size. + * This library also assumes that the pages are not used by the firmware. + * Adjust the file structure to custom EEPROM_DRIVER by jiaxin96 for support stm32f401cc + */ + +#pragma once + +#include +#include +#include "flash_stm32.h" + +// HACK ALERT. This definition may not match your processor +// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc +#if defined(EEPROM_EMU_STM32F303xC) +# define MCU_STM32F303CC +#elif defined(EEPROM_EMU_STM32F103xB) +# define MCU_STM32F103RB +#elif defined(EEPROM_EMU_STM32F072xB) +# define MCU_STM32F072CB +#elif defined(EEPROM_EMU_STM32F042x6) +# define MCU_STM32F042K6 +#elif defined(EEPROM_EMU_STM32F401xC) +# define MCU_STM32F401xC +#else +# error "not implemented." +#endif + + + + + +#ifndef EEPROM_PAGE_SIZE +# if defined(MCU_STM32F103RB) || defined(MCU_STM32F042K6) +# define FEE_PAGE_SIZE (uint16_t)0x400 // Page size = 1KByte +# define FEE_DENSITY_PAGES 4 // How many pages are used +# elif defined(MCU_STM32F103ZE) || defined(MCU_STM32F103RE) || defined(MCU_STM32F103RD) || defined(MCU_STM32F303CC) || defined(MCU_STM32F072CB) +# define FEE_PAGE_SIZE (uint16_t)0x800 // Page size = 2KByte +# define FEE_DENSITY_PAGES 4 // How many pages are used +# elif defined(MCU_STM32F401xC) +# define FEE_PAGE_SIZE (uint32_t)0x20000 // Page size = 128KByte +# define FEE_DENSITY_PAGES 1 // How many pages are used +# define FEE_SECTOR_ID 5 // sector id of the flash +# else +# error "No MCU type specified. Add something like -DMCU_STM32F103RB to your compiler arguments (probably in a Makefile)." +# endif +#endif + +#ifndef EEPROM_START_ADDRESS +# if defined(MCU_STM32F103RB) || defined(MCU_STM32F072CB) +# define FEE_MCU_FLASH_SIZE 128 // Size in Kb +# elif defined(MCU_STM32F042K6) +# define FEE_MCU_FLASH_SIZE 32 // Size in Kb +# elif defined(MCU_STM32F103ZE) || defined(MCU_STM32F103RE) +# define FEE_MCU_FLASH_SIZE 512 // Size in Kb +# elif defined(MCU_STM32F103RD) +# define FEE_MCU_FLASH_SIZE 384 // Size in Kb +# elif defined(MCU_STM32F303CC) +# define FEE_MCU_FLASH_SIZE 256 // Size in Kb +# elif defined(MCU_STM32F401xC) +# define FEE_MCU_FLASH_SIZE 256 // Size in Kb +# else +# error "No MCU type specified. Add something like -DMCU_STM32F103RB to your compiler arguments (probably in a Makefile)." +# endif +#endif + +// DONT CHANGE +// Choose location for the first EEPROM Page address on the top of flash +// #define FEE_PAGE_BASE_ADDRESS ((uint32_t)(0x8000000 + FEE_MCU_FLASH_SIZE * 1024 - FEE_DENSITY_PAGES * FEE_PAGE_SIZE)) +// #define FEE_DENSITY_BYTES ((FEE_PAGE_SIZE / 2) * FEE_DENSITY_PAGES - 1) +// #define FEE_LAST_PAGE_ADDRESS (FEE_PAGE_BASE_ADDRESS + (FEE_PAGE_SIZE * FEE_DENSITY_PAGES)) +// #define FEE_EMPTY_WORD ((uint16_t)0xFFFF) +// #define FEE_ADDR_OFFSET(Address) (Address * 2) // 1Byte per Word will be saved to preserve Flash + +#define FEE_PAGE_END_ADDRESS ((uint32_t)(0x08000000 + FEE_MCU_FLASH_SIZE * 1024)) +#define FEE_PAGE_BASE_ADDRESS ((uint32_t)((FEE_PAGE_END_ADDRESS) - FEE_DENSITY_PAGES * FEE_PAGE_SIZE)) +#define FEE_DENSITY_BYTES ((FEE_PAGE_SIZE / 4) * FEE_DENSITY_PAGES - 1) // 4 Bytes for address, value pair +//#define FEE_LAST_PAGE_ADDRESS (FEE_PAGE_BASE_ADDRESS + (FEE_PAGE_SIZE * FEE_DENSITY_PAGES)) +#define FEE_EMPTY_BYTE ((uint8_t)0xFF) +#define FEE_EMPTY_WORD ((uint16_t)0xFFFF) +#define FEE_EMPTY_VALUE ((uint32_t)0xFFFFFFFF) +//#define FEE_ADDR_OFFSET(Address) (Address * 2) // 1 Byte per Word will be saved to preserve Flash +#define FEE_DATA_ADDRESS(Address) ((Address)+2) // flash address of the eeprom data +#define FEE_ADDR_ADDRESS(Address) (Address) // flash address of the eeprom address +#define FEE_MAX_BYTES ((FEE_DENSITY_BYTES+1) > 1024 ? 1024 : (FEE_DENSITY_BYTES+1)) // eeprom size + diff --git a/keyboards/yandrstudio/boyPad/f401/eep/flash_stm32.c b/keyboards/yandrstudio/boyPad/f401/eep/flash_stm32.c new file mode 100644 index 000000000000..c3f1937c5258 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/eep/flash_stm32.c @@ -0,0 +1,223 @@ +/* + * This software is experimental and a work in progress. + * Under no circumstances should these files be used in relation to any critical system(s). + * Use of these files is at your own risk. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * https://github.com/leaflabs/libmaple + * + * Modifications for QMK and STM32F303 by Yiancar + * Adjust the file structure to custom EEPROM_DRIVER by jiaxin96 for support stm32f401cc + */ + +#if defined(EEPROM_EMU_STM32F303xC) +# define STM32F303xC +# include "stm32f3xx.h" +#elif defined(EEPROM_EMU_STM32F103xB) +# define STM32F103xB +# include "stm32f1xx.h" +#elif defined(EEPROM_EMU_STM32F072xB) +# define STM32F072xB +# include "stm32f0xx.h" +#elif defined(EEPROM_EMU_STM32F042x6) +# define STM32F042x6 +# include "stm32f0xx.h" +#elif defined(EEPROM_EMU_STM32F401xC) +# define STM32F401xC +# include "stm32f4xx.h" +#else +# error "not implemented." +#endif + + +#include "flash_stm32.h" + +#if defined(EEPROM_EMU_STM32F103xB) +# define FLASH_SR_WRPERR FLASH_SR_WRPRTERR +#endif + +#if defined(EEPROM_EMU_STM32F401xC) +# define FLASH_PSIZE_HFWORD FLASH_CR_PSIZE_0 +# define FLASH_PSIZE_WORD FLASH_CR_PSIZE_1 +# define FLASH_CR_SNB_POS 3 +/* the flash key was not defined in the CMSIS used by current chibios */ +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +# define FLASH_SR_FLAGS (FLASH_SR_PGAERR|FLASH_SR_PGPERR|FLASH_SR_PGSERR|FLASH_SR_WRPERR) +#else +# define FLASH_SR_FLAGS (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR) +#endif + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x00000FFF) +#define ProgramTimeout ((uint32_t)0x0000001F) + +#define ASSERT(exp) (void)((0)) + +/** + * @brief Inserts a time delay. + * @param None + * @retval None + */ +static void delay(void) { + __IO uint32_t i = 0; + for (i = 0xFF; i != 0; i--) { + } +} + +/** + * @brief Returns the FLASH Status. + * @param None + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE + */ +FLASH_Status FLASH_GetStatus(void) { + if ((FLASH->SR & FLASH_SR_BSY) == FLASH_SR_BSY) return FLASH_BUSY; + +#if defined(EEPROM_EMU_STM32F401xC) + if ((FLASH->SR & (FLASH_SR_PGSERR | FLASH_SR_PGPERR | FLASH_SR_PGAERR))) return FLASH_ERROR_PG; + if ((FLASH->SR & FLASH_SR_WRPERR)) return FLASH_ERROR_WRP; +#else + if ((FLASH->SR & FLASH_SR_PGERR) != 0) return FLASH_ERROR_PG; + if ((FLASH->SR & FLASH_SR_WRPERR) != 0) return FLASH_ERROR_WRP; + if ((FLASH->SR & FLASH_OBR_OPTERR) != 0) return FLASH_ERROR_OPT; +#endif + + return FLASH_COMPLETE; +} + +/** + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * @param Timeout: FLASH progamming Timeout + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) { + FLASH_Status status; + + /* Check for the Flash Status */ + status = FLASH_GetStatus(); + /* Wait for a Flash operation to complete or a TIMEOUT to occur */ + while ((status == FLASH_BUSY) && (Timeout != 0x00)) { + delay(); + status = FLASH_GetStatus(); + Timeout--; + } + if (Timeout == 0) status = FLASH_TIMEOUT; + /* Return the operation status */ + return status; +} + +/** + * @brief Erases a specified FLASH page. + * @param Page_Address: The page address or sector to be erased. + * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page) { + FLASH_Status status = FLASH_COMPLETE; + /* Check the parameters */ + //ASSERT(IS_FLASH_ADDRESS(Page_Address)); + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + + if (status == FLASH_COMPLETE) { + /* if the previous operation is completed, proceed to erase the page */ +#if defined(EEPROM_EMU_STM32F401xC) + FLASH->CR &= ~FLASH_CR_SNB; + FLASH->CR |= FLASH_CR_SER | (Page << FLASH_CR_SNB_POS); +#else + FLASH->CR |= FLASH_CR_PER; + FLASH->AR = Page; +#endif + FLASH->CR |= FLASH_CR_STRT; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(EraseTimeout); + /* clear the SER or PER Bit */ +#if defined(EEPROM_EMU_STM32F401xC) + FLASH->CR &= ~(FLASH_CR_SER | FLASH_CR_SNB); +#else + FLASH->CR &= ~FLASH_CR_PER; +#endif + FLASH_ClearFlag(FLASH_SR_FLAGS); + } + /* Return the Erase Status */ + return status; +} + +/** + * @brief Programs a half word at a specified address. + * @param Address: specifies the address to be programmed. + * @param Data: specifies the data to be programmed. + * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) { + FLASH_Status status = FLASH_BAD_ADDRESS; + if ((Address % sizeof(uint16_t) != 0 ) || !IS_FLASH_ADDRESS(Address)) { + return status; + } + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if (status == FLASH_COMPLETE) { + /* if the previous operation is completed, proceed to program the new data */ +#if defined(EEPROM_EMU_STM32F401xC) + FLASH->CR &= ~FLASH_CR_PSIZE; + FLASH->CR |= FLASH_PSIZE_HFWORD; +#endif + FLASH->CR |= FLASH_CR_PG; + *(__IO uint16_t*)Address = Data; + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(ProgramTimeout); + if (status != FLASH_TIMEOUT) { + /* if the program operation is completed, disable the PG Bit */ + FLASH->CR &= ~FLASH_CR_PG; + } + FLASH_ClearFlag(FLASH_SR_FLAGS); + } + return status; +} + +/** + * @brief Unlocks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Unlock(void) { + /* Authorize the FPEC Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/** + * @brief Locks the FLASH Program Erase Controller. + * @param None + * @retval None + */ +void FLASH_Lock(void) { + /* Set the Lock Bit to lock the FPEC and the FCR */ + FLASH->CR |= FLASH_CR_LOCK; +} + +/** + * @brief Clears the FLASH's pending flags. + * @param FLASH_FLAG: specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_PGERR: FLASH Programming error flag flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_EOP: FLASH End of Programming flag + * @retval None + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) { + /* Clear the flags */ + FLASH->SR |= FLASH_FLAG; +} diff --git a/keyboards/yandrstudio/boyPad/f401/halconf.h b/keyboards/yandrstudio/boyPad/f401/halconf.h new file mode 100644 index 000000000000..3a9aa3f15bbb --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/halconf.h @@ -0,0 +1,33 @@ +/* Copyright 2020 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 . + */ + +#pragma once +#include_next + +#undef HAL_USE_PWM +#define HAL_USE_PWM TRUE + +#undef SERIAL_USB_BUFFERS_SIZE +#define SERIAL_USB_BUFFERS_SIZE 256 + +#undef SERIAL_BUFFERS_SIZE +#define SERIAL_BUFFERS_SIZE 128 + +#undef SPI_USE_WAIT +#define SPI_USE_WAIT TRUE + +#undef SPI_SELECT_MODE +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD diff --git a/keyboards/yandrstudio/boyPad/f401/matrix.c b/keyboards/yandrstudio/boyPad/f401/matrix.c new file mode 100644 index 000000000000..d7040e338fbe --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/matrix.c @@ -0,0 +1,236 @@ +/* Copyright 2021 JasonRen(biu) + * + * 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 +#include +#include "util.h" +#include "matrix.h" +#include "debounce.h" +#include "quantum.h" + +#ifdef DIRECT_PINS +static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; +#elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) +static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#endif + +/* matrix state(1:on, 0:off) */ +extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values +extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values + +static inline void setPinOutput_writeLow(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinOutput(pin); + writePinLow(pin); + } +} + +static inline void setPinInputHigh_atomic(pin_t pin) { + ATOMIC_BLOCK_FORCEON { setPinInputHigh(pin); } +} + +// matrix code + +#ifdef DIRECT_PINS + +static void init_pins(void) { + for (int row = 0; row < MATRIX_ROWS; row++) { + for (int col = 0; col < MATRIX_COLS; col++) { + pin_t pin = direct_pins[row][col]; + if (pin != NO_PIN) { + setPinInputHigh(pin); + } + } + } +} + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { + // Start with a clear matrix row + matrix_row_t current_row_value = 0; + + for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + pin_t pin = direct_pins[current_row][col_index]; + if (pin != NO_PIN) { + current_row_value |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index); + } + } + + // If the row has changed, store the row and return the changed flag. + if (current_matrix[current_row] != current_row_value) { + current_matrix[current_row] = current_row_value; + return true; + } + return false; +} + +#elif defined(DIODE_DIRECTION) +# if (DIODE_DIRECTION == COL2ROW) + +static void select_col(uint8_t col) { palSetLine(col_pins[col]); } + +static void unselect_col(uint8_t col) { palClearLine(col_pins[col]); } + +static void unselect_rows(void) { + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + palSetLineMode(row_pins[x], PAL_MODE_INPUT_PULLDOWN); + } +} + +static void init_pins(void) { + unselect_rows(); + for (uint8_t x = 0; x < MATRIX_COLS; x++) { + palSetLineMode(col_pins[x], PAL_MODE_OUTPUT_PUSHPULL); + } + for (uint8_t x = 0; x < MATRIX_COLS; x++) { + palClearLine(col_pins[x]); + } +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) { + bool matrix_changed = false; + + // Select col + select_col(current_col); + matrix_output_select_delay(); + + // For each row... + for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + matrix_row_t current_row_value = last_row_value; + + // Check row pin state + if (readPin(row_pins[row_index]) == 1) { + // Pin HI, set col bit + current_row_value |= (MATRIX_ROW_SHIFTER << current_col); + } else { + // Pin LO, clear col bit + current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_row_value)) { + matrix_changed |= true; + current_matrix[row_index] = current_row_value; + } + } + + // Unselect col + unselect_col(current_col); + if (current_col + 1 < MATRIX_COLS) { + matrix_output_unselect_delay(); // wait for col signal to go HIGH + } + + return matrix_changed; +} + +# elif (DIODE_DIRECTION == ROW2COL) + +static void select_row(uint8_t row) { palSetLine(row_pins[row]); } + +static void unselect_row(uint8_t row) { palClearLine(row_pins[row]); } + +static void unselect_cols(void) { + for (uint8_t x = 0; x < MATRIX_COLS; x++) { + palSetLineMode(col_pins[x], PAL_MODE_INPUT_PULLDOWN); + } +} + +static void init_pins(void) { + unselect_cols(); + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + palSetLineMode(row_pins[x], PAL_MODE_OUTPUT_PUSHPULL); + } + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + palClearLine(row_pins[x]); + } +} + + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { + // Start with a clear matrix row + matrix_row_t current_row_value = 0; + + // Select row + select_row(current_row); + matrix_output_select_delay(); + + // For each col... + for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + // Select the col pin to read (active low) + uint8_t pin_state = readPin(col_pins[col_index]); + + // Populate the matrix row with the state of the col pin + current_row_value |= pin_state ? (MATRIX_ROW_SHIFTER << col_index) : 0; + } + + // Unselect row + unselect_row(current_row); + if (current_row + 1 < MATRIX_ROWS) { + matrix_output_unselect_delay(); // wait for row signal to go HIGH + } + + // If the row has changed, store the row and return the changed flag. + if (current_matrix[current_row] != current_row_value) { + current_matrix[current_row] = current_row_value; + return true; + } + return false; +} + +# else +# error DIODE_DIRECTION must be one of COL2ROW or ROW2COL! +# endif +#else +# error DIODE_DIRECTION is not defined! +#endif + +void matrix_init(void) { + // initialize key pins + init_pins(); + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + raw_matrix[i] = 0; + matrix[i] = 0; + } + + debounce_init(MATRIX_ROWS); + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) { + bool changed = false; + +#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { + changed |= read_rows_on_col(raw_matrix, current_col); + } +#elif (DIODE_DIRECTION == ROW2COL) + // Set row, read cols + for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { + changed |= read_cols_on_row(raw_matrix, current_row); + } +#endif + + debounce(raw_matrix, matrix, MATRIX_ROWS, changed); + + matrix_scan_quantum(); + return (uint8_t)changed; +} diff --git a/keyboards/yandrstudio/boyPad/f401/mcuconf.h b/keyboards/yandrstudio/boyPad/f401/mcuconf.h new file mode 100644 index 000000000000..c9099bf47558 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/mcuconf.h @@ -0,0 +1,81 @@ +/* Copyright 2020 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 . + */ + +#pragma once + +#include_next + +#undef STM32_PWM_USE_TIM3 +#define STM32_PWM_USE_TIM3 TRUE + +#undef STM32_NO_INIT +#undef STM32_HSI_ENABLED +#undef STM32_LSI_ENABLED +#undef STM32_HSE_ENABLED +#undef STM32_LSE_ENABLED +#undef STM32_CLOCK48_REQUIRED +#undef STM32_SW +#undef STM32_PLLSRC +#undef STM32_PLLM_VALUE +#undef STM32_PLLN_VALUE +#undef STM32_PLLP_VALUE +#undef STM32_PLLQ_VALUE +#undef STM32_HPRE +#undef STM32_PPRE1 +#undef STM32_PPRE2 +#undef STM32_RTCSEL +#undef STM32_RTCPRE_VALUE +#undef STM32_MCO1SEL +#undef STM32_MCO1PRE +#undef STM32_MCO2SEL +#undef STM32_MCO2PRE +#undef STM32_I2SSRC +#undef STM32_PLLI2SN_VALUE +#undef STM32_PLLI2SR_VALUE +#undef STM32_PVD_ENABLE +#undef STM32_PLS +#undef STM32_BKPRAM_ENABLE + +#define STM32_NO_INIT FALSE +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_CLOCK48_REQUIRED TRUE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PLLM_VALUE 8 +#define STM32_PLLN_VALUE 192 +#define STM32_PLLP_VALUE 4 +#define STM32_PLLQ_VALUE 4 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV4 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_RTCPRE_VALUE 8 +#define STM32_MCO1SEL STM32_MCO1SEL_HSI +#define STM32_MCO1PRE STM32_MCO1PRE_DIV1 +#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK +#define STM32_MCO2PRE STM32_MCO2PRE_DIV5 +#define STM32_I2SSRC STM32_I2SSRC_CKIN +#define STM32_PLLI2SN_VALUE 192 +#define STM32_PLLI2SR_VALUE 5 +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_BKPRAM_ENABLE FALSE + + + diff --git a/keyboards/yandrstudio/boyPad/f401/rules.mk b/keyboards/yandrstudio/boyPad/f401/rules.mk new file mode 100644 index 000000000000..4fbb38269278 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/f401/rules.mk @@ -0,0 +1,28 @@ +# MCU name +MCU = STM32F401 + +# Address of the bootloader in system memory +STM32_BOOTLOADER_ADDRESS = 0x1FFF0000 +# Bootloader selection +BOOTLOADER = stm32-dfu + +# # project specific file +CUSTOM_MATRIX = lite # for using the A9 pin as matrix io +QUANTUM_SRC += matrix.c + + +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = WS2812 +# RGBLIGHT_ENABLE = yes +# RGBLIGHT_DRIVER = WS2812 +WS2812_DRIVER = pwm + +EEPROM_DRIVER = custom +SRC += eep/eeprom_stm32.c +SRC += eep/flash_stm32.c +OPT_DEFS += -DEEPROM_EMU_STM32F401xC +COMMON_VPATH += patsubst$(%/, %, dir $(mkfile_patch))/eep + + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE diff --git a/keyboards/yandrstudio/boyPad/keymaps/via/keymap.c b/keyboards/yandrstudio/boyPad/keymaps/via/keymap.c new file mode 100644 index 000000000000..e51e28ff80e6 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/keymaps/via/keymap.c @@ -0,0 +1,47 @@ +/* Copyright 2021 JasonRen(biu) + * + * 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] = { + LAYOUT( + KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_P7, KC_P8, KC_P9, + KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_P1, KC_P2, KC_P3, + KC_P0, KC_PDOT, KC_PENT + ), + LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), + LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ), + LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS + ) +}; diff --git a/keyboards/yandrstudio/boyPad/keymaps/via/rules.mk b/keyboards/yandrstudio/boyPad/keymaps/via/rules.mk new file mode 100644 index 000000000000..1e5b99807cb7 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/yandrstudio/boyPad/readme.md b/keyboards/yandrstudio/boyPad/readme.md new file mode 100644 index 000000000000..a4182c37216d --- /dev/null +++ b/keyboards/yandrstudio/boyPad/readme.md @@ -0,0 +1,15 @@ +boyPad +=== + +A 17 keys pad with rgb (underground). +This keyboard use 8mhz HSE and STM32F401 as MCU. + +Keyboard Maintainer: https://github.com/jiaxin96 +Hardware Supported: boyPad +Hardware Availability: https://github.com/Oh-My-Mechanical-Keyboard + +Make example for this keyboard (after setting up your build environment): + + make yandrstudio/boyPad/f401:via + +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. diff --git a/keyboards/yandrstudio/boyPad/rules.mk b/keyboards/yandrstudio/boyPad/rules.mk new file mode 100644 index 000000000000..053f64f38aed --- /dev/null +++ b/keyboards/yandrstudio/boyPad/rules.mk @@ -0,0 +1,14 @@ +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration +KEYBOARD_SHARED_EP = yes # Free up some extra endpoints - needed if console+mouse+extra +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover + diff --git a/keyboards/yandrstudio/boyPad/via-info.json b/keyboards/yandrstudio/boyPad/via-info.json new file mode 100644 index 000000000000..5ebf3f6b51e7 --- /dev/null +++ b/keyboards/yandrstudio/boyPad/via-info.json @@ -0,0 +1,47 @@ +{ + "name": "BoyPad_Y&R", + "vendorId": "0xAA96", + "productId": "0xAAAC", + "lighting": "qmk_rgblight", + "matrix": { "rows": 5, "cols": 4 }, + "layouts": { + "keymap": [ + [ + "0,0", + "0,1", + "0,2", + "0,3" + ], + [ + "1,0", + "1,1", + "1,2", + { + "h": 2 + }, + "2,3" + ], + [ + "2,0", + "2,1", + "2,2" + ], + [ + "3,0", + "3,1", + "3,2", + { + "h": 2 + }, + "4,3" + ], + [ + { + "w": 2 + }, + "4,1", + "4,2" + ] + ] + } +} diff --git a/keyboards/yandrstudio/readme.md b/keyboards/yandrstudio/readme.md new file mode 100644 index 000000000000..57dc2146d0ec --- /dev/null +++ b/keyboards/yandrstudio/readme.md @@ -0,0 +1,45 @@ +# Keyboard Firmware of Y&R Studio + +## Studio overview + +A creative coder. + +> Jason Ren (Biu) + +## Keyboard Firmware and Utils + +### Keyboard Released by Y&R Studio Itself +| NAME | VENDOR_ID | PRODUCT_ID | FEATURES | COMMERCIALIZATION | +| ------------- | --------- | ---------- | ------------------------------------- | ----------------- | +| rainbow65 | 0xAA96 | 0xAA00 | OLED, RGB, ENCODER | ✓ | +| cool87 | 0xAA96 | 0xAA01 | 32u4 | ✗ | +| sb65p | 0xAA96 | 0xAA02 | 2.4G Split Keyboard | ✗ | +| r65ble | 0xAA96 | 0xAA03 | BLE 5.0 Dual mod version of rainbow65 | ✗ | +| whiteMouse28T | 0xAA96 | 0xAA04 | External EEPROM (95256), For Test | ✗ | +| m60ble | 0xAA96 | 0xAA05 | BLE 5.0 Dual mode, RGB | ? | + + + +### Keyboard Completed with Y&R Studio Participation +| NAME | VENDOR_ID | PRODUCT_ID | FEATURES | COMMERCIALIZATION | +| ------------ | --------- | ---------- | ------------------------- | ----------------- | +| nlhhkb | 0xAA96 | 0xAAA0 | 32u4 | ? | +| tdcq68 | 0xAA96 | 0xAAA1 | F401, RGB | ✗ | +| tdcq64_2s | 0xAA96 | 0xAAA2 | F401, RGB | ✗ | +| yp980ble | 0xAA96 | 0xAAA3 | BLE 5.0 Dual mode | ? | +| whiteMouse69 | 0xAA96 | 0xAAA4 | F401, RGB | ✓ | +| WS69v2 | 0xAA96 | 0xAAA5 | F103, RGB | ✓ | +| M69 | 0xAA96 | 0xAAA6 | F401,80%, RGB | ✓ | +| zhou75 | 0xAA96 | 0xAAA7 | F401, ENCODER | ✓ | +| yp87ble | 0xAA96 | 0xAAA8 | BLE 5.0 Dual mode | ? | +| hotdox76V2 | 0xAA96 | 0xAAA9 | 32u4, Split KB, OLED, RGB | ✓ | +| Eureka75 | 0xAA96 | 0xAAAA | F401,ENCODER | ✓ | +| boy40ble | 0xAA96 | 0xAAAB | BLE 5.0 Dual mode | ✗ | +| boyPad | 0xAA96 | 0xAAAC | F401 | ✗ | + +### Keyboard Tools Developed by Y&R Studio + +- RGB matrix calculation script +- Sound visualization script +- Real time key remap software + diff --git a/keyboards/yandrstudio/utils/RGB/getRgbMtrixPosition.js b/keyboards/yandrstudio/utils/RGB/getRgbMtrixPosition.js index 2e9be4992259..db755a29c50e 100755 --- a/keyboards/yandrstudio/utils/RGB/getRgbMtrixPosition.js +++ b/keyboards/yandrstudio/utils/RGB/getRgbMtrixPosition.js @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -cal_z_rgb = function gen_rgb_matrix_2(rownum, colnum) { +cal_z_rgb = function gen_rgb_matrix_1(rownum, colnum) { function get_x(col, colnum){ var x = 224 / (colnum - 1) * col; return Math.round(x); @@ -86,7 +86,7 @@ cal_u_rgb = function gen_rgb_matrix_2(rownum, colnum, reverse) { } -cal_u_rgb_sb_l = function gen_rgb_matrix_2(rownum, colnum, reverse) { +cal_u_rgb_sb_l = function gen_rgb_matrix_3(rownum, colnum, reverse) { function get_x(col, colnum){ var x = 224 / (colnum - 1) * col; return Math.round(x); @@ -129,7 +129,7 @@ cal_u_rgb_sb_l = function gen_rgb_matrix_2(rownum, colnum, reverse) { return gen_rgb_matrix_text } -cal_u_rgb_sb_r = function gen_rgb_matrix_2(rownum, colnum, reverse) { +cal_u_rgb_sb_r = function gen_rgb_matrix_4(rownum, colnum, reverse) { function get_x(col, colnum){ var x = 224 / (colnum - 1) * col; return Math.round(x); @@ -174,7 +174,7 @@ cal_u_rgb_sb_r = function gen_rgb_matrix_2(rownum, colnum, reverse) { -cal_a_row_rgb = function gen_rgb_matrix_2(row, rownum, colnum, reverse) { +cal_a_row_rgb = function gen_rgb_matrix_5(row, rownum, colnum, reverse) { function get_x(col, colnum){ var x = 224 / (colnum - 1) * col; return Math.round(x); diff --git a/keyboards/yandrstudio/yp980ble/info-via.json b/keyboards/yandrstudio/yp980ble/info-via.json index 4de88e849786..56dc8c17d64a 100644 --- a/keyboards/yandrstudio/yp980ble/info-via.json +++ b/keyboards/yandrstudio/yp980ble/info-via.json @@ -1,7 +1,7 @@ { "name": "TDCQ68_Y&R", "vendorId": "0xAA96", - "productId": "0xAAA1", + "productId": "0xAAA3", "lighting": { "extends": "none", "keycodes": "qmk"