Files
99_7018_lmx/cpu/br28/power/power_port.c
2025-10-29 13:10:02 +08:00

198 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "asm/power_interface.h"
#include "app_config.h"
#include "includes.h"
static u8 gpiousb = 0x3;
static u32 usb_io_con = 0;
/* cpu公共流程
* 请勿添加板级相关的流程,例如宏定义
* 可以重写改流程
* 所有io保持原状除usb io
*/
void sleep_gpio_protect(u32 gpio)
{
if (gpio == IO_PORT_DP) {
gpiousb &= ~BIT(0);
} else if (gpio == IO_PORT_DM) {
gpiousb &= ~BIT(1);
}
}
void sleep_enter_callback_common(void *priv)
{
usb_io_con = JL_USB_IO->CON0;
if (gpiousb) {
usb_iomode(1);
if (gpiousb & BIT(0)) {
gpio_set_pull_up(IO_PORT_DP, 0);
gpio_set_pull_down(IO_PORT_DP, 0);
gpio_set_direction(IO_PORT_DP, 1);
gpio_set_die(IO_PORT_DP, 0);
gpio_set_dieh(IO_PORT_DP, 0);
}
if (gpiousb & BIT(1)) {
gpio_set_pull_up(IO_PORT_DM, 0);
gpio_set_pull_down(IO_PORT_DM, 0);
gpio_set_direction(IO_PORT_DM, 1);
gpio_set_die(IO_PORT_DM, 0);
gpio_set_dieh(IO_PORT_DM, 0);
}
}
}
void sleep_exit_callback_common(void *priv)
{
JL_USB_IO->CON0 = usb_io_con;
gpiousb = 0x3;
}
static struct gpio_value soff_gpio_config = {
.gpioa = 0xffff,
.gpiob = 0xffff,
.gpioc = 0xffff,
.gpiod = 0xffff,
.gpioe = 0xffff,
.gpiog = 0xffff,
.gpiop = 0x1,//
.gpiousb = 0x3,
};
void soff_gpio_protect(u32 gpio)
{
if ((gpio >= 0) && (gpio < IO_MAX_NUM)) {
port_protect((u16 *)&soff_gpio_config, gpio);
} else if (gpio == IO_PORT_DP) {
soff_gpio_config.gpiousb &= ~BIT(0);
} else if (gpio == IO_PORT_DM) {
soff_gpio_config.gpiousb &= ~BIT(1);
}
}
/* cpu公共流程
* 请勿添加板级相关的流程,例如宏定义
* 可以重写改流程
* 释放除内置flash外的所有io
*/
//maskrom 使用到的io
static void mask_io_cfg()
{
struct boot_soft_flag_t boot_soft_flag = {0};
boot_soft_flag.flag0.boot_ctrl.wdt_dis = 0;
boot_soft_flag.flag0.boot_ctrl.poweroff = 0;
boot_soft_flag.flag0.boot_ctrl.is_port_b = JL_IOMAP->CON0 & BIT(16) ? 1 : 0;
boot_soft_flag.flag0.boot_ctrl.lvd_en = (GET_VLVD_EN() ? 1 : 0);
boot_soft_flag.flag1.misc.usbdm = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag1.misc.usbdp = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag1.misc.uart_key_port = 0;
boot_soft_flag.flag1.misc.ldoin = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag2.pg2_pg3.pg2 = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag2.pg2_pg3.pg3 = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag3.pg4_res.pg4 = SOFTFLAG_HIGH_RESISTANCE;
boot_soft_flag.flag4.fast_boot_ctrl.fast_boot = 0;
boot_soft_flag.flag4.fast_boot_ctrl.flash_stable_delay_sel = 0;
mask_softflag_config(&boot_soft_flag);
}
void board_set_soft_poweroff_common(void *priv)
{
//flash电源
if (get_sfc_port() == 0) {
soff_gpio_protect(SPI0_PWR_A);
soff_gpio_protect(SPI0_CS_A);
soff_gpio_protect(SPI0_CLK_A);
soff_gpio_protect(SPI0_DO_D0_A);
soff_gpio_protect(SPI0_DI_D1_A);
if (get_sfc_bit_mode() == 4) {
soff_gpio_protect(SPI0_WP_D2_A);
soff_gpio_protect(SPI0_HOLD_D3_A);
}
} else {
soff_gpio_protect(SPI0_PWR_B);
soff_gpio_protect(SPI0_CS_B);
soff_gpio_protect(SPI0_CLK_B);
soff_gpio_protect(SPI0_DO_D0_B);
soff_gpio_protect(SPI0_DI_D1_B);
if (get_sfc_bit_mode() == 4) {
soff_gpio_protect(SPI0_WP_D2_B);
soff_gpio_protect(SPI0_HOLD_D3_B);
}
}
mask_io_cfg();
gpio_dir(GPIOA, 0, 16, soff_gpio_config.gpioa, GPIO_OR);
gpio_set_pu(GPIOA, 0, 16, ~soff_gpio_config.gpioa, GPIO_AND);
gpio_set_pd(GPIOA, 0, 16, ~soff_gpio_config.gpioa, GPIO_AND);
gpio_die(GPIOA, 0, 16, ~soff_gpio_config.gpioa, GPIO_AND);
gpio_dieh(GPIOA, 0, 16, ~soff_gpio_config.gpioa, GPIO_AND);
gpio_dir(GPIOB, 0, 16, soff_gpio_config.gpiob, GPIO_OR);
gpio_set_pu(GPIOB, 0, 16, ~soff_gpio_config.gpiob, GPIO_AND);
gpio_set_pd(GPIOB, 0, 16, ~soff_gpio_config.gpiob, GPIO_AND);
gpio_die(GPIOB, 0, 16, ~soff_gpio_config.gpiob, GPIO_AND);
gpio_dieh(GPIOB, 0, 16, ~soff_gpio_config.gpiob, GPIO_AND);
gpio_dir(GPIOC, 0, 16, soff_gpio_config.gpioc, GPIO_OR);
gpio_set_pu(GPIOC, 0, 16, ~soff_gpio_config.gpioc, GPIO_AND);
gpio_set_pd(GPIOC, 0, 16, ~soff_gpio_config.gpioc, GPIO_AND);
gpio_die(GPIOC, 0, 16, ~soff_gpio_config.gpioc, GPIO_AND);
gpio_dieh(GPIOC, 0, 16, ~soff_gpio_config.gpioc, GPIO_AND);
gpio_dir(GPIOD, 0, 16, soff_gpio_config.gpiod, GPIO_OR);
gpio_set_pu(GPIOD, 0, 16, ~soff_gpio_config.gpiod, GPIO_AND);
gpio_set_pd(GPIOD, 0, 16, ~soff_gpio_config.gpiod, GPIO_AND);
gpio_die(GPIOD, 0, 16, ~soff_gpio_config.gpiod, GPIO_AND);
gpio_dieh(GPIOD, 0, 16, ~soff_gpio_config.gpiod, GPIO_AND);
gpio_dir(GPIOE, 0, 16, soff_gpio_config.gpioe, GPIO_OR);
gpio_set_pu(GPIOE, 0, 16, ~soff_gpio_config.gpioe, GPIO_AND);
gpio_set_pd(GPIOE, 0, 16, ~soff_gpio_config.gpioe, GPIO_AND);
gpio_die(GPIOE, 0, 16, ~soff_gpio_config.gpioe, GPIO_AND);
gpio_dieh(GPIOE, 0, 16, ~soff_gpio_config.gpioe, GPIO_AND);
gpio_dir(GPIOG, 0, 16, soff_gpio_config.gpiog, GPIO_OR);
gpio_set_pu(GPIOG, 0, 16, ~soff_gpio_config.gpiog, GPIO_AND);
gpio_set_pd(GPIOG, 0, 16, ~soff_gpio_config.gpiog, GPIO_AND);
gpio_die(GPIOG, 0, 16, ~soff_gpio_config.gpiog, GPIO_AND);
gpio_dieh(GPIOG, 0, 16, ~soff_gpio_config.gpiog, GPIO_AND);
gpio_dir(GPIOP, 0, 1, soff_gpio_config.gpiop, GPIO_OR);
gpio_set_pu(GPIOP, 0, 1, ~soff_gpio_config.gpiop, GPIO_AND);
gpio_set_pd(GPIOP, 0, 1, ~soff_gpio_config.gpiop, GPIO_AND);
gpio_die(GPIOP, 0, 1, ~soff_gpio_config.gpiop, GPIO_AND);
gpio_dieh(GPIOP, 0, 1, ~soff_gpio_config.gpiop, GPIO_AND);
if (soff_gpio_config.gpiousb) {
usb_iomode(1);
if (soff_gpio_config.gpiousb & BIT(0)) {
gpio_set_pull_up(IO_PORT_DP, 0);
gpio_set_pull_down(IO_PORT_DP, 0);
gpio_set_direction(IO_PORT_DP, 1);
gpio_set_die(IO_PORT_DP, 0);
gpio_set_dieh(IO_PORT_DP, 0);
}
if (soff_gpio_config.gpiousb & BIT(1)) {
gpio_set_pull_up(IO_PORT_DM, 0);
gpio_set_pull_down(IO_PORT_DM, 0);
gpio_set_direction(IO_PORT_DM, 1);
gpio_set_die(IO_PORT_DM, 0);
gpio_set_dieh(IO_PORT_DM, 0);
}
}
}