246 lines
6.9 KiB
C
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);
|
|
|
|
}
|