mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-12-24 23:09:26 -05:00
added sys locks to time critical lcd updates (#1737)
This commit is contained in:
parent
9d7e06c255
commit
ec0f45a488
@ -191,6 +191,7 @@ class IO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t io_read() {
|
uint32_t io_read() {
|
||||||
|
chSysLock(); // Dont interrupt time critical tasks
|
||||||
io_stb_assert();
|
io_stb_assert();
|
||||||
dir_read();
|
dir_read();
|
||||||
addr_0();
|
addr_0();
|
||||||
@ -199,6 +200,7 @@ class IO {
|
|||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
const auto switches_raw = data_read();
|
const auto switches_raw = data_read();
|
||||||
io_stb_deassert();
|
io_stb_deassert();
|
||||||
|
chSysUnlock();
|
||||||
|
|
||||||
return switches_raw;
|
return switches_raw;
|
||||||
}
|
}
|
||||||
@ -297,6 +299,7 @@ class IO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void lcd_command(const uint32_t value) {
|
void lcd_command(const uint32_t value) {
|
||||||
|
chSysLock(); // Dont interrupt time critical tasks
|
||||||
data_write_high(0); /* Drive high byte (with zero -- don't care) */
|
data_write_high(0); /* Drive high byte (with zero -- don't care) */
|
||||||
dir_write(); /* Turn around data bus, MCU->CPLD */
|
dir_write(); /* Turn around data bus, MCU->CPLD */
|
||||||
addr(0); /* Indicate command */
|
addr(0); /* Indicate command */
|
||||||
@ -312,9 +315,11 @@ class IO {
|
|||||||
lcd_wr_deassert(); /* Complete write operation */
|
lcd_wr_deassert(); /* Complete write operation */
|
||||||
|
|
||||||
addr(1); /* Set up for data phase (most likely after a command) */
|
addr(1); /* Set up for data phase (most likely after a command) */
|
||||||
|
chSysUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcd_write_data(const uint32_t value) __attribute__((always_inline)) {
|
void lcd_write_data(const uint32_t value) __attribute__((always_inline)) {
|
||||||
|
chSysLock(); // Dont interrupt time critical tasks
|
||||||
// NOTE: Assumes and DIR=0 and ADDR=1 from command phase.
|
// NOTE: Assumes and DIR=0 and ADDR=1 from command phase.
|
||||||
data_write_high(value); /* Drive high byte */
|
data_write_high(value); /* Drive high byte */
|
||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
@ -325,9 +330,11 @@ class IO {
|
|||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
lcd_wr_deassert(); /* Complete write operation */
|
lcd_wr_deassert(); /* Complete write operation */
|
||||||
|
chSysUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t lcd_read_data() {
|
uint32_t lcd_read_data() {
|
||||||
|
chSysLock(); // Dont interrupt time critical tasks
|
||||||
// NOTE: Assumes ADDR=1 from command phase.
|
// NOTE: Assumes ADDR=1 from command phase.
|
||||||
dir_read();
|
dir_read();
|
||||||
|
|
||||||
@ -345,10 +352,12 @@ class IO {
|
|||||||
halPolledDelay(18); // 90ns
|
halPolledDelay(18); // 90ns
|
||||||
|
|
||||||
const auto value_low = data_read();
|
const auto value_low = data_read();
|
||||||
|
chSysUnlock();
|
||||||
return (value_high << 8) | value_low;
|
return (value_high << 8) | value_low;
|
||||||
}
|
}
|
||||||
|
|
||||||
void io_write(const bool address, const uint_fast16_t value) {
|
void io_write(const bool address, const uint_fast16_t value) {
|
||||||
|
chSysLock(); // Dont interrupt time critical tasks
|
||||||
data_write_low(value);
|
data_write_low(value);
|
||||||
dir_write();
|
dir_write();
|
||||||
addr(address);
|
addr(address);
|
||||||
@ -360,6 +369,7 @@ class IO {
|
|||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
__asm__("nop");
|
__asm__("nop");
|
||||||
io_stb_deassert();
|
io_stb_deassert();
|
||||||
|
chSysUnlock();
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
void lcd_data_write_command_and_data(
|
void lcd_data_write_command_and_data(
|
||||||
|
Loading…
Reference in New Issue
Block a user