372 lines
8.6 KiB
C
Raw Normal View History

2025-05-21 11:31:07 +08:00
/*
* fml_PMIC.c
*
* Created on: 2025410
* Author: 22332
*/
#include <stdio.h>
#include "cola_init.h"
#include "cola_device.h"
#include "bsp_register_map.h"
#include "shell.h"
#include "fml_PMIC.h"
#include "fml_gpio.h"
static cola_device_t *g_pDev_pmic_iic = NULL;
static bool ACK;
void fml_pmic_write_to_mtp(void)
{//Enable write data
uint8_t address = 0xFF,value = 0x80;
cola_delay_ms(2);
ACK = cola_device_write(g_pDev_pmic_iic,address,&value,1);
cola_delay_ms(500);
if(ACK == 0)
logWrite("MTP write error\r\n");
}
void fml_pmic_init(void)
{
g_pDev_pmic_iic = cola_device_find("PMIC_IIC");
fml_PAVDD_out_voltage(0x10);//5.8v
cola_delay_ms(10);
fml_NAVDD_out_voltage(0x10);//5.8v
cola_delay_ms(10);
fml_VGH_out_voltage(0x06); //10v
cola_delay_ms(10);
fml_VGL_out_voltage(0x0C);//-9V
fml_pmic_write_to_mtp();
}
uint8_t* detect_power_fault()
{ static bool power_fault[4] = {0};
uint8_t s_receiveBuffer[1];
uint8_t address = FAULT_ANALYSIS;
cola_device_read(g_pDev_pmic_iic,address,s_receiveBuffer,0);
power_fault[0] = s_receiveBuffer[0] & 0x01;
power_fault[1] = s_receiveBuffer[0] & 0x02;
power_fault[2] = s_receiveBuffer[0] & 0x04;
power_fault[3] = s_receiveBuffer[0] & 0x08;
return (uint8_t*)power_fault;
}
/*
PAVDD Output Voltage Setting
0X00~0X2E: 5.00V~7.30V unit:0.05V
*/
bool fml_PAVDD_out_voltage(uint8_t data)
{
uint8_t address = PAVDD;
ACK = cola_device_write(g_pDev_pmic_iic,address,&data,1);
if(ACK == 0)
logWrite("PAVDD write error\r\n");
return ACK;
}
/*
NAVDD Output Voltage Setting
0X00~0X2E: -5.00V~-7.30V unit:0.05V
*/
void fml_NAVDD_out_voltage(uint8_t data)
{
uint8_t address = NAVDD;
ACK = cola_device_write(g_pDev_pmic_iic,address,&data,1);
if(ACK == 0)
logWrite("NAVDD write error\r\n");
}
//0X00~0X2E: 7.00V~30.0V unit:0.5V
void fml_VGH_out_voltage(uint8_t data)
{
uint8_t address = VGH;
ACK = cola_device_write(g_pDev_pmic_iic,address,&data,1);
if(ACK == 0)
logWrite("VGH write error\r\n");
}
//0X00~0X30: -6.00V~-18.0V unit:0.25V
void fml_VGL_out_voltage(uint8_t data)
{
uint8_t address = VGL;
ACK = cola_device_write(g_pDev_pmic_iic,address,&data,1);
if(ACK == 0)
logWrite("VGL write error\r\n");
}
//0X00~0XFA: -3.00V~-2.00V unit:20mV
void fml_VCOM_C_out_voltage(uint8_t data)
{
uint8_t address = VCOM_C;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
//0X00~0X03: 2V~8V unit:2V
void fml_VGH_LOW_TEMP_COMPENSATION_voltage(uint8_t data)
{
uint8_t address = VGH_LOW_TEMP;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
//0X00600KHZ 0x01:800KHZ 0x02:1MHZ 0x03:2.2MHZ
void fml_switching_frequency(uint8_t data)
{
uint8_t address = SW_FREQ;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
PAVDD Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_PAVDD_ON_DELAY_time(uint8_t data)
{
uint8_t address = PAVDD_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
PAVDD Soft-start time Setting
0x00~0x07:5ms~40ms unit:5ms
*/
void fml_PAVDD_SOFT_START_time(uint8_t data)
{
uint8_t address = PAVDD_SOFT_START;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGL Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_VGL_ON_DELAY_time(uint8_t data)
{
uint8_t address = VGL_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGL Soft-start time Setting
0x00~0x07:3ms~24ms unit:3ms
*/
void fml_VGL_SOFT_START_time(uint8_t data)
{
uint8_t address = VGL_SOFT_START;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGH Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_VGH_ON_DELAY_time(uint8_t data)
{
uint8_t address = VGH_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGH Soft-start time Setting
0x00~0x03:5ms~20ms unit:5ms
*/
void fml_VGH_SOFT_START_time(uint8_t data)
{
uint8_t address = VGH_SOFT_START;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
NAVDD Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_NAVDD_ON_DELAY_time(uint8_t data)
{
uint8_t address = NAVDD_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
NAVDD Soft-start time Setting
0x00~0x07:5ms~40ms unit:5ms
*/
void fml_NAVDD_SOFT_START_time(uint8_t data)
{
uint8_t address = NAVDD_SOFT_START;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VCOM Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_VCOM_ON_DELAY_time(uint8_t data)
{
uint8_t address = VCOM_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
RESET Power-on Delay Time Setting
0x00~0x0F:0ms~75ms unit:5ms
*/
void fml_RESET_ON_DELAY_time(uint8_t data)
{
uint8_t address = RESET_ON_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
Power-off Delay Time Setting
0x00~0x0F:0ms~45ms unit:3ms
*/
void fml_POWER_OFF_DELAY_time(uint8_t data)
{
uint8_t address = POWER_OFF_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
OPTION1:
RESET goes low following power-off delay time or VGH channel turn off[7]
0:power-off delay 1VGH channel turn off
The voltage detector monitors the VIN voltage to
generate a RESET signal from RESET pin while VIN is
lower than the detecting level
detecting level:[6:5]
0x00UVLO Falling 0x012.1V 0x022.4V 0x032.7V
Discharge Function
PAVDD Discharge Function:[4]
NAVDD Discharge Function:[3]
VGH Discharge Function:[2]
VGL Discharge Function:[1]
VCOM Discharge Function:[0]
0ON 1OFF
*/
void fml_OPTION1_SETTING(uint8_t data)
{
uint8_t address = OPTION1;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
OPTION2:
PAVDD Slew Rate Setting:[7:6]
NAVDD Slew Rate Setting:[5:4]
VGL Slew Rate Setting:[3:2]
VGH Slew Rate Setting:[1:0]
0x00:Fast 0x01:Normal 0x02:Slow 0x03:Slowest
*/
void fml_SLEW_RATE_SETTING(uint8_t data)
{
uint8_t address = OPTION2;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
OPTION3:
VGL Internal/External Option[5]
0internal 1:external
frequency spread[4:3]
0x00off 0x01:3% 0x02:6%
Over Temperature Protection (OTP):[2]
Under Voltage Protection (UVP)[1]
Short Circuit Protection (SCP):[0]
0:ON 1:OFF
*/
void fml_OPTION3_SETTING(uint8_t data)
{
uint8_t address = OPTION3;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
Channel ON/OFF Option:
RESET EN:[5]
VCOM EN:[5]
NAVDD EN:[5]
VGH EN:[5]
VGL EN:[5]
PAVDD EN:[5]
0OFF 1: ON
*/
void fml_Channel_on_off_SETTING(uint8_t data)
{
uint8_t address = CHANNEL_ON_OFF_OPTION;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
Auto Refresh Functions
registers code auto recovery function if the registers code is changed abnormally
Auto Refresh Enable:[0]
0:off 1:on
Refreshing Time:[2:1]
0x00:0.25s 0x01:0.5s 0x02:0.75s 0x03:1s
FAULT Behavior:[3]
0Fault pin not output low 1Fault pin output low
*/
void fml_Auto_Refresh_SETTING(uint8_t data)
{
uint8_t address = AUTO_REFRESH_OPTION;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
PAVDD Off Delay Time[2:0]
0x00~0x07:0ms~14ms unit:2ms
*/
void fml_PAVDD_off_Delay_Time(uint8_t data)
{
uint8_t address = PAVDD_OFF_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
NAVDD Off Delay Time[2:0]
0x00~0x07:0ms~14ms unit:2ms
*/
void fml_NAVDD_off_Delay_Time(uint8_t data)
{
uint8_t address = NAVDD_OFF_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGH Off Delay Time[2:0]
0x00~0x07:0ms~14ms unit:2ms
*/
void fml_VGH_off_Delay_Time(uint8_t data)
{
uint8_t address = VGH_OFF_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
VGL Off Delay Time[2:0]
0x00~0x07:0ms~14ms unit:2ms
*/
void fml_VGL_off_Delay_Time(uint8_t data)
{
uint8_t address = VGL_OFF_DELAY;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}
/*
FAULT Analysis Clear Option[3]
0:Not Clear 1:Clear
VCOM Off Delay Time[2:0]
0x00~0x07:0ms~14ms unit:2ms
*/
void fml_FAULT_VCOM_off_Delay_Time(uint8_t data)
{
uint8_t address = FAULT_VCOM;
ACK = cola_device_write(g_pDev_pmic_iic,address,0,data);
}