mirror of
https://github.com/eried/portapack-mayhem.git
synced 2025-07-30 18:19:08 -04:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
c2a9ed7d9b
46 changed files with 13951 additions and 12343 deletions
|
@ -117,6 +117,7 @@ set(CPPSRC
|
|||
${COMMON}/message_queue.cpp
|
||||
${COMMON}/hackrf_hal.cpp
|
||||
portapack.cpp
|
||||
${COMMON}/backlight.cpp
|
||||
${COMMON}/portapack_shared_memory.cpp
|
||||
baseband_api.cpp
|
||||
${COMMON}/portapack_persistent_memory.cpp
|
||||
|
|
|
@ -125,11 +125,12 @@ void EventDispatcher::set_display_sleep(const bool sleep) {
|
|||
// TODO: Distribute display sleep message more broadly, shut down data generation
|
||||
// on baseband side, since all that data is being discarded during sleep.
|
||||
if( sleep ) {
|
||||
portapack::io.lcd_backlight(false);
|
||||
portapack::backlight()->off();
|
||||
portapack::display.sleep();
|
||||
} else {
|
||||
portapack::display.wake();
|
||||
portapack::io.lcd_backlight(true);
|
||||
// Don't turn on backlight here.
|
||||
// Let frame sync handler turn on backlight after repaint.
|
||||
}
|
||||
EventDispatcher::display_sleep = sleep;
|
||||
};
|
||||
|
@ -284,6 +285,8 @@ void EventDispatcher::handle_lcd_frame_sync() {
|
|||
DisplayFrameSyncMessage message;
|
||||
message_map.send(&message);
|
||||
painter.paint_widget_tree(top_widget);
|
||||
|
||||
portapack::backlight()->on();
|
||||
}
|
||||
|
||||
void EventDispatcher::handle_switches() {
|
||||
|
|
|
@ -38,9 +38,13 @@
|
|||
|
||||
#include <cstdint>
|
||||
|
||||
constexpr auto EVT_MASK_RTC_TICK = EVENT_MASK(0);
|
||||
constexpr auto EVT_MASK_LCD_FRAME_SYNC = EVENT_MASK(1);
|
||||
constexpr auto EVT_MASK_SWITCHES = EVENT_MASK(3);
|
||||
constexpr auto EVT_MASK_ENCODER = EVENT_MASK(4);
|
||||
constexpr auto EVT_MASK_TOUCH = EVENT_MASK(5);
|
||||
constexpr auto EVT_MASK_APPLICATION = EVENT_MASK(6);
|
||||
constexpr auto EVT_MASK_LOCAL = EVENT_MASK(7);
|
||||
|
||||
class EventDispatcher {
|
||||
public:
|
||||
|
@ -65,14 +69,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static inline void event_isr_rtc_tick() {
|
||||
events_flag_isr(EVT_MASK_RTC_TICK);
|
||||
}
|
||||
|
||||
static inline void event_isr_lcd_frame_sync() {
|
||||
events_flag_isr(EVT_MASK_LCD_FRAME_SYNC);
|
||||
}
|
||||
|
||||
static inline void events_flag(const eventmask_t events) {
|
||||
if( thread_event_loop ) {
|
||||
chEvtSignal(thread_event_loop, events);
|
||||
|
@ -92,11 +88,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
static constexpr auto EVT_MASK_RTC_TICK = EVENT_MASK(0);
|
||||
static constexpr auto EVT_MASK_LCD_FRAME_SYNC = EVENT_MASK(1);
|
||||
static constexpr auto EVT_MASK_APPLICATION = EVENT_MASK(6);
|
||||
static constexpr auto EVT_MASK_LOCAL = EVENT_MASK(7);
|
||||
|
||||
static Thread* thread_event_loop;
|
||||
|
||||
touch::Manager touch_manager { };
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
#include "hackrf_hal.hpp"
|
||||
using namespace hackrf::one;
|
||||
|
||||
static Thread* thread_controls_event = NULL;
|
||||
|
||||
static std::array<Debounce, 7> switch_debounce;
|
||||
|
||||
static Encoder encoder;
|
||||
|
@ -156,7 +158,7 @@ void timer0_callback(GPTDriver* const) {
|
|||
/* Signal event loop */
|
||||
if( event_mask ) {
|
||||
chSysLockFromIsr();
|
||||
EventDispatcher::events_flag_isr(event_mask);
|
||||
chEvtSignalI(thread_controls_event, event_mask);
|
||||
chSysUnlockFromIsr();
|
||||
}
|
||||
}
|
||||
|
@ -176,6 +178,8 @@ static GPTConfig timer0_config {
|
|||
};
|
||||
|
||||
void controls_init() {
|
||||
thread_controls_event = chThdSelf();
|
||||
|
||||
touch::adc::start();
|
||||
|
||||
/* GPT timer 0 is used to scan user interface controls -- touch screen,
|
||||
|
|
|
@ -28,7 +28,10 @@
|
|||
|
||||
#include "portapack_hal.hpp"
|
||||
|
||||
static Thread* thread_lcd_frame_event = NULL;
|
||||
|
||||
static void pin_int4_interrupt_enable() {
|
||||
thread_lcd_frame_event = chThdSelf();
|
||||
nvicEnableVector(PIN_INT4_IRQn, CORTEX_PRIORITY_MASK(LPC43XX_PIN_INT4_IRQ_PRIORITY));
|
||||
}
|
||||
|
||||
|
@ -54,7 +57,7 @@ CH_IRQ_HANDLER(PIN_INT4_IRQHandler) {
|
|||
CH_IRQ_PROLOGUE();
|
||||
|
||||
chSysLockFromIsr();
|
||||
EventDispatcher::event_isr_lcd_frame_sync();
|
||||
chEvtSignalI(thread_lcd_frame_event, EVT_MASK_LCD_FRAME_SYNC);
|
||||
chSysUnlockFromIsr();
|
||||
|
||||
LPC_GPIO_INT->IST = (1U << 4);
|
||||
|
|
|
@ -27,8 +27,11 @@
|
|||
using namespace lpc43xx;
|
||||
|
||||
#include "event_m0.hpp"
|
||||
|
||||
|
||||
static Thread* thread_rtc_event = NULL;
|
||||
|
||||
void rtc_interrupt_enable() {
|
||||
thread_rtc_event = chThdSelf();
|
||||
rtc::interrupt::enable_second_inc();
|
||||
nvicEnableVector(RTC_IRQn, CORTEX_PRIORITY_MASK(LPC_RTC_IRQ_PRIORITY));
|
||||
}
|
||||
|
@ -39,7 +42,7 @@ CH_IRQ_HANDLER(RTC_IRQHandler) {
|
|||
CH_IRQ_PROLOGUE();
|
||||
|
||||
chSysLockFromIsr();
|
||||
EventDispatcher::event_isr_rtc_tick();
|
||||
chEvtSignalI(thread_rtc_event, EVT_MASK_RTC_TICK);
|
||||
chSysUnlockFromIsr();
|
||||
|
||||
rtc::interrupt::clear_all();
|
||||
|
|
|
@ -38,13 +38,11 @@
|
|||
|
||||
|
||||
#define LPC43XX_I2C_USE_I2C0 TRUE
|
||||
#define LPC43XX_I2C_USE_I2C1 TRUE
|
||||
|
||||
/*
|
||||
* SPI driver system settings.
|
||||
*/
|
||||
|
||||
#define LPC_SPI_USE_SSP0 TRUE
|
||||
#define LPC_SPI_USE_SSP1 TRUE
|
||||
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ using namespace hackrf::one;
|
|||
|
||||
#include "clock_manager.hpp"
|
||||
|
||||
#include "backlight.hpp"
|
||||
#include "touch_adc.hpp"
|
||||
#include "audio.hpp"
|
||||
|
||||
|
@ -48,18 +49,20 @@ namespace portapack {
|
|||
|
||||
portapack::IO io {
|
||||
portapack::gpio_dir,
|
||||
portapack::gpio_lcd_rd,
|
||||
portapack::gpio_lcd_wr,
|
||||
portapack::gpio_lcd_rdx,
|
||||
portapack::gpio_lcd_wrx,
|
||||
portapack::gpio_io_stbx,
|
||||
portapack::gpio_addr,
|
||||
portapack::gpio_lcd_te,
|
||||
portapack::gpio_unused,
|
||||
};
|
||||
|
||||
portapack::BacklightCAT4004 backlight_cat4004;
|
||||
portapack::BacklightOnOff backlight_on_off;
|
||||
|
||||
lcd::ILI9341 display;
|
||||
|
||||
I2C i2c0(&I2CD0);
|
||||
SPI ssp0(&SPID1);
|
||||
SPI ssp1(&SPID2);
|
||||
|
||||
si5351::Si5351 clock_generator {
|
||||
|
@ -152,6 +155,65 @@ static const portapack::cpld::Config& portapack_cpld_config() {
|
|||
;
|
||||
}
|
||||
|
||||
Backlight* backlight() {
|
||||
return (portapack_model() == PortaPackModel::R2_20170522)
|
||||
? static_cast<portapack::Backlight*>(&backlight_cat4004)
|
||||
: static_cast<portapack::Backlight*>(&backlight_on_off);
|
||||
}
|
||||
|
||||
static void configure_unused_mcu_peripherals(const bool enabled) {
|
||||
/* Disabling these peripherals reduces "idle" (PortaPack at main
|
||||
* menu) current by 42mA.
|
||||
*/
|
||||
|
||||
/* Some surprising peripherals in use by PortaPack firmware:
|
||||
*
|
||||
* RITIMER: M0 SysTick substitute (because M0 has no SysTick)
|
||||
* TIMER3: M0 cycle/PCLK counter
|
||||
*/
|
||||
|
||||
const uint32_t clock_run_state = enabled ? 1 : 0;
|
||||
|
||||
LPC_CCU1->CLK_APB3_I2C1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_APB3_DAC_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_APB3_CAN0_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_APB1_MOTOCON_PWM_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_APB1_CAN1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_LCD_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_ETHERNET_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_USB0_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_EMC_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_SCT_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_USB1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_EMCDIV_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_WWDT_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_USART0_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_UART1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_SSP0_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_TIMER1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_USART2_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_USART3_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_TIMER2_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_M4_QEI_CFG.RUN = clock_run_state;
|
||||
|
||||
LPC_CCU1->CLK_USB1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU1->CLK_SPI_CFG.RUN = clock_run_state;
|
||||
|
||||
LPC_CCU2->CLK_APB2_USART3_CFG.RUN = clock_run_state;
|
||||
LPC_CCU2->CLK_APB2_USART2_CFG.RUN = clock_run_state;
|
||||
LPC_CCU2->CLK_APB0_UART1_CFG.RUN = clock_run_state;
|
||||
LPC_CCU2->CLK_APB0_USART0_CFG.RUN = clock_run_state;
|
||||
LPC_CCU2->CLK_APB0_SSP0_CFG.RUN = clock_run_state;
|
||||
}
|
||||
|
||||
static void disable_unused_mcu_peripheral_clocks() {
|
||||
configure_unused_mcu_peripherals(false);
|
||||
}
|
||||
|
||||
static void enable_unused_mcu_peripheral_clocks() {
|
||||
configure_unused_mcu_peripherals(true);
|
||||
}
|
||||
|
||||
static void shutdown_base() {
|
||||
clock_manager.shutdown();
|
||||
|
||||
|
@ -162,6 +224,8 @@ static void shutdown_base() {
|
|||
|
||||
systick_stop();
|
||||
|
||||
enable_unused_mcu_peripheral_clocks();
|
||||
|
||||
hackrf::one::reset();
|
||||
}
|
||||
|
||||
|
@ -190,6 +254,10 @@ bool init() {
|
|||
| (0U << 15) // SDA: Enable input glitch filter
|
||||
;
|
||||
|
||||
disable_unused_mcu_peripheral_clocks();
|
||||
|
||||
LPC_CREG->CREG0 |= (1 << 5); // Disable USB0 PHY
|
||||
|
||||
power.init();
|
||||
|
||||
gpio_max5864_select.set();
|
||||
|
@ -235,6 +303,7 @@ bool init() {
|
|||
void shutdown() {
|
||||
gpdma::controller.disable();
|
||||
|
||||
backlight()->off();
|
||||
display.shutdown();
|
||||
|
||||
radio::disable();
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "portapack_io.hpp"
|
||||
|
||||
#include "receiver_model.hpp"
|
||||
|
@ -28,6 +30,7 @@
|
|||
#include "spi_pp.hpp"
|
||||
#include "si5351.hpp"
|
||||
#include "lcd_ili9341.hpp"
|
||||
#include "backlight.hpp"
|
||||
|
||||
#include "radio.hpp"
|
||||
#include "clock_manager.hpp"
|
||||
|
@ -40,7 +43,6 @@ extern portapack::IO io;
|
|||
extern lcd::ILI9341 display;
|
||||
|
||||
extern I2C i2c0;
|
||||
extern SPI ssp0;
|
||||
extern SPI ssp1;
|
||||
|
||||
extern si5351::Si5351 clock_generator;
|
||||
|
@ -56,4 +58,6 @@ extern TemperatureLogger temperature_logger;
|
|||
bool init();
|
||||
void shutdown();
|
||||
|
||||
Backlight* backlight();
|
||||
|
||||
} /* namespace portapack */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue