diff --git a/app/app.c b/app/app.c index 3f621ca..713179d 100644 --- a/app/app.c +++ b/app/app.c @@ -1611,11 +1611,16 @@ void APP_TimeSlice500ms(void) } #endif - if (gBacklightCountdown > 0 && !gAskToSave && gCssScanMode == CSS_SCAN_MODE_OFF) - if (gScreenToDisplay != DISPLAY_MENU || GetCurrentMenuId() != MENU_ABR) // don't turn off backlight if user is in backlight menu option - if (--gBacklightCountdown == 0) - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn backlight off + if (gBacklightCountdown > 0 && + !gAskToSave && + gCssScanMode == CSS_SCAN_MODE_OFF && + // don't turn off backlight if user is in backlight menu option + !(gScreenToDisplay == DISPLAY_MENU && (GetCurrentMenuId() == MENU_ABR || GetCurrentMenuId() == MENU_ABR_MAX)) + ) + { if (--gBacklightCountdown == 0) + if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) // backlight is not set to be always on + BACKLIGHT_TurnOff(); // turn backlight off + } if (gSerialConfigCountDown_500ms > 0) { @@ -1687,10 +1692,9 @@ void APP_TimeSlice500ms(void) { gMenuCountdown = 0; - if (gEeprom.BACKLIGHT == 0) + if (gEeprom.BACKLIGHT_TIME == 0) // backlight always off { - gBacklightCountdown = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + BACKLIGHT_TurnOff(); // turn the backlight OFF } if (gInputBoxIndex > 0 || gDTMF_InputMode) @@ -1807,8 +1811,8 @@ void APP_TimeSlice500ms(void) ST7565_HardwareReset(); - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight off + if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) + BACKLIGHT_TurnOff(); // turn the backlight off } #ifdef ENABLE_VOICE else @@ -1907,9 +1911,7 @@ void APP_TimeSlice500ms(void) static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { - const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); - - if (Key == KEY_EXIT && !backlight_was_on && gEeprom.BACKLIGHT > 0) + if (Key == KEY_EXIT && !BACKLIGHT_IsOn() && gEeprom.BACKLIGHT_TIME > 0) { // just turn the light on for now so the user can see what's what BACKLIGHT_TurnOn(); gBeepToPlay = BEEP_NONE; @@ -1959,9 +1961,16 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } else // key pressed or held { - if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == BACKLIGHT_ON_TR_TX - || gSetting_backlight_on_tx_rx == BACKLIGHT_ON_TR_TXRX) + const uint8_t s = gSetting_backlight_on_tx_rx; + const int m = GetCurrentMenuId(); + if ( //not when PTT and the backlight shouldn't turn on on TX + !(Key == KEY_PTT && s != BACKLIGHT_ON_TR_TX && s != BACKLIGHT_ON_TR_TXRX) + // not in the backlight menu + && !(gScreenToDisplay == DISPLAY_MENU && ( m == MENU_ABR || m == MENU_ABR_MAX || m == MENU_ABR_MIN)) + ) + { BACKLIGHT_TurnOn(); + } if (Key == KEY_EXIT && bKeyHeld) { // exit key held pressed diff --git a/app/menu.c b/app/menu.c index 9467a13..bba78e1 100644 --- a/app/menu.c +++ b/app/menu.c @@ -117,6 +117,16 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1; break; + case MENU_ABR_MIN: + *pMin = 0; + *pMax = 9; + break; + + case MENU_ABR_MAX: + *pMin = 1; + *pMax = 10; + break; + case MENU_F_LOCK: *pMin = 0; *pMax = ARRAY_SIZE(gSubMenu_F_LOCK) - 1; @@ -516,9 +526,19 @@ void MENU_AcceptSetting(void) #endif case MENU_ABR: - gEeprom.BACKLIGHT = gSubMenuSelection; + gEeprom.BACKLIGHT_TIME = gSubMenuSelection; break; + case MENU_ABR_MIN: + gEeprom.BACKLIGHT_MIN = gSubMenuSelection; + gEeprom.BACKLIGHT_MAX = MAX(gSubMenuSelection + 1 , gEeprom.BACKLIGHT_MAX); + break; + + case MENU_ABR_MAX: + gEeprom.BACKLIGHT_MAX = gSubMenuSelection; + gEeprom.BACKLIGHT_MIN = MIN(gSubMenuSelection - 1, gEeprom.BACKLIGHT_MIN); + break; + case MENU_ABR_ON_TX_RX: gSetting_backlight_on_tx_rx = gSubMenuSelection; break; @@ -934,19 +954,24 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.BATTERY_SAVE; break; - #ifdef ENABLE_VOX - case MENU_VOX: - gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0; - break; - #endif +#ifdef ENABLE_VOX + case MENU_VOX: + gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0; + break; +#endif case MENU_ABR: - gSubMenuSelection = gEeprom.BACKLIGHT; - - gBacklightCountdown = 0; - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu + gSubMenuSelection = gEeprom.BACKLIGHT_TIME; break; + case MENU_ABR_MIN: + gSubMenuSelection = gEeprom.BACKLIGHT_MIN; + break; + + case MENU_ABR_MAX: + gSubMenuSelection = gEeprom.BACKLIGHT_MAX; + break; + case MENU_ABR_ON_TX_RX: gSubMenuSelection = gSetting_backlight_on_tx_rx; break; @@ -963,11 +988,11 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER; break; - #ifdef ENABLE_VOICE - case MENU_VOICE: - gSubMenuSelection = gEeprom.VOICE_PROMPT; - break; - #endif +#ifdef ENABLE_VOICE + case MENU_VOICE: + gSubMenuSelection = gEeprom.VOICE_PROMPT; + break; +#endif case MENU_SC_REV: gSubMenuSelection = gEeprom.SCAN_RESUME_MODE; @@ -1001,11 +1026,11 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.MIC_SENSITIVITY; break; - #ifdef ENABLE_AUDIO_BAR - case MENU_MIC_BAR: - gSubMenuSelection = gSetting_mic_bar; - break; - #endif +#ifdef ENABLE_AUDIO_BAR + case MENU_MIC_BAR: + gSubMenuSelection = gSetting_mic_bar; + break; +#endif case MENU_COMPAND: gSubMenuSelection = gTxVfo->Compander; @@ -1081,11 +1106,11 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gTxVfo->AM_mode; break; - #ifdef ENABLE_AM_FIX - case MENU_AM_FIX: - gSubMenuSelection = gSetting_AM_fix; - break; - #endif +#ifdef ENABLE_AM_FIX + case MENU_AM_FIX: + gSubMenuSelection = gSetting_AM_fix; + break; +#endif #ifdef ENABLE_AM_FIX_TEST1 case MENU_AM_FIX_TEST1: @@ -1377,10 +1402,9 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) gRequestDisplayScreen = DISPLAY_MAIN; - if (gEeprom.BACKLIGHT == 0) + if (gEeprom.BACKLIGHT_TIME == 0) // backlight set to always off { - gBacklightCountdown = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + BACKLIGHT_TurnOff(); // turn the backlight OFF } } else @@ -1658,10 +1682,9 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gRequestDisplayScreen = DISPLAY_MENU; - if (GetCurrentMenuId() != MENU_ABR && gEeprom.BACKLIGHT == 0) + if (GetCurrentMenuId() != MENU_ABR && gEeprom.BACKLIGHT_TIME == 0) // backlight always off and not in the backlight menu { - gBacklightCountdown = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + BACKLIGHT_TurnOff(); } return; diff --git a/app/spectrum.c b/app/spectrum.c index b5a414d..f771c00 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -14,7 +14,8 @@ * limitations under the License. */ -#include "../app/spectrum.h" +#include "app/spectrum.h" +#include "driver/backlight.h" struct FrequencyBandInfo { uint32_t lower; @@ -493,9 +494,9 @@ static void ToggleListeningBW() { static void ToggleBacklight() { settings.backlightState = !settings.backlightState; if (settings.backlightState) { - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + BACKLIGHT_TurnOn(); } else { - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + BACKLIGHT_TurnOff(); } } diff --git a/app/uart.c b/app/uart.c index 61d1ac5..05ab5ed 100644 --- a/app/uart.c +++ b/app/uart.c @@ -27,6 +27,7 @@ #include "bsp/dp32g030/dma.h" #include "bsp/dp32g030/gpio.h" #include "driver/aes.h" +#include "driver/backlight.h" #include "driver/bk4819.h" #include "driver/crc.h" #include "driver/eeprom.h" @@ -238,7 +239,7 @@ static void CMD_0514(const uint8_t *pBuffer) gSerialConfigCountDown_500ms = 12; // 6 sec // turn the LCD backlight off - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + BACKLIGHT_TurnOff(); SendVersion(); } @@ -413,7 +414,7 @@ static void CMD_052F(const uint8_t *pBuffer) Timestamp = pCmd->Timestamp; // turn the LCD backlight off - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + BACKLIGHT_TurnOff(); SendVersion(); } diff --git a/board.c b/board.c index 6a1f07e..827f388 100644 --- a/board.c +++ b/board.c @@ -23,6 +23,7 @@ #include "board.h" #include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/portcon.h" +#include "bsp/dp32g030/pwmplus.h" #include "bsp/dp32g030/saradc.h" #include "bsp/dp32g030/syscon.h" #include "driver/adc.h" @@ -94,8 +95,6 @@ void BOARD_GPIO_Init(void) | GPIO_DIR_6_MASK // INPUT ); GPIOB->DIR |= 0 - // Back light - | GPIO_DIR_6_BITS_OUTPUT // ST7565 | GPIO_DIR_9_BITS_OUTPUT // ST7565 + SWD IO @@ -189,8 +188,8 @@ void BOARD_PORTCON_Init(void) | PORTCON_PORTB_SEL0_B7_MASK ); PORTCON_PORTB_SEL0 |= 0 - // Back light - | PORTCON_PORTB_SEL0_B6_BITS_GPIOB6 + // Back light PWM + | PORTCON_PORTB_SEL0_B6_BITS_PWMP0_CH0 // SPI0 SSN | PORTCON_PORTB_SEL0_B7_BITS_SPI0_SSN ; @@ -471,6 +470,23 @@ void BOARD_PORTCON_Init(void) ; } +static void BacklightPWM_Init() +{ + // 48MHz / 94 / 1024 ~ 500Hz + PWM_PLUS0_CLKSRC |= ((94) << 16); + PWM_PLUS0_PERIOD = 1023; + + PWM_PLUS0_GEN = + PWMPLUS_GEN_CH0_OE_BITS_ENABLE | + PWMPLUS_GEN_CH0_OUTINV_BITS_ENABLE | + 0; + + PWM_PLUS0_CFG = + PWMPLUS_CFG_CNT_REP_BITS_ENABLE | + PWMPLUS_CFG_COUNTER_EN_BITS_ENABLE | + 0; +} + void BOARD_ADC_Init(void) { ADC_Config_t Config; @@ -508,6 +524,7 @@ void BOARD_Init(void) { BOARD_PORTCON_Init(); BOARD_GPIO_Init(); + BacklightPWM_Init(); BOARD_ADC_Init(); ST7565_Init(true); #ifdef ENABLE_FMRADIO @@ -540,11 +557,13 @@ void BOARD_EEPROM_Init(void) // 0E78..0E7F EEPROM_ReadBuffer(0x0E78, Data, 8); + gEeprom.BACKLIGHT_MAX = (Data[0] & 0xF) <= 10 ? (Data[0] & 0xF) : 10; + gEeprom.BACKLIGHT_MIN = (Data[0] >> 4) < gEeprom.BACKLIGHT_MAX ? (Data[0] >> 4) : 0; gEeprom.CHANNEL_DISPLAY_MODE = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY; // 4 instead of 3 - extra display mode gEeprom.CROSS_BAND_RX_TX = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF; gEeprom.BATTERY_SAVE = (Data[3] < 5) ? Data[3] : 4; gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A; - gEeprom.BACKLIGHT = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3; + gEeprom.BACKLIGHT_TIME = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3; gEeprom.TAIL_NOTE_ELIMINATION = (Data[6] < 2) ? Data[6] : false; gEeprom.VFO_OPEN = (Data[7] < 2) ? Data[7] : true; diff --git a/bsp/dp32g030/pwmplus.h b/bsp/dp32g030/pwmplus.h new file mode 100644 index 0000000..3b74475 --- /dev/null +++ b/bsp/dp32g030/pwmplus.h @@ -0,0 +1,146 @@ +#ifndef HARDWARE_DP32G030_PWMPLUS_H +#define HARDWARE_DP32G030_PWMPLUS_H + +#define PWM_PLUS0_BASE_ADDR 0x400B4000U + +//--------------- + +#define PWMPLUS_CFG 0x00U + +#define PWMPLUS_CFG_COUNTER_EN_SHIFT 0U +#define PWMPLUS_CFG_COUNTER_EN_WIDTH 1U +#define PWMPLUS_CFG_COUNTER_EN_MASK (((1U << PWMPLUS_CFG_COUNTER_EN_WIDTH) - 1U) << PWMPLUS_CFG_COUNTER_EN_SHIFT) +#define PWMPLUS_CFG_COUNTER_EN_VALUE_ENABLE 1U +#define PWMPLUS_CFG_COUNTER_EN_BITS_ENABLE (PWMPLUS_CFG_COUNTER_EN_VALUE_ENABLE << PWMPLUS_CFG_COUNTER_EN_SHIFT) + +#define PWMPLUS_CFG_CNT_TYPE_SHIFT 1U + +#define PWMPLUS_CFG_CNT_REP_SHIFT 2U +#define PWMPLUS_CFG_CNT_REP_WIDTH 1U +#define PWMPLUS_CFG_CNT_REP_VALUE_ENABLE 1U +#define PWMPLUS_CFG_CNT_REP_BITS_ENABLE (PWMPLUS_CFG_CNT_REP_VALUE_ENABLE << PWMPLUS_CFG_CNT_REP_SHIFT) + +#define PWMPLUS_CFG_OUT_MODE_SHIFT 3U +#define PWMPLUS_CFG_OUT_MODE_VALUE_ENABLE 1U +#define PWMPLUS_CFG_OUT_MODE_BITS_ENABLE (PWMPLUS_CFG_OUT_MODE_VALUE_ENABLE << PWMPLUS_CFG_OUT_MODE_SHIFT) + +#define PWMPLUS_CFG_AUTO_RELOAD_SHIFT 8U + +//--------------- + +#define PWMPLUS_GEN 0x04U + +#define PWMPLUS_GEN_CH0_OE_SHIFT 24U +#define PWMPLUS_GEN_CH0_OE_WIDTH 1U +#define PWMPLUS_GEN_CH0_OE_VALUE_ENABLE 1U +#define PWMPLUS_GEN_CH0_OE_BITS_ENABLE (PWMPLUS_GEN_CH0_OE_VALUE_ENABLE << PWMPLUS_GEN_CH0_OE_SHIFT) + +#define PWMPLUS_GEN_CH0_OUTINV_SHIFT 16U +#define PWMPLUS_GEN_CH0_OUTINV_WIDTH 1U +#define PWMPLUS_GEN_CH0_OUTINV_VALUE_ENABLE 1U +#define PWMPLUS_GEN_CH0_OUTINV_BITS_ENABLE (PWMPLUS_GEN_CH0_OUTINV_VALUE_ENABLE << PWMPLUS_GEN_CH0_OUTINV_SHIFT) + +#define PWMPLUS_GEN_CH0_START_SHIFT 8U +#define PWMPLUS_GEN_CH0_START_WIDTH 1U +#define PWMPLUS_GEN_CH0_START_VALUE_ENABLE 1U +#define PWMPLUS_GEN_CH0_START_BITS_ENABLE (PWMPLUS_GEN_CH0_START_VALUE_ENABLE << PWMPLUS_GEN_CH0_START_SHIFT) + +#define PWMPLUS_GEN_CH0_IDLE_SHIFT 0U +#define PWMPLUS_GEN_CH0_IDLE_WIDTH 1U +#define PWMPLUS_GEN_CH0_IDLE_VALUE_ENABLE 1U +#define PWMPLUS_GEN_CH0_IDLE_BITS_ENABLE (PWMPLUS_GEN_CH0_IDLE_VALUE_ENABLE << PWMPLUS_GEN_CH0_IDLE_SHIFT) + +//--------------- + +#define PWMPLUS_CLKSRC 0x08U +#define PWMPLUS_BRAKE_CFG 0x0CU +#define PWMPLUS_MASK_LEV 0x10U +#define PWMPLUS_PERIOD 0x1CU +#define PWMPLUS_CH0_COMP 0x20U +#define PWMPLUS_CH1_COMP 0x24U +#define PWMPLUS_CH2_COMP 0x28U +#define PWMPLUS_CH0_DT 0x30U +#define PWMPLUS_CH1_DT 0x34U +#define PWMPLUS_CH2_DT 0x38U +#define PWMPLUS_TRIG_COMP 0x40U +#define PWMPLUS_TRIG_CFG 0x44U +#define PWMPLUS_IE 0x60U +#define PWMPLUS_IF 0x64U +#define PWMPLUS_SWLOAD 0x84U +#define PWMPLUS_MASK_EN 0x88 +#define PWMPLUS_CNT_ST 0xE0 +#define PWMPLUS_BRAKE_ST 0xE4 + + + + + + + + + + + + + +#define PWM_PLUS0_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CFG) +#define PWM_PLUS0_CFG (*(volatile uint32_t *)PWM_PLUS0_CFG_ADDR) + +#define PWM_PLUS0_GEN_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_GEN) +#define PWM_PLUS0_GEN (*(volatile uint32_t *)PWM_PLUS0_GEN_ADDR) + +#define PWM_PLUS0_CLKSRC_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CLKSRC) +#define PWM_PLUS0_CLKSRC (*(volatile uint32_t *)PWM_PLUS0_CLKSRC_ADDR) + +#define PWM_PLUS0_BRAKE_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_BRAKE_CFG) +#define PWM_PLUS0_BRAKE_CFG (*(volatile uint32_t *)PWM_PLUS0_BRAKE_CFG_ADDR) + +#define PWM_PLUS0_MASK_LEV_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_MASK_LEV) +#define PWM_PLUS0_MASK_LEV (*(volatile uint32_t *)PWM_PLUS0_MASK_LEV_ADDR) + +#define PWM_PLUS0_PERIOD_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_PERIOD) +#define PWM_PLUS0_PERIOD (*(volatile uint32_t *)PWM_PLUS0_PERIOD_ADDR) + +#define PWM_PLUS0_CH0_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH0_COMP) +#define PWM_PLUS0_CH0_COMP (*(volatile uint32_t *)PWM_PLUS0_CH0_COMP_ADDR) + +#define PWM_PLUS0_CH1_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH1_COMP) +#define PWM_PLUS0_CH1_COMP (*(volatile uint32_t *)PWM_PLUS0_CH1_COMP_ADDR) + +#define PWM_PLUS0_CH2_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH2_COMP) +#define PWM_PLUS0_CH2_COMP (*(volatile uint32_t *)PWM_PLUS0_CH2_COMP_ADDR) + +#define PWM_PLUS0_CH0_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH0_DT) +#define PWM_PLUS0_CH0_DT (*(volatile uint32_t *)PWM_PLUS0_CH0_DT_ADDR) + +#define PWM_PLUS0_CH1_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH1_DT) +#define PWM_PLUS0_CH1_DT (*(volatile uint32_t *)PWM_PLUS0_CH1_DT_ADDR) + +#define PWM_PLUS0_CH2_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH2_DT) +#define PWM_PLUS0_CH2_DT (*(volatile uint32_t *)PWM_PLUS0_CH2_DT_ADDR) + +#define PWM_PLUS0_TRIG_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_TRIG_COMP) +#define PWM_PLUS0_TRIG_COMP (*(volatile uint32_t *)PWM_PLUS0_TRIG_COMP_ADDR) + +#define PWM_PLUS0_TRIG_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_TRIG_CFG) +#define PWM_PLUS0_TRIG_CFG (*(volatile uint32_t *)PWM_PLUS0_TRIG_CFG_ADDR) + +#define PWM_PLUS0_IE_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_IE) +#define PWM_PLUS0_IE (*(volatile uint32_t *)PWM_PLUS0_IE_ADDR) + +#define PWM_PLUS0_IF_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_IF) +#define PWM_PLUS0_IF (*(volatile uint32_t *)PWM_PLUS0_IF_ADDR) + +#define PWM_PLUS0_SWLOAD_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_SWLOAD) +#define PWM_PLUS0_SWLOAD (*(volatile uint32_t *)PWM_PLUS0_SWLOAD_ADDR) + +#define PWM_PLUS0_MASK_EN_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_MASK_EN) +#define PWM_PLUS0_MASK_EN (*(volatile uint32_t *)PWM_PLUS0_MASK_EN_ADDR) + +#define PWM_PLUS0_CNT_ST_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CNT_ST) +#define PWM_PLUS0_CNT_ST (*(volatile uint32_t *)PWM_PLUS0_CNT_ST_ADDR) + +#define PWM_PLUS0_BRAKE_ST_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_BRAKE_ST) +#define PWM_PLUS0_BRAKE_ST (*(volatile uint32_t *)PWM_PLUS0_BRAKE_ST_ADDR) + +#endif \ No newline at end of file diff --git a/driver/backlight.c b/driver/backlight.c index bfeedfe..76ee041 100644 --- a/driver/backlight.c +++ b/driver/backlight.c @@ -16,21 +16,25 @@ #include "backlight.h" #include "bsp/dp32g030/gpio.h" +#include "bsp/dp32g030/pwmplus.h" #include "driver/gpio.h" #include "settings.h" // this is decremented once every 500ms uint16_t gBacklightCountdown = 0; +bool backlightOn; void BACKLIGHT_TurnOn(void) { - if (gEeprom.BACKLIGHT == 0) + if (gEeprom.BACKLIGHT_TIME == 0) return; + backlightOn = true; + // turn the backlight ON - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX); - switch (gEeprom.BACKLIGHT) + switch (gEeprom.BACKLIGHT_TIME) { default: case 1: // 5 sec @@ -58,3 +62,21 @@ void BACKLIGHT_TurnOn(void) gBacklightCountdown *= 2; } + +void BACKLIGHT_TurnOff() +{ + BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MIN); + gBacklightCountdown = 0; + backlightOn = false; +} + +bool BACKLIGHT_IsOn() +{ + return backlightOn; +} + +void BACKLIGHT_SetBrightness(uint8_t brigtness) +{ + PWM_PLUS0_CH0_COMP = (1 << brigtness) - 1; + //PWM_PLUS0_SWLOAD = 1; +} \ No newline at end of file diff --git a/driver/backlight.h b/driver/backlight.h index 67967bf..c442537 100644 --- a/driver/backlight.h +++ b/driver/backlight.h @@ -18,10 +18,15 @@ #define DRIVER_BACKLIGHT_H #include +#include extern uint16_t gBacklightCountdown; +extern uint8_t gBacklightBrightness; -void BACKLIGHT_TurnOn(void); +void BACKLIGHT_TurnOn(); +void BACKLIGHT_TurnOff(); +bool BACKLIGHT_IsOn(); +void BACKLIGHT_SetBrightness(uint8_t brigtness); #endif diff --git a/main.c b/main.c index f520acd..c539c3a 100644 --- a/main.c +++ b/main.c @@ -61,7 +61,8 @@ void Main(void) | SYSCON_DEV_CLK_GATE_SPI0_BITS_ENABLE | SYSCON_DEV_CLK_GATE_SARADC_BITS_ENABLE | SYSCON_DEV_CLK_GATE_CRC_BITS_ENABLE - | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE; + | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE + | SYSCON_DEV_CLK_GATE_PWM_PLUS0_BITS_ENABLE; SYSTICK_Init(); BOARD_Init(); @@ -140,10 +141,10 @@ void Main(void) { FUNCTION_Select(FUNCTION_POWER_SAVE); - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) // backlight is not set to be always on + BACKLIGHT_TurnOff(); // turn the backlight OFF else - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON + BACKLIGHT_TurnOn(); // turn the backlight ON gReducedService = true; } diff --git a/settings.c b/settings.c index db06ce1..c28a7d8 100644 --- a/settings.c +++ b/settings.c @@ -96,12 +96,12 @@ void SETTINGS_SaveSettings(void) State[7] = gEeprom.MIC_SENSITIVITY; EEPROM_WriteBuffer(0x0E70, State); - State[0] = 0xFF; + State[0] = (gEeprom.BACKLIGHT_MIN << 4) + gEeprom.BACKLIGHT_MAX; State[1] = gEeprom.CHANNEL_DISPLAY_MODE; State[2] = gEeprom.CROSS_BAND_RX_TX; State[3] = gEeprom.BATTERY_SAVE; State[4] = gEeprom.DUAL_WATCH; - State[5] = gEeprom.BACKLIGHT; + State[5] = gEeprom.BACKLIGHT_TIME; State[6] = gEeprom.TAIL_NOTE_ELIMINATION; State[7] = gEeprom.VFO_OPEN; EEPROM_WriteBuffer(0x0E78, State); @@ -123,11 +123,11 @@ void SETTINGS_SaveSettings(void) #endif EEPROM_WriteBuffer(0x0E98, Password); - #ifdef ENABLE_VOICE - memset(State, 0xFF, sizeof(State)); - State[0] = gEeprom.VOICE_PROMPT; - EEPROM_WriteBuffer(0x0EA0, State); - #endif + memset(State, 0xFF, sizeof(State)); +#ifdef ENABLE_VOICE + State[0] = gEeprom.VOICE_PROMPT; + EEPROM_WriteBuffer(0x0EA0, State); +#endif #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) State[0] = gEeprom.ALARM_MODE; diff --git a/settings.h b/settings.h index 87912a5..2ae4df2 100644 --- a/settings.h +++ b/settings.h @@ -160,7 +160,7 @@ typedef struct { uint8_t DUAL_WATCH; uint8_t CROSS_BAND_RX_TX; uint8_t BATTERY_SAVE; - uint8_t BACKLIGHT; + uint8_t BACKLIGHT_TIME; uint8_t SCAN_RESUME_MODE; uint8_t SCAN_LIST_DEFAULT; bool SCAN_LIST_ENABLED[2]; @@ -228,6 +228,8 @@ typedef struct { uint8_t field79_0x97; uint8_t KEY_M_LONG_PRESS_ACTION; + uint8_t BACKLIGHT_MIN; + uint8_t BACKLIGHT_MAX; } EEPROM_Config_t; extern EEPROM_Config_t gEeprom; diff --git a/ui/menu.c b/ui/menu.c index 478d10d..01d8edb 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -83,6 +83,8 @@ const t_menu_item MenuList[] = {"POnMsg", VOICE_ID_INVALID, MENU_PONMSG }, {"BatTxt", VOICE_ID_INVALID, MENU_BAT_TXT }, {"BackLt", VOICE_ID_INVALID, MENU_ABR }, // was "ABR" + {"BLMin", VOICE_ID_INVALID, MENU_ABR_MIN }, + {"BLMax", VOICE_ID_INVALID, MENU_ABR_MAX }, {"BltTRX", VOICE_ID_INVALID, MENU_ABR_ON_TX_RX }, {"Beep", VOICE_ID_BEEP_PROMPT, MENU_BEEP }, #ifdef ENABLE_VOICE @@ -590,8 +592,18 @@ void UI_DisplayMenu(void) case MENU_ABR: strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]); + BACKLIGHT_SetBrightness(-1); break; + case MENU_ABR_MIN: + case MENU_ABR_MAX: + sprintf(String, "%d", gSubMenuSelection); + if(gIsInSubMenu) + BACKLIGHT_SetBrightness(gSubMenuSelection); + else + BACKLIGHT_SetBrightness(-1); + break; + case MENU_AM: strcpy(String, (gSubMenuSelection == 0) ? "FM" : "AM"); break; diff --git a/ui/menu.h b/ui/menu.h index 2c9fd5e..57b8ec5 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -53,6 +53,8 @@ enum #endif MENU_ABR, MENU_ABR_ON_TX_RX, + MENU_ABR_MIN, + MENU_ABR_MAX, MENU_TDR, MENU_BEEP, #ifdef ENABLE_VOICE