Files
banban/ql-bootloader/common/src/backlight_drv.c
T

246 lines
6.9 KiB
C

#include "backlight_drv.h"
//#include "Gpio_api.h"
#include "ql_mfpr_api.h"
#ifndef CRANE_MCU_DONGLE
#include "pmic_api.h"
#endif
#define HAL_GPIO_69 69
#define BACKLIGHT_GPIO HAL_GPIO_69
#define HAL_GPIO_123 123
#define HAL_GPIO_126 126
#define CRANEM_BACKLIGHT_GPIO123 HAL_GPIO_123
#define CRANEM_BACKLIGHT_GPIO126 HAL_GPIO_126
uint8_t g_backlight_status = BACKLIGHT_STATUS_MAX ;
uint8_t g_backlight_brightness = 0xFF;
typedef struct
{
UINT32 reg;
UINT32 padding[2];
}GPIO_Single_Register;
typedef volatile struct
{
volatile GPIO_Single_Register PLR;//0x0
volatile GPIO_Single_Register PDR;//0xc
volatile GPIO_Single_Register PSR;//0X18
volatile GPIO_Single_Register PCR;//0X24
volatile GPIO_Single_Register RER;//0X30
volatile GPIO_Single_Register FER;//0X3C
volatile GPIO_Single_Register EDR;//0X48
volatile GPIO_Single_Register SDR;//0X54
volatile GPIO_Single_Register CDR;//0X60
volatile GPIO_Single_Register SRER;//0X6C
volatile GPIO_Single_Register CRER;//0X78
volatile GPIO_Single_Register SFER;//0X84
volatile GPIO_Single_Register CFER;//0X90
volatile GPIO_Single_Register AP_MASK;//0X9C
volatile GPIO_Single_Register CP_MASK;//0XA8
}GPIORegisters;
#define GPIO_SHIFT(gpio) (1 << (gpio%32))
typedef enum
{
VSPI_GPIO_0=0,
VSPI_GPIO_32=32,
VSPI_GPIO_33=33,
VSPI_GPIO_34,
VSPI_GPIO_35,
VSPI_GPIO_36,
VSPI_GPIO_64=64,
VSPI_GPIO_96=96,
VSPI_GPIO_121=121,
VSPI_GPIO_MAX=127,
VSPI_GPIO_NULL=128
}VSpiGpio;
#define GPIO_REGISTER_BASE 0xD4019000
#define GPIO_REGISTER_GROUPS 4
#define GPIO_GROUP_BASE1 0
#define GPIO_GROUP_BASE2 4
#define GPIO_GROUP_BASE3 8
#define GPIO_GROUP_BASE4 0x100
static UINT32 GPIORegisterBase[GPIO_REGISTER_GROUPS] = { GPIO_GROUP_BASE1,
GPIO_GROUP_BASE2,
GPIO_GROUP_BASE3,
GPIO_GROUP_BASE4};
static UINT32 *GetBaseAddr(UINT32 portHandle)
{
UINT32 base_addr;
if(portHandle < VSPI_GPIO_32)
base_addr = GPIO_REGISTER_BASE + GPIORegisterBase[0];
else if(portHandle < VSPI_GPIO_64)
base_addr = GPIO_REGISTER_BASE + GPIORegisterBase[1];
else if(portHandle < VSPI_GPIO_96)
base_addr = GPIO_REGISTER_BASE + GPIORegisterBase[2];
else if(portHandle <= VSPI_GPIO_MAX)
base_addr = GPIO_REGISTER_BASE + GPIORegisterBase[3];
else
base_addr = 0;
return (UINT32 *)base_addr;
}
void gpio_set_output(unsigned int port)
{
GPIORegisters *GPIOReg;
GPIOReg = (GPIORegisters *)GetBaseAddr(port);
GPIOReg->SDR.reg = GPIO_SHIFT(port);
}
void gpio_set_value(unsigned int port, int value)
{
//set high
GPIORegisters *GPIOReg;
GPIOReg = (GPIORegisters *)GetBaseAddr(port);
if(value == 0) {
GPIOReg->PCR.reg = GPIO_SHIFT(port);
}
else {
GPIOReg->PSR.reg = GPIO_SHIFT(port);
}
}
#if defined(CONFIG_BOARD_CRANEM_EVB)
extern int pwm_start_work(int port, int period_ns, int duty_ns);
#undef BU_REG_READ
#undef BU_REG_WRITE
#define BU_REG_READ(x) (*(volatile uint32_t *)(x))
#define BU_REG_WRITE(x,y) ((*(volatile uint32_t *)(x)) = (y) )
void craneM_lcd_backlight(uint8_t onoff)
{
unsigned int vreg;
vreg = BU_REG_READ(0xd401910c); //gpio_direction_output gpio123
vreg |= 0x8000000;
BU_REG_WRITE(0xd401910c, vreg);
vreg = BU_REG_READ(0xd4019118); // gpio_set_value gpio123
if(onoff)
vreg |= 0x8000000;
else
vreg &= ~0x8000000;
BU_REG_WRITE(0xd4019118, vreg);
}
void craneM_lcd_backlight_Ctrl(unsigned int level)
{
if (level == 5)
pwm_start_work(0, 50000, 50000);
else
pwm_start_work(0, 50000, level * 130 * 76);
//76 =(1*1000*1000*1000) /pwm_source_clk_freq //pwm_source_clk_freq=13mhz
//204 = 1024 / 5// level:1~5
}
#endif
static void backlight_on(uint8_t brightness)
{
/*
* z2 use pm813, check first
*/
unsigned int value[2];
if(Pmic_is_pm813()){
PmicLcdBackLightCtrl(brightness);
}
else if (Pmic_is_pm812()){
if(BACKLIGHT_STATUS_OFF == brightness){
//gpio_direction_output(BACKLIGHT_GPIO);
//gpio_set_value(BACKLIGHT_GPIO, 0);
value[0] = MFP_REG(GPIO_77| MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW & ~MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE);
value[1] = MFP_EOC;
mfp_config(value);
//set output
gpio_set_output(BACKLIGHT_GPIO);
gpio_set_value(BACKLIGHT_GPIO,1);
} else {
//gpio_direction_output(BACKLIGHT_GPIO);
//gpio_set_value(BACKLIGHT_GPIO, 1);
value[0] = MFP_REG(GPIO_77| MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW & ~MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE);
value[1] = MFP_EOC;
mfp_config(value);
//set output
gpio_set_output(BACKLIGHT_GPIO);
gpio_set_value(BACKLIGHT_GPIO,1);
}
} else if (PMIC_IS_PM803()) {
#if defined(CONFIG_BOARD_CRANEM_EVB)
#if 0
value[0] = MFP_REG(GPIO_VCXO_OUT | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW & ~MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE);
value[1] = MFP_REG(GPIO_CLK_REQ | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW & ~MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE);
value[2] = MFP_EOC;
mfp_config(value);
#endif
/* Note: DKB uses a external LDO to power backlight */
BU_REG_WRITE(0xd401e0cc, 0xd0c1); //GPIO123 FUN1 GPIO to enable the external ldo
BU_REG_WRITE(0xd401e0d8, 0xd0c2); //GPIO126 FUN2 GPIO, always pull up. FUN1 work as PWM
gpio_set_output(CRANEM_BACKLIGHT_GPIO123);
gpio_set_output(CRANEM_BACKLIGHT_GPIO126);
if (0 == brightness) {
raw_uart_log("turn off backlight\r\n");
gpio_set_value(CRANEM_BACKLIGHT_GPIO123, 0);
gpio_set_value(CRANEM_BACKLIGHT_GPIO126, 0);
} else {
raw_uart_log("turn on backlight\r\n");
gpio_set_value(CRANEM_BACKLIGHT_GPIO123, 1);
gpio_set_value(CRANEM_BACKLIGHT_GPIO126, 1);
}
//craneM_lcd_backlight(TRUE);
//craneM_lcd_backlight_Ctrl(brightness);
#endif
} else {
}
}
void backlight_set_brightness(uint8_t brightness)
{
uint8_t orig_status = g_backlight_status;
uint8_t orig_light = g_backlight_brightness;
if(brightness > 5)
brightness = 5;
if(0 == brightness){
if(BACKLIGHT_STATUS_OFF != g_backlight_status){
backlight_on(brightness);
g_backlight_status = BACKLIGHT_STATUS_OFF;
/*
* do not save brightness value when OFF
*/
}
} else {
if(BACKLIGHT_STATUS_OFF == g_backlight_status){
g_backlight_brightness = brightness;
backlight_on(brightness);
g_backlight_status = BACKLIGHT_STATUS_ON;
} else {
if(brightness != g_backlight_brightness){
backlight_on(brightness);
g_backlight_brightness = brightness;
g_backlight_status = BACKLIGHT_STATUS_ON;
}
}
}
raw_uart_log("backlight_set_brightness(%d), [%d,%d]->[%d,%d]\r\n",
brightness, orig_status, orig_light, g_backlight_status, g_backlight_brightness);
}