aboutsummaryrefslogtreecommitdiff
path: root/keyboards/cannonkeys
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2021-04-19 13:08:01 +1000
committerGitHub <noreply@github.com>2021-04-19 13:08:01 +1000
commita0089aa34519ec4fcf7cee6a352424e4b7cba7da (patch)
treecf33fef21d6302e72da5c5cff3d9d42d106634da /keyboards/cannonkeys
parenteb7e668eb908de9d41ab9d088effb8adedf520b5 (diff)
downloadqmk_firmware-a0089aa34519ec4fcf7cee6a352424e4b7cba7da.tar.gz
qmk_firmware-a0089aa34519ec4fcf7cee6a352424e4b7cba7da.zip
Fixup Satisfaction75 bootprocess. (#12621)
- Use normal ChibiOS I2C driver. - Move drawing code to housekeeping -- previously it was during matrix scan, which gets executed during bootmagic checks. However, bootmagic is invoked before QWIIC subsystem is enabled, which means I2C isn't configured yet. All I2C calls to the OLED fail with timeouts while bootmagic is being checked. Housekeeping ensures this is executed once the system has initialised and settled. - QWIIC OLED driver: properly clear out OLED buffer when clearing screen.
Diffstat (limited to 'keyboards/cannonkeys')
-rw-r--r--keyboards/cannonkeys/satisfaction75/config.h12
-rw-r--r--keyboards/cannonkeys/satisfaction75/i2c_master.c124
-rw-r--r--keyboards/cannonkeys/satisfaction75/satisfaction75.c2
3 files changed, 13 insertions, 125 deletions
diff --git a/keyboards/cannonkeys/satisfaction75/config.h b/keyboards/cannonkeys/satisfaction75/config.h
index dfb624a0d..e100cc99b 100644
--- a/keyboards/cannonkeys/satisfaction75/config.h
+++ b/keyboards/cannonkeys/satisfaction75/config.h
@@ -51,6 +51,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
51/* define if matrix has ghost */ 51/* define if matrix has ghost */
52//#define MATRIX_HAS_GHOST 52//#define MATRIX_HAS_GHOST
53 53
54// I2C config
55#define I2C_DRIVER I2CD1
56#define I2C1_SCL_BANK GPIOB
57#define I2C1_SCL 6
58#define I2C1_SDA 7
59#define I2C1_SCL_PAL_MODE 1
60#define I2C1_SDA_PAL_MODE 1
61#define I2C1_TIMINGR_PRESC 0x00U
62#define I2C1_TIMINGR_SCLDEL 0x03U
63#define I2C1_TIMINGR_SDADEL 0x01U
64#define I2C1_TIMINGR_SCLH 0x03U
65#define I2C1_TIMINGR_SCLL 0x09U
54 66
55/* Set 0 if debouncing isn't needed */ 67/* Set 0 if debouncing isn't needed */
56#define DEBOUNCE 5 68#define DEBOUNCE 5
diff --git a/keyboards/cannonkeys/satisfaction75/i2c_master.c b/keyboards/cannonkeys/satisfaction75/i2c_master.c
deleted file mode 100644
index d87f7668d..000000000
--- a/keyboards/cannonkeys/satisfaction75/i2c_master.c
+++ /dev/null
@@ -1,124 +0,0 @@
1/* Copyright 2018 Jack Humbert
2 * Copyright 2018 Yiancar
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* This library is only valid for STM32 processors.
19 * This library follows the convention of the AVR i2c_master library.
20 * As a result addresses are expected to be already shifted (addr << 1).
21 * I2CD1 is the default driver which corresponds to pins B6 and B7. This
22 * can be changed.
23 * Please ensure that HAL_USE_I2C is TRUE in the halconf.h file and that
24 * STM32_I2C_USE_I2C1 is TRUE in the mcuconf.h file. Pins B6 and B7 are used
25 * but using any other I2C pins should be trivial.
26 */
27
28#include "i2c_master.h"
29#include "quantum.h"
30#include <string.h>
31#include <hal.h>
32
33static uint8_t i2c_address;
34
35// This configures the I2C clock to 400khz assuming a 48Mhz clock
36// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
37static const I2CConfig i2cconfig = {
38 STM32_TIMINGR_PRESC(0x00U) |
39 STM32_TIMINGR_SCLDEL(0x03U) | STM32_TIMINGR_SDADEL(0x01U) |
40 STM32_TIMINGR_SCLH(0x03U) | STM32_TIMINGR_SCLL(0x09U),
41 0,
42 0
43};
44
45static i2c_status_t chibios_to_qmk(const msg_t status) {
46 switch (status) {
47 case I2C_NO_ERROR:
48 return I2C_STATUS_SUCCESS;
49 case I2C_TIMEOUT:
50 return I2C_STATUS_TIMEOUT;
51 // I2C_BUS_ERROR, I2C_ARBITRATION_LOST, I2C_ACK_FAILURE, I2C_OVERRUN, I2C_PEC_ERROR, I2C_SMB_ALERT
52 default:
53 return I2C_STATUS_ERROR;
54 }
55}
56
57__attribute__ ((weak))
58void i2c_init(void)
59{
60 // Try releasing special pins for a short time
61 palSetPadMode(GPIOB, 6, PAL_MODE_INPUT);
62 palSetPadMode(GPIOB, 7, PAL_MODE_INPUT);
63
64 chThdSleepMilliseconds(10);
65
66 palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
67 palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN);
68
69 //i2cInit(); //This is invoked by halInit() so no need to redo it.
70}
71
72i2c_status_t i2c_start(uint8_t address)
73{
74 i2c_address = address;
75 i2cStart(&I2C_DRIVER, &i2cconfig);
76 return I2C_STATUS_SUCCESS;
77}
78
79i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout)
80{
81 i2c_address = address;
82 i2cStart(&I2C_DRIVER, &i2cconfig);
83 i2cAcquireBus(&I2C_DRIVER);
84 msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, 0, 0, TIME_MS2I(timeout));
85 i2cReleaseBus(&I2C_DRIVER);
86 return chibios_to_qmk(status);
87}
88
89i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
90{
91 i2c_address = address;
92 i2cStart(&I2C_DRIVER, &i2cconfig);
93 msg_t status = i2cMasterReceiveTimeout(&I2C_DRIVER, (i2c_address >> 1), data, length, TIME_MS2I(timeout));
94 return chibios_to_qmk(status);
95}
96
97i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout)
98{
99 i2c_address = devaddr;
100 i2cStart(&I2C_DRIVER, &i2cconfig);
101
102 uint8_t complete_packet[length + 1];
103 for(uint8_t i = 0; i < length; i++)
104 {
105 complete_packet[i+1] = data[i];
106 }
107 complete_packet[0] = regaddr;
108
109 msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), complete_packet, length + 1, 0, 0, TIME_MS2I(timeout));
110 return chibios_to_qmk(status);
111}
112
113i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
114{
115 i2c_address = devaddr;
116 i2cStart(&I2C_DRIVER, &i2cconfig);
117 msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), &regaddr, 1, data, length, TIME_MS2I(timeout));
118 return chibios_to_qmk(status);
119}
120
121void i2c_stop(void)
122{
123 i2cStop(&I2C_DRIVER);
124}
diff --git a/keyboards/cannonkeys/satisfaction75/satisfaction75.c b/keyboards/cannonkeys/satisfaction75/satisfaction75.c
index fd85b8230..47c9a9d50 100644
--- a/keyboards/cannonkeys/satisfaction75/satisfaction75.c
+++ b/keyboards/cannonkeys/satisfaction75/satisfaction75.c
@@ -380,7 +380,7 @@ void matrix_init_kb(void)
380} 380}
381 381
382 382
383void matrix_scan_kb(void) { 383void housekeeping_task_kb(void) {
384 rtcGetTime(&RTCD1, &last_timespec); 384 rtcGetTime(&RTCD1, &last_timespec);
385 uint16_t minutes_since_midnight = last_timespec.millisecond / 1000 / 60; 385 uint16_t minutes_since_midnight = last_timespec.millisecond / 1000 / 60;
386 386