Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2020 November 28 Breaking Changes Update #11053

Merged
merged 79 commits into from
Nov 28, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
47fff74
Branch point for 2020 November 28 Breaking Change
noroadsleft Aug 29, 2020
53ad78b
Remove matrix_col_t to allow MATRIX_ROWS > 32 (#10183)
sigprof Aug 31, 2020
73d2075
Add support for soft serial to ATmega32U2 (#10204)
takai Sep 2, 2020
bf84d35
Change MIDI velocity implementation to allow direct control of veloci…
jakobkg Sep 20, 2020
b1b7696
Add ability to build a subset of all keyboards based on platform.
tzarc Sep 24, 2020
2f2432f
Actually use eeprom_driver_init().
tzarc Sep 25, 2020
9664723
Make bootloader_jump weak for ChibiOS. (#10417)
tzarc Sep 26, 2020
f728c24
Joystick 16-bit support (#10439)
seb-pau Oct 3, 2020
310662f
Per-encoder resolutions (#10259)
fauxpark Oct 3, 2020
eecedf0
Share button state from mousekey to pointing_device (#10179)
manna-harbour Oct 3, 2020
b1a6b16
Add hotfix for chibios keyboards not wake (#10088)
LSChyi Oct 3, 2020
08caa7a
Add advanced/efficient RGB Matrix Indicators (#8564)
drashna Oct 4, 2020
46869dd
Naming change.
tzarc Oct 4, 2020
53f2b5b
Support for STM32 GPIOF,G,H,I,J,K (#10206)
tzarc Oct 5, 2020
fa6bd5c
Add milc as a dependency and remove the installed milc (#10563)
skullydazed Oct 8, 2020
46d7b25
ChibiOS upgrade: early init conversions (#10214)
tzarc Oct 11, 2020
2e1232c
ChibiOS upgrade: configuration file migrator (#9952)
tzarc Oct 14, 2020
c904520
Haptic and solenoid cleanup (#9700)
purdeaandrei Oct 17, 2020
94fea35
XD75 cleanup (#10524)
fauxpark Oct 17, 2020
12be012
OLED display update interval support (#10388)
mtei Oct 19, 2020
c1295a3
Add definition based on currently-selected serial driver. (#10716)
tzarc Oct 22, 2020
daea43d
New feature: Retro Tapping per key (#10622)
ridingqwerty Oct 23, 2020
de4cbe3
Allow for modification of output RGB values when using rgblight/rgb_m…
tzarc Oct 23, 2020
c4ecae1
Add housekeeping task callbacks so that keyboards/keymaps are capable…
tzarc Oct 23, 2020
f22a61e
Rescale both ChibiOS and AVR backlighting.
tzarc Sep 7, 2020
3ede17e
Reduce Helix keyboard build variation (#8669)
MakotoKurauchi Oct 25, 2020
69d8bbf
Minor change to behavior allowing display updates to continue between…
XScorpion2 Oct 26, 2020
75a18e6
Some GPIO manipulations in matrix.c change to atomic. (#10491)
mtei Oct 26, 2020
991c750
qmk cformat (#10767)
tzarc Oct 26, 2020
c3221d4
[Keyboard] Update the Speedo firmware for v3.0 (#10657)
pcewing Oct 29, 2020
b968a53
Maartenwut/Maarten namechange to evyd13/Evy (#10274)
evyd13 Nov 1, 2020
4cdd300
[quantum] combine repeated lines of code (#10837)
myst729 Nov 2, 2020
38527f9
Add step sequencer feature (#9703)
rbelouin Nov 8, 2020
7d836cb
aeboards/ext65 refactor (#10820)
Xelus22 Nov 9, 2020
2098d98
Refactor xelus/dawn60 for Rev2 later (#10584)
Xelus22 Nov 9, 2020
28d6b9d
add DEBUG_MATRIX_SCAN_RATE_ENABLE to common_features.mk (#10824)
mtei Nov 10, 2020
3dcb046
[Core] Added `add_oneshot_mods` & `del_oneshot_mods` (#10549)
precondition Nov 10, 2020
55e2a42
update chibios os usb for the otg driver (#8893)
yulei Nov 10, 2020
e3a2407
Remove HD44780 References, Part 4 (#10735)
noroadsleft Nov 15, 2020
0bfec7b
[Keyboard] Add Valor FRL TKL (+refactor) (#10512)
Xelus22 Nov 15, 2020
f7ae095
Fix cursor position bug in oled_write_raw functions (#10800)
daveallie Nov 15, 2020
4ef4965
Fixup version.h writing when using SKIP_VERSION=yes (#10972)
tzarc Nov 18, 2020
f63e3e1
Allow for certain code in the codebase assuming length of string. (#1…
tzarc Nov 18, 2020
9e32e9b
Add AT90USB support for serial.c (#10706)
drashna Nov 19, 2020
ac3b7d7
Merge remote-tracking branch 'origin/master' into develop
skullydazed Nov 22, 2020
866f853
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 22, 2020
7d0c713
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 22, 2020
ddf1ade
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 22, 2020
b6bb2b8
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 23, 2020
50b4512
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 23, 2020
2b97c20
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 24, 2020
49b3aaf
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 24, 2020
f250c01
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 24, 2020
745e687
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
cc63130
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
a69d684
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
b839674
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
71a49df
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
537291a
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
37a2387
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
1180213
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
d2f965b
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
2d1a29b
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
b14e131
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
4b4fe1b
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
675caef
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
2076d1c
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 25, 2020
9e9b979
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 26, 2020
3a3571c
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 26, 2020
1528359
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 26, 2020
63a06fe
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 26, 2020
fd8f659
Auto shift: support repeats and early registration (#9826)
p00ya Nov 27, 2020
c9e2690
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 27, 2020
29e814e
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 28, 2020
8fc8a94
Merge remote-tracking branch 'origin/master' into develop
qmk-bot Nov 28, 2020
6b3e56b
Rename ledmatrix.h to match .c file (#7949)
fauxpark Nov 28, 2020
2e64269
Split RGB_MATRIX_ENABLE into _ENABLE and _DRIVER (#10231)
fauxpark Nov 28, 2020
7baa37c
Split LED_MATRIX_ENABLE into _ENABLE and _DRIVER (#10840)
fauxpark Nov 28, 2020
9b851ea
Merge point for 2020 Nov 28 Breaking Change
noroadsleft Nov 26, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Some GPIO manipulations in matrix.c change to atomic. (#10491)
* Changed the processing of select_xxx()/unselect_xxx() in quantum/matrix.c to be atomic.

* Changed the processing of select_xxx()/unselect_xxx() in quantum/split_common/matrix.c to be atomic.

* update matrix.c

* add ATOMIC_BLOCK_FORCEON macro to quantum/quantum_atomic_extend.h

* quantum_atomic_extend.h's contents move into quantum.h

* update ATOMIC_BLOCK_xxx for unknown platform

* ATOMIC_BLOCK macro support PROTOCOL_ARM_ATSAM

* Add Atomic Operation section in docs/internals_gpio_control.md
  • Loading branch information
mtei authored and noroadsleft committed Oct 30, 2020
commit 75a18e69f9d3b6dfa470d0a7dbd78408d6a1c496
19 changes: 19 additions & 0 deletions docs/internals_gpio_control.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,22 @@ The following functions can provide basic control of GPIOs and are found in `qua
## Advanced Settings :id=advanced-settings

Each microcontroller can have multiple advanced settings regarding its GPIO. This abstraction layer does not limit the use of architecture-specific functions. Advanced users should consult the datasheet of their desired device and include any needed libraries. For AVR, the standard avr/io.h library is used; for STM32, the ChibiOS [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.

## Atomic Operation

The above functions are not always guaranteed to work atomically. Therefore, if you want to prevent interruptions in the middle of operations when using multiple combinations of the above functions, use the following `ATOMIC_BLOCK_FORCEON` macro.

eg.
```c
void some_function() {
// some process
ATOMIC_BLOCK_FORCEON {
// Atomic Processing
}
// some process
}
```

`ATOMIC_BLOCK_FORCEON` forces interrupts to be disabled before the block is executed, without regard to whether they are enabled or disabled. Then, after the block is executed, the interrupt is enabled.

Note that `ATOMIC_BLOCK_FORCEON` can therefore be used if you know that interrupts are enabled before the execution of the block, or if you know that it is OK to enable interrupts at the completion of the block.
35 changes: 25 additions & 10 deletions quantum/matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,19 @@ static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
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
Expand Down Expand Up @@ -70,22 +83,23 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# if (DIODE_DIRECTION == COL2ROW)

static void select_row(uint8_t row) {
setPinOutput(row_pins[row]);
writePinLow(row_pins[row]);
setPinOutput_writeLow(row_pins[row]);
}

static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
static void unselect_row(uint8_t row) {
setPinInputHigh_atomic(row_pins[row]);
}

static void unselect_rows(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
setPinInputHigh_atomic(row_pins[x]);
}
}

static void init_pins(void) {
unselect_rows();
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
setPinInputHigh_atomic(col_pins[x]);
}
}

Expand Down Expand Up @@ -120,22 +134,23 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# elif (DIODE_DIRECTION == ROW2COL)

static void select_col(uint8_t col) {
setPinOutput(col_pins[col]);
writePinLow(col_pins[col]);
setPinOutput_writeLow(col_pins[col]);
}

static void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); }
static void unselect_col(uint8_t col) {
setPinInputHigh_atomic(col_pins[col]);
}

static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
setPinInputHigh_atomic(col_pins[x]);
}
}

static void init_pins(void) {
unselect_cols();
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
setPinInputHigh_atomic(row_pins[x]);
}
}

Expand Down
55 changes: 55 additions & 0 deletions quantum/quantum.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,61 @@ typedef ioline_t pin_t;
# define togglePin(pin) palToggleLine(pin)
#endif

// Atomic macro to help make GPIO and other controls atomic.
#ifdef IGNORE_ATOMIC_BLOCK
/* do nothing atomic macro */
# define ATOMIC_BLOCK for (uint8_t __ToDo = 1; __ToDo; __ToDo = 0)
# define ATOMIC_BLOCK_RESTORESTATE ATOMIC_BLOCK
# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK

#elif defined(__AVR__)
/* atomic macro for AVR */
# include <util/atomic.h>

# define ATOMIC_BLOCK_RESTORESTATE ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK(ATOMIC_FORCEON)

#elif defined(PROTOCOL_CHIBIOS) || defined(PROTOCOL_ARM_ATSAM)
/* atomic macro for ChibiOS / ARM ATSAM */
# if defined(PROTOCOL_ARM_ATSAM)
# include "arm_atsam_protocol.h"
# endif

static __inline__ uint8_t __interrupt_disable__(void) {
# if defined(PROTOCOL_CHIBIOS)
chSysLock();
# endif
# if defined(PROTOCOL_ARM_ATSAM)
__disable_irq();
# endif
return 1;
}

static __inline__ void __interrupt_enable__(const uint8_t *__s) {
# if defined(PROTOCOL_CHIBIOS)
chSysUnlock();
# endif
# if defined(PROTOCOL_ARM_ATSAM)
__enable_irq();
# endif
__asm__ volatile("" ::: "memory");
(void)__s;
}

# define ATOMIC_BLOCK(type) for (type, __ToDo = __interrupt_disable__(); __ToDo; __ToDo = 0)
# define ATOMIC_FORCEON uint8_t sreg_save __attribute__((__cleanup__(__interrupt_enable__))) = 0

# define ATOMIC_BLOCK_RESTORESTATE _Static_assert(0, "ATOMIC_BLOCK_RESTORESTATE dose not implement")
# define ATOMIC_BLOCK_FORCEON ATOMIC_BLOCK(ATOMIC_FORCEON)

/* Other platform */
#else

# define ATOMIC_BLOCK_RESTORESTATE _Static_assert(0, "ATOMIC_BLOCK_RESTORESTATE dose not implement")
# define ATOMIC_BLOCK_FORCEON _Static_assert(0, "ATOMIC_BLOCK_FORCEON dose not implement")

#endif

#define SEND_STRING(string) send_string_P(PSTR(string))
#define SEND_STRING_DELAY(string, interval) send_string_with_delay_P(PSTR(string), interval)

Expand Down
35 changes: 25 additions & 10 deletions quantum/split_common/matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@ uint8_t thisHand, thatHand;
// user-defined overridable functions
__attribute__((weak)) void matrix_slave_scan_user(void) {}

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
Expand Down Expand Up @@ -83,22 +96,23 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# if (DIODE_DIRECTION == COL2ROW)

static void select_row(uint8_t row) {
setPinOutput(row_pins[row]);
writePinLow(row_pins[row]);
setPinOutput_writeLow(row_pins[row]);
}

static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
static void unselect_row(uint8_t row) {
setPinInputHigh_atomic(row_pins[row]);
}

static void unselect_rows(void) {
for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
setPinInputHigh(row_pins[x]);
setPinInputHigh_atomic(row_pins[x]);
}
}

static void init_pins(void) {
unselect_rows();
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
setPinInputHigh_atomic(col_pins[x]);
}
}

Expand Down Expand Up @@ -133,22 +147,23 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
# elif (DIODE_DIRECTION == ROW2COL)

static void select_col(uint8_t col) {
setPinOutput(col_pins[col]);
writePinLow(col_pins[col]);
setPinOutput_writeLow(col_pins[col]);
}

static void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); }
static void unselect_col(uint8_t col) {
setPinInputHigh_atomic(col_pins[col]);
}

static void unselect_cols(void) {
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
setPinInputHigh_atomic(col_pins[x]);
}
}

static void init_pins(void) {
unselect_cols();
for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
setPinInputHigh(row_pins[x]);
setPinInputHigh_atomic(row_pins[x]);
}
}

Expand Down