1. 点屏示例(MIPI)

本章节主要介绍点亮MIPI VIDEO CPHY 6LANE接口的模组,显示 SD 卡.BMP 图片、程序代码产生的画面,按键上翻 下翻 切换画面、 ON/OFF 开关显示。

主要内容: - 1 硬件初始化

  • 2 初始化IO口,设置IO口电压。

  • 3 LCD 参数设置。包括接口模式,分辨率,RGB 时序(Video mode)

  • 4 加载画面。调用 SD 卡.BMP (必须是 24 位 bmp),和代码产生规则画面。

  • 5 写初始化代码。

  • 6 实现 按键“上翻”、“下翻”切换画面,ON/OFF 开关显示

注意

while 循环里需要放置10ms的延时,来维持系统的正常运行。

1.1. 硬件初始化

初始化K2000板载各种外设,电源板,背光板,信号板。

############硬件初始化###############
bsp_info = SHARP_Bsp_Init()
SHARP_user.Power_Flag = bsp_info.Power_Flag

1.2. 初始化IO口,设置IO口电压

设置IO口电压

SHARP_IOVOL_Set(SHARP_user.Power_Flag,1.8)

初始化IO口

REST = LCD_RST__IO_3
TP_RST = LCD_TP_RST

def IO_Configuration():
    user_io = str_user_io()
    user_io.IO_PIN = LCD_TXS_OE|REST|TP_RST
    user_io.IO_Mode = OUTPUT_DIR
    SHARP_UserIO_Conf(user_io)
    SHARP_UserIO_BitSet(LCD_TXS_OE)       #使能转换IC

def LCD_RST_1():
    SHARP_UserIO_BitSet(REST)
    SHARP_UserIO_BitSet(TP_RST)

def LCD_RST_0():
    SHARP_UserIO_BitReset(REST)
    SHARP_UserIO_BitReset(TP_RST)

1.3. LCD 屏幕参数设置

点屏前需要对屏幕参数设置,通过配置 mipi_panel_par 点屏参数类对象,并通过 SHARP_Display_Mipi_Init 方法生效。

点屏参数类 具体有以下几个参数:

pclk:屏幕pclk时钟 单位:Mhz,支持小数

h_active:水平同步信号的的有效像素

h_pulse_width:水平同步信号的脉冲宽度

h_front_porch: 水平同步信号的前沿

h_back_porch: 水平同步信号的前沿

v_active: 垂直同步信号的有效像素

v_pulse_width: 垂直同步信号的脉冲宽度

v_front_porch: 垂直同步信号的前沿

v_back_porch: 垂直同步信号的后沿

bit_mode: 数据位数

  • MiPi_18_BIT = 0 # 18 Bit

  • MiPi_24_BIT = 1 # 24 Bit

  • MiPi_30_BIT = 2 # 30 Bit

pclk_edge: pclk锁存边缘

  • MiPi_FALLING_EDGE = 0 # 下降沿锁存数据

  • MiPi_RISING_EDGE = 1 # 上升沿锁存数据

h_active_edge: 水平同步信号的有效电平

  • MiPi_LOW_ACTIVE = 0 # 低电平有效

  • MiPi_HIGH_ACTIVE = 1 # 高电平有效

v_active_edge: 垂直同步信号的有效电平

  • MiPi_LOW_ACTIVE = 0 # 低电平有效

  • MiPi_HIGH_ACTIVE = 1 # 高电平有效

de_active_edge: de脉冲有效电平

  • MiPi_LOW_ACTIVE = 0 # 低电平有效

  • MiPi_HIGH_ACTIVE = 1 # 高电平有效

HS_Mbps: High speed 传输速率

LP_Mbps: LOW Power 传输速率

Burst: 突发还是非突发

  • NONBURST_SYNC_PULSES = 0 # 非突发模式 sync pulses

  • NONBURST_SYNC_EVENTS = 1 # 非突发模式 sync events

  • BURST_MODE = 2 # 突发模式

CmdOrVideo: 数据包传输模式

  • VIDEO = 0 # Video模式

  • COMMAND = 1 # Command模式

  • V2C = 2 # V2C模式

TypeLane: DPHY或者CPHY类型 与 Lane数

  • D_PHY_1LANE = 0x11

  • D_PHY_2LANE = 0x12

  • D_PHY_3LANE = 0x13

  • D_PHY_4LANE = 0x14

  • D_PHY_8LANE = 0x18

  • C_PHY_1LANE = 0x21

  • C_PHY_2LANE = 0x22

  • C_PHY_3LANE = 0x23

  • C_PHY_6LANE = 0x26

PortDir: Port 口
  • AB_Port = 0

  • BA_Port = 1

Burst_AllLP: 突发模式下空闲进LP使能

更多详情可参考 MIPI点屏模块

def parameter_settings():
    MiPi_struct = mipi_panel_par()
    ''' 点屏参数配置 '''
    MiPi_struct.autoPanelFre = 120  # 屏幕刷新率 ,此值设置之后,pclk设置无效
    MiPi_struct.pclk = 400  # PCLK时钟
    MiPi_struct.HS_Mbps = 1200  # MIPI传输速率
    MiPi_struct.Burst = BURST_MODE  # 突发还是非突发
    MiPi_struct.CmdOrVideo = VIDEO  # Video还是Command模式
    MiPi_struct.TypeLane = C_PHY_6LANE  # DPHY或者CPHY类型与Lane数

    MiPi_struct.h_active = 1600  # 水平的有效像素
    MiPi_struct.h_back_porch = 50  # 水平的后沿
    MiPi_struct.h_front_porch = 50  # 水平的前沿
    MiPi_struct.h_pulse_width = 12  # 水平的脉冲

    MiPi_struct.v_active = 2560  # 垂直的有效像素
    MiPi_struct.v_back_porch = 237  # 垂直的后沿
    MiPi_struct.v_front_porch = 26  # 垂直的前沿
    MiPi_struct.v_pulse_width = 4  # 垂直的脉冲

    MiPi_struct.bit_mode = MiPi_24_BIT  # 数据位数
    MiPi_struct.pclk_edge = MiPi_FALLING_EDGE  # pclk锁存边缘
    MiPi_struct.h_active_edge = MiPi_LOW_ACTIVE  # h脉冲有效电平
    MiPi_struct.v_active_edge = MiPi_LOW_ACTIVE  # v脉冲有效电平
    MiPi_struct.de_active_edge = MiPi_HIGH_ACTIVE  # de脉冲有效电平

    SHARP_Display_Mipi_Init(MiPi_struct.autoPanelFre, MiPi_struct)

1.4. 加载画面

K2000的画面,需要开机先预加载。

  • 1.方法 SHARP_GPU_LoadFrame(frame) 用于声明要开始加载画面了,其参数指定了加载的画面为第几张画面。

  • 2.加载的画面数据可来自 SD 卡图片或程序代码产生的画面。

    • 加载来自 SD 卡的图像,可以为.bmp 格式的图片或经过转换的二进制(.BIN)文件。使用的方法为 SHARP_SDCard_BMP(file_name)SHARP_SDCard_BIN(file_name),这两个方法位于 通用上位机 模块中

    • 若要加载程序代码编写的画面,在 通用上位机 模块中 我们有提供了一些程序代码编写的规则画面.

  • 3.类对象 SHARP_user 里 列表 rame_hold_ms 表示切换画面时画面显示的时间,单位 ms。

  • 4.类对象 SHARP_user 里 变量 auto_switch_mode 表示画面模式, 0--手动 1--自动

注意

目前K2000还不支持预加载用户自行编写的画面,相信在不远的将来能实现这个功能。

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_Img_Full(255, 255, 255) # 白
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_Img_Block4(0x7F007F, 0x007F00, 0x7F007F, 0x007F00) # Flicker
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_SDCard_BMP('/sdcard/P2.bmp')
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_SDCard_BMP('/sdcard/P3.bmp')
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_SDCard_BMP('/sdcard/P4.bmp')
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

SHARP_GPU_LoadFrame(SHARP_user.frame_num)
SHARP_SDCard_BMP('/sdcard/6_beauty.bmp')
SHARP_user.frame_hold_ms.append(1000)
SHARP_user.frame_num += 1

1.5. 写初始化代码

写初始化代码使用的是方法 SHARP_MIPI_WR(mp_tuple),参数 mp_tuple为元组不定长数据,格式: mipi_data = ((0x29,0x11),(0x29,0x29))。

mipi_data = (
    (0x39, 0xFF, 0x20),
    (0x39, 0xFB, 0x01),
    (0x39, 0x58, 0x60),

    (0x39, 0xFF, 0xE0),
    (0x39, 0xFB, 0x01),
    # VCOM Driving Ability
    (0x39, 0x14, 0x60),
    (0x39, 0x16, 0xC0),
    # Forcing OSC2 enable
    (0x39, 0x4F, 0x02),

    # /

    # CMD3,PageB
    (0x39, 0xFF, 0xF0),
    (0x39, 0xFB, 0x01),
    # slave osc workaround
    (0x39, 0x3A, 0x08),

    # /

    # CMD3,PageC
    (0x39, 0xFF, 0xD0),
    (0x39, 0xFB, 0x01),
    (0x39, 0x1C, 0x88),
    (0x39, 0x1D, 0x08),

    # /

    # CMD1
    (0x39, 0xFF, 0x10),
    (0x39, 0xFB, 0x01),
    # Only Write Slave
    (0x39, 0xB9, 0x05),
    # CMD2,Page0
    (0x39, 0xFF, 0x20),
    (0x39, 0xFB, 0x01),
    (0x39, 0x18, 0x40),

    # CMD1
    (0x39, 0xFF, 0x10),
    (0x39, 0xFB, 0x01),
    # Write Master & Slave
    (0x39, 0xB9, 0x02),
    (0x39, 0x35, 0x00),
    (0x39, 0xBB, 0x13),
    # VBP+VFP=241+26=267
    (0x39, 0x3B, 0x03, 0xF1, 0x1A, 0x04, 0x04),
)
for i in mipi_data:
    SHARP_MIPI_WR(i)

1.6. 上下电控制

设置液晶模组所需的电源电压、背光电流,上下电顺序等。体现在 Display_ON_Trad() 和 Display_OFF()两个函数。

设置电源电压

设置某VDD通道电压使用的方法为 SHARP_POWER_SetVDD(group, ch, v)

group:选中板子。类对象 SHARP_user里的变量 Power_Flag 为默认已接上的板子。 ch :通道号, =1 代表VDD1 v :要输出的电压值,单位V,精度 0.1V

更多电源功能函数使用可参考 电源板功能

输出图像信号

输出MIPI图像信号使用的方法为 SHARP_UserMipi_ON(index = None)

def Display_ON_Trad():
    SHARP_DEBUG("Display_ON ...\n")

############### 设置各路电压上限 ################

    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,1,300)
    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,4,200)
    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,5,200)


############### 设置电压 ################
    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 1, 1.8)
    if ret !=0:
        print('  VDD%d NG'%(1))
    SHARP_Delay_ms(20)

    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 4,5.5)
    if ret !=0:
        print('  VDD%d NG'%(4))
    SHARP_Delay_ms(10)

    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 5,-5.5)
    if ret !=0:
        print('  VDD%d NG'%(5))
    SHARP_Delay_ms(20)

############### 上电时序 ################
    LCD_RST_1()
    SHARP_Delay_ms(50)
    LCD_RST_0()
    SHARP_Delay_ms(50)
    LCD_RST_1()
    SHARP_Delay_ms(50)


    # 切换画面
    SwitchFrame(SHARP_user.frame)

    # 开启信号源发送
    SHARP_UserMipi_ON()

    SHARP_SSD28_LP()

############### 写初始化代码 ################

    MIPI_Init_Short()
    # MIPI_Init()

    SHARP_Delay_ms(120)
    SHARP_MIPI_WR((0x39, 0x11))
    SHARP_Delay_ms(150)
    SHARP_MIPI_WR((0x39, 0x29))

    SHARP_MIPI_WR((0x39, 0xFF, 0x20))
    SHARP_MIPI_WR((0x39, 0xFB, 0x01))
    SHARP_Delay_ms(50)

    SHARP_MIPI_WR((0x39, 0x37, 0x01))
    SHARP_Delay_ms(20)
    SHARP_MIPI_WR((0x39, 0x37, 0x00))


    SHARP_SSD28_EnterConfigMode()
    SHARP_Delay_ms(100)

############### 设置背光电流 ################
    SHARP_LED_SetI(SHARP_user.Power_Flag,1, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,2, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,3, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,4, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,5, 24)

    SHARP_Set_blHorL(SHARP_user.Power_Flag,1)

############### 打开背光 ################
    #ret--电源板通信标准位    Error_info--错误信息 -1:电源板通信失败 -49: 断路  -17: 阳极短地 -33: 阳极短高 -65: 阴极短地
    ret,Error_info = SHARP_LED_ON(SHARP_user.Power_Flag,1)
    for i in range(4):      #适用一拖四 Error_info[0] 1号机 Error_info[0] 1号机
        if Error_info[i]<0:
            print('LED_ON %d NG Error = %d'%(i,Error_info[i]))

    SHARP_user.display_on = 1
    SHARP_DEBUG("Display_ON END\n")



def Display_OFF():

    SHARP_user.display_on = 0
    SHARP_user.frame = 0
    SHARP_DEBUG("Display_OFF  ...\n")

    res=SHARP_LED_OFF(SHARP_user.Power_Flag)
    SHARP_DEBUG("LED_OFF res=%d\r\n"%res)

    SHARP_MIPI_WR((0x39, 0XFF, 0X10))
    SHARP_MIPI_WR((0x05, 0x28))
    SHARP_Delay_ms(20)
    SHARP_MIPI_WR((0x05, 0x10))
    SHARP_Delay_ms(120)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 5, 0)
    SHARP_Delay_ms(70)

    LCD_RST_0()
    SHARP_Delay_ms(15)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 4, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 2, 0)
    SHARP_Delay_ms(20)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 1, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 3, 0)
    SHARP_Delay_ms(10)


    SHARP_UserMipi_OFF()
    SHARP_DEBUG("Display_OFF END\n")

1.7. 按键控制程序

按键需要实时回读,实时处理.因此需要放在while循环里执行。

#按键读
while True:

    SHARP_Delay_ms(10)

    key_str = SHARP_read_key_lift(500)

    if key_str.find('key_onoff_lift') != -1:

        if SHARP_user.display_on == 0 :
            print('KEY_ON')
            # 上电时序
            Display_ON_Trad()
            SHARP_user.display_on = 1
            frame_hold_cnt = SHARP_MeasureTimeStart_ms()
        else :
            print('KEY_OFF')
            # 下电时序
            Display_OFF()


    elif key_str.find('key_down_lift') != -1:

        if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
            if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
                frame_hold_cnt = SHARP_MeasureTimeStart_ms()
                print('KEY_DOWN')
                SHARP_user.frame += 1
                if  SHARP_user.frame >= SHARP_user.frame_num :
                    SHARP_user.frame = 0

                # print('frame = %d' %( SHARP_user.frame))
                SwitchFrame(SHARP_user.frame)

    elif key_str.find('key_up_lift') != -1:
        print('KEY_UP')
        if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
            if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
                frame_hold_cnt = SHARP_MeasureTimeStart_ms()
                print('KEY_UP')
                if SHARP_user.frame == 0 :
                    SHARP_user.frame = SHARP_user.frame_num - 1
                else :
                    SHARP_user.frame -= 1
                SwitchFrame(SHARP_user.frame)

    elif key_str.find('key_enter_lift') != -1:
        print('KEY_enter')


    elif key_str.find('key_add_lift') != -1:
        print('KEY5_add')
        SHARP_user.auto_switch_mode = 1

    elif key_str.find('key_sub_lift') != -1:
        print('KEY6_sub')
        SHARP_user.auto_switch_mode = 0

    elif key_str.find('key_spare_lift') != -1:
        print('key_spare_lift')

    if SHARP_user.auto_switch_mode == 1 and SHARP_user.display_on == 1 :
        if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
            frame_hold_cnt = SHARP_MeasureTimeStart_ms()
            if SHARP_user.frame < (SHARP_user.frame_num - 1) :
                SHARP_user.frame += 1
            else :
                SHARP_user.frame = 0
            SwitchFrame(SHARP_user.frame)

1.8. 整体点屏示例

from mp_img import *
from mp_gpu import *
from mp_user import *
from mp_power import *
from mp_display_mipi import *
from mp_bsp_init import *

REST = LCD_RST__IO_3
TP_RST = LCD_TP_RST

class User_Fun():
    Power_Flag = 0
    Backlight_Flag = 0,
    frame = 0
    frame_num = 0
    display_on = 0
    auto_switch_mode = 0  # 画面模式  =0 手动  =1 自动
    frame_hold_ms = []  # 画面保持时间 ,在LoadFrame() 函数中赋值


def IO_Configuration():
    user_io = str_user_io()
    user_io.IO_PIN = LCD_TXS_OE|REST|TP_RST
    user_io.IO_Mode = OUTPUT_DIR
    SHARP_UserIO_Conf(user_io)
    SHARP_UserIO_BitSet(LCD_TXS_OE)       #使能转换IC

def LCD_RST_1():
    SHARP_UserIO_BitSet(REST)
    SHARP_UserIO_BitSet(TP_RST)

def LCD_RST_0():
    SHARP_UserIO_BitReset(REST)
    SHARP_UserIO_BitReset(TP_RST)

def parameter_settings():
    MiPi_struct = mipi_panel_par()
    ''' 点屏参数配置 '''
    MiPi_struct.autoPanelFre = 120  # 屏幕刷新率 ,此值设置之后,pclk设置无效
    MiPi_struct.pclk = 400  # PCLK时钟
    MiPi_struct.HS_Mbps = 1200  # MIPI传输速率
    MiPi_struct.Burst = BURST_MODE  # 突发还是非突发
    MiPi_struct.CmdOrVideo = VIDEO  # Video还是Command模式
    MiPi_struct.TypeLane = C_PHY_6LANE  # DPHY或者CPHY类型与Lane数

    MiPi_struct.h_active = 1600  # 水平的有效像素
    MiPi_struct.h_back_porch = 50  # 水平的后沿
    MiPi_struct.h_front_porch = 50  # 水平的前沿
    MiPi_struct.h_pulse_width = 12  # 水平的脉冲

    MiPi_struct.v_active = 2560  # 垂直的有效像素
    MiPi_struct.v_back_porch = 237  # 垂直的后沿
    MiPi_struct.v_front_porch = 26  # 垂直的前沿
    MiPi_struct.v_pulse_width = 4  # 垂直的脉冲

    MiPi_struct.bit_mode = MiPi_24_BIT  # 数据位数
    MiPi_struct.pclk_edge = MiPi_FALLING_EDGE  # pclk锁存边缘
    MiPi_struct.h_active_edge = MiPi_LOW_ACTIVE  # h脉冲有效电平
    MiPi_struct.v_active_edge = MiPi_LOW_ACTIVE  # v脉冲有效电平
    MiPi_struct.de_active_edge = MiPi_HIGH_ACTIVE  # de脉冲有效电平

    SHARP_Display_Mipi_Init(MiPi_struct.autoPanelFre, MiPi_struct)


# 加载图片
def LoadFrame():
    SHARP_DEBUG("Load image..")

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(255, 255, 255) # 白
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Block4(0x7F007F, 0x007F00, 0x7F007F, 0x007F00) # Flicker
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_SDCard_BMP('/sdcard/P2.bmp')
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_SDCard_BMP('/sdcard/P3.bmp')
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_SDCard_BMP('/sdcard/P4.bmp')
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_SDCard_BMP('/sdcard/6_beauty.bmp')
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1


    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(127, 127, 127) # 灰
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(0, 0, 0) # 黑
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(255, 0, 0) # 红
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(0, 255, 0) # 绿
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Full(0, 0, 255) # 蓝
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Gray256_V() # 灰阶
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Checker(9,12)
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Box()
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1


    SHARP_GPU_LoadFrame(SHARP_user.frame_num)
    SHARP_Img_Gray256_H()
    SHARP_user.frame_hold_ms.append(1000)
    SHARP_user.frame_num += 1

    DEBUG("   OK\n")

def SwitchFrame(frame):
    # 切图之前
    # FrameBefor(frame)

    SHARP_SSD28_DisplayFrame(frame)  # 切图

    # 切图之后
    # FrameAfter(frame)


def  run():

    ############硬件初始化###############
    bsp_info = Sky_Bsp_Init()
    SHARP_user.Power_Flag = bsp_info.Power_Flag
    SHARP_IOVOL_Set(SHARP_user.Power_Flag,1.8)

    ############显示工程名###############
    project_name='MIPI_VIDEO_CPHY_6LANE_DEMO'
    SHARP_box_ui_Project_Name_Page3(project_name)

    IO_Configuration()

    ############屏幕参数配置 ################
    parameter_settings()

    ############ 加载图片 ################
    LoadFrame()

    while True:
        try:
            run_while()

        except ITException as e:    #IO口中断异常处理  不可修改

            SHARP_DEBUG("ITException ERR\r")

        except Exception as e:      #其他异常处理   不可修改

            ##异常里执行的功能  用户可自行更改
            SHARP_DEBUG("Exception ERR\r")
            raise e #上报错误信息

def run_while():

    Display_OFF()
    SHARP_MONITOR_SetBee(SHARP_user.Power_Flag,1)
    SHARP_Delay_ms(500)
    SHARP_MONITOR_SetBee(SHARP_user.Power_Flag,0)

    #按键读
    while True:

        SHARP_Delay_ms(10)

        key_str = SHARP_read_key_lift(500)

        if key_str.find('key_onoff_lift') != -1:

            if SHARP_user.display_on == 0 :
                print('KEY_ON')
                # 上电时序
                Display_ON_Trad()
                SHARP_user.display_on = 1
                frame_hold_cnt = SHARP_MeasureTimeStart_ms()
            else :
                print('KEY_OFF')
                # 下电时序
                Display_OFF()


        elif key_str.find('key_down_lift') != -1:

            if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
                if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
                    frame_hold_cnt = SHARP_MeasureTimeStart_ms()
                    print('KEY_DOWN')
                    SHARP_user.frame += 1
                    if  SHARP_user.frame >= SHARP_user.frame_num :
                        SHARP_user.frame = 0

                    # print('frame = %d' %( SHARP_user.frame))
                    SwitchFrame(SHARP_user.frame)

        elif key_str.find('key_up_lift') != -1:
            print('KEY_UP')
            if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
                if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
                    frame_hold_cnt = SHARP_MeasureTimeStart_ms()
                    print('KEY_UP')
                    if SHARP_user.frame == 0 :
                        SHARP_user.frame = SHARP_user.frame_num - 1
                    else :
                        SHARP_user.frame -= 1
                    SwitchFrame(SHARP_user.frame)

        elif key_str.find('key_enter_lift') != -1:
            print('KEY_enter')


        elif key_str.find('key_add_lift') != -1:
            print('KEY5_add')
            SHARP_user.auto_switch_mode = 1

        elif key_str.find('key_sub_lift') != -1:
            print('KEY6_sub')
            SHARP_user.auto_switch_mode = 0

        elif key_str.find('key_spare_lift') != -1:
            print('key_spare_lift')

        if SHARP_user.auto_switch_mode == 1 and SHARP_user.display_on == 1 :
            if SHARP_GetMeasureTime_ms(frame_hold_cnt) >= SHARP_user.frame_hold_ms[SHARP_user.frame] :
                frame_hold_cnt = SHARP_MeasureTimeStart_ms()
                if SHARP_user.frame < (SHARP_user.frame_num - 1) :
                    SHARP_user.frame += 1
                else :
                    SHARP_user.frame = 0
                SwitchFrame(SHARP_user.frame)


# 传统上电模式
def Display_ON_Trad():
    DEBUG("Display_ON ...\n")

############### 设置各路电压上限 ################

    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,1,300)
    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,4,200)
    SHARP_POWER_SetVDDLimit(SHARP_user.Power_Flag,5,200)


############### 设置电压 ################
    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 1, 1.8)
    if ret !=0:
        print('  VDD%d NG'%(1))
    SHARP_Delay_ms(20)

    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 4,5.5)
    if ret !=0:
        print('  VDD%d NG'%(4))
    SHARP_Delay_ms(10)

    ret=SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 5,-5.5)
    if ret !=0:
        print('  VDD%d NG'%(5))
    SHARP_Delay_ms(20)

############### 上电时序 ################
    LCD_RST_1()
    SHARP_Delay_ms(50)
    LCD_RST_0()
    SHARP_Delay_ms(50)
    LCD_RST_1()
    SHARP_Delay_ms(50)


    # 切换画面
    SwitchFrame(SHARP_user.frame)

    # 开启信号源发送
    SHARP_UserMipi_ON()

    SHARP_SSD28_LP()

############### 写初始化代码 ################

    MIPI_Init_Short()
    # MIPI_Init()

    SHARP_Delay_ms(120)
    SHARP_MIPI_WR((0x39, 0x11))
    SHARP_Delay_ms(150)
    SHARP_MIPI_WR((0x39, 0x29))

    SHARP_MIPI_WR((0x39, 0xFF, 0x20))
    SHARP_MIPI_WR((0x39, 0xFB, 0x01))
    SHARP_Delay_ms(50)

    SHARP_MIPI_WR((0x39, 0x37, 0x01))
    SHARP_Delay_ms(20)
    SHARP_MIPI_WR((0x39, 0x37, 0x00))


    SHARP_SSD28_EnterConfigMode()
    SHARP_Delay_ms(100)

############### 设置背光电流 ################
    SHARP_LED_SetI(SHARP_user.Power_Flag,1, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,2, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,3, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,4, 24)
    SHARP_LED_SetI(SHARP_user.Power_Flag,5, 24)

    SHARP_Set_blHorL(SHARP_user.Power_Flag,1)

############### 打开背光 ################
    #ret--电源板通信标准位    Error_info--错误信息 -1:电源板通信失败 -49: 断路  -17: 阳极短地 -33: 阳极短高 -65: 阴极短地
    ret,Error_info = LED_ON(SHARP_user.Power_Flag,1)
    for i in range(4):      #适用一拖四 Error_info[0] 1号机 Error_info[0] 1号机
        if Error_info[i]<0:
            print('LED_ON %d NG Error = %d'%(i,Error_info[i]))

    SHARP_user.display_on = 1
    DEBUG("Display_ON END\n")



# 下电时序
def Display_OFF():

    SHARP_user.display_on = 0
    SHARP_user.frame = 0
    SHARP_DEBUG("Display_OFF  ...\n")

    res=SHARP_LED_OFF(SHARP_user.Power_Flag)
    SHARP_DEBUG("LED_OFF res=%d\r\n"%res)

    SHARP_MIPI_WR((0x39, 0XFF, 0X10))
    SHARP_MIPI_WR((0x05, 0x28))
    SHARP_Delay_ms(20)
    SHARP_MIPI_WR((0x05, 0x10))
    SHARP_Delay_ms(120)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 5, 0)
    SHARP_Delay_ms(70)

    LCD_RST_0()
    SHARP_Delay_ms(15)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 4, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 2, 0)
    SHARP_Delay_ms(20)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 1, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 3, 0)
    SHARP_Delay_ms(10)


    SHARP_UserMipi_OFF()
    SHARP_DEBUG("Display_OFF END\n")


def MIPI_Init_Short():

    mipi_data = (
        (0x39, 0xFF, 0x20),
        (0x39, 0xFB, 0x01),
        (0x39, 0x58, 0x60),

        (0x39, 0xFF, 0xE0),
        (0x39, 0xFB, 0x01),
        # VCOM Driving Ability
        (0x39, 0x14, 0x60),
        (0x39, 0x16, 0xC0),
        # Forcing OSC2 enable
        (0x39, 0x4F, 0x02),

        # /

        # CMD3,PageB
        (0x39, 0xFF, 0xF0),
        (0x39, 0xFB, 0x01),
        # slave osc workaround
        (0x39, 0x3A, 0x08),

        # /

        # CMD3,PageC
        (0x39, 0xFF, 0xD0),
        (0x39, 0xFB, 0x01),
        (0x39, 0x1C, 0x88),
        (0x39, 0x1D, 0x08),

        # /

        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Only Write Slave
        (0x39, 0xB9, 0x05),
        # CMD2,Page0
        (0x39, 0xFF, 0x20),
        (0x39, 0xFB, 0x01),
        (0x39, 0x18, 0x40),

        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Write Master & Slave
        (0x39, 0xB9, 0x02),
        (0x39, 0x35, 0x00),
        (0x39, 0xBB, 0x13),
        # VBP+VFP=241+26=267
        (0x39, 0x3B, 0x03, 0xF1, 0x1A, 0x04, 0x04),
    )
    for i in mipi_data:
        SHARP_MIPI_WR(i)
    ##################回读######################################
    for i in range (SHARP_VerMan_GetMasterBoardTotal()):
        SHARP_VerMan_MasterIndexEnable(i)         #选中某块信号板
        for j in range(1,3):
            SHARP_SSD28_SelectRead(j)             # 选择读端口
            read_data = SHARP_SSD28_DcsReadDT06(0x54, 1)
            SHARP_DEBUG('%d = 0x%02x' % (j, read_data[0]))

    SHARP_VerMan_MasterAllEnable()

def MIPI_Init():

    mipi_data = (

        (0x39, 0xFF, 0x20),
        (0x39, 0xFB, 0x01),
        (0x39, 0x05, 0x69),
        # VGH=10V
        (0x39, 0x07, 0x32),
        # VGL=-10V
        (0x39, 0x08, 0x32),
        # EN_VMODGATE2=1
        (0x39, 0x0D, 0x63),
        # VGH=8V
        (0x39, 0x0E, 0x41),
        # VGL=-8V
        (0x39, 0x0F, 0x41),
        # VCOM=-0.2V
        #            (0x39,0x89,0x2B
        #            (0x39,0x8A,0x2B
        #            (0x39,0x8B,0x2B
        #            (0x39,0x8C,0x2B
        # GVDD=5V
        (0x39, 0x94, 0x00),
        (0x39, 0x95, 0xD7),
        (0x39, 0x96, 0xD7),

        # ISOP
        (0x39, 0x6D, 0xAA),

        # OPPO ID
        (0x39, 0x44, 0x82),

        # EN_GMACP
        (0x39, 0x75, 0xC4),

        # V128
        (0x39, 0x77, 0xB3),

        # /
        # GAMMA

        (0x39, 0xB0, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4F, 0x00,
            0x71, 0x00, 0x8F, 0x00, 0xA8, 0x00, 0xBF, 0x00, 0xD2),
        (0x39, 0xB1, 0x00, 0xE3, 0x01, 0x1D, 0x01, 0x4A, 0x01,
            0x8A, 0x01, 0xB9, 0x02, 0x04, 0x02, 0x42, 0x02, 0x44),
        (0x39, 0xB2, 0x02, 0x7E, 0x02, 0xBD, 0x02, 0xE8, 0x03,
            0x1C, 0x03, 0x40, 0x03, 0x6B, 0x03, 0x7B, 0x03, 0x8B),
        (0x39, 0xB3, 0x03, 0x9C, 0x03, 0xAD, 0x03,
            0xC6, 0x03, 0xE0, 0x03, 0xF9, 0x03, 0xFF),
        # G(+)
        (0x39, 0xB4, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4F, 0x00,
            0x71, 0x00, 0x8F, 0x00, 0xA8, 0x00, 0xBF, 0x00, 0xD2),
        (0x39, 0xB5, 0x00, 0xE3, 0x01, 0x1D, 0x01, 0x4A, 0x01,
            0x8A, 0x01, 0xB9, 0x02, 0x04, 0x02, 0x42, 0x02, 0x44),
        (0x39, 0xB6, 0x02, 0x7E, 0x02, 0xBD, 0x02, 0xE8, 0x03,
            0x1C, 0x03, 0x40, 0x03, 0x6B, 0x03, 0x7B, 0x03, 0x8B),
        (0x39, 0xB7, 0x03, 0x9C, 0x03, 0xAD, 0x03,
            0xC6, 0x03, 0xE0, 0x03, 0xF9, 0x03, 0xFF),
        # B(+)
        (0x39, 0xB8, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4F, 0x00,
            0x71, 0x00, 0x8F, 0x00, 0xA8, 0x00, 0xBF, 0x00, 0xD2),
        (0x39, 0xB9, 0x00, 0xE3, 0x01, 0x1D, 0x01, 0x4A, 0x01,
            0x8A, 0x01, 0xB9, 0x02, 0x04, 0x02, 0x42, 0x02, 0x44),
        (0x39, 0xBA, 0x02, 0x7E, 0x02, 0xBD, 0x02, 0xE8, 0x03,
            0x1C, 0x03, 0x40, 0x03, 0x6B, 0x03, 0x7B, 0x03, 0x8B),
        (0x39, 0xBB, 0x03, 0x9C, 0x03, 0xAD, 0x03,
            0xC6, 0x03, 0xE0, 0x03, 0xF9, 0x03, 0xFF),

        # R+C1
        (0x39, 0xC6, 0x11),
        (0x39, 0xC7, 0x11),
        (0x39, 0xC8, 0x11),
        (0x39, 0xC9, 0x11),
        (0x39, 0xCA, 0x11),
        # R-C1
        (0x39, 0xCB, 0x11),
        (0x39, 0xCC, 0x11),
        (0x39, 0xCD, 0x11),
        (0x39, 0xCE, 0x11),
        (0x39, 0xCF, 0x11),
        # G+C1
        (0x39, 0xD0, 0x11),
        (0x39, 0xD1, 0x11),
        (0x39, 0xD2, 0x11),
        (0x39, 0xD3, 0x11),
        (0x39, 0xD4, 0x11),
        # G-C1
        (0x39, 0xD5, 0x11),
        (0x39, 0xD6, 0x11),
        (0x39, 0xD7, 0x11),
        (0x39, 0xD8, 0x11),
        (0x39, 0xD9, 0x11),
        # B+C1
        (0x39, 0xDA, 0x11),
        (0x39, 0xDB, 0x11),
        (0x39, 0xDC, 0x11),
        (0x39, 0xDD, 0x11),
        (0x39, 0xDE, 0x11),
        # B-C1
        (0x39, 0xDF, 0x11),
        (0x39, 0xE0, 0x11),
        (0x39, 0xE1, 0x11),
        (0x39, 0xE2, 0x11),
        (0x39, 0xE3, 0x11),

        (0x39, 0xFF, 0x21),
        (0x39, 0xFB, 0x01),
        # R(-)
        (0x39, 0xB0, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x47, 0x00,
            0x69, 0x00, 0x87, 0x00, 0xA0, 0x00, 0xB7, 0x00, 0xCA),
        (0x39, 0xB1, 0x00, 0xDB, 0x01, 0x15, 0x01, 0x42, 0x01,
            0x82, 0x01, 0xB1, 0x01, 0xFC, 0x02, 0x3A, 0x02, 0x3C),
        (0x39, 0xB2, 0x02, 0x76, 0x02, 0xB5, 0x02, 0xE0, 0x03,
            0x14, 0x03, 0x38, 0x03, 0x63, 0x03, 0x73, 0x03, 0x83),
        (0x39, 0xB3, 0x03, 0x94, 0x03, 0xA5, 0x03,
            0xBE, 0x03, 0xD8, 0x03, 0xF1, 0x03, 0xF7),
        # G(-)
        (0x39, 0xB4, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x47, 0x00,
            0x69, 0x00, 0x87, 0x00, 0xA0, 0x00, 0xB7, 0x00, 0xCA),
        (0x39, 0xB5, 0x00, 0xDB, 0x01, 0x15, 0x01, 0x42, 0x01,
            0x82, 0x01, 0xB1, 0x01, 0xFC, 0x02, 0x3A, 0x02, 0x3C),
        (0x39, 0xB6, 0x02, 0x76, 0x02, 0xB5, 0x02, 0xE0, 0x03,
            0x14, 0x03, 0x38, 0x03, 0x63, 0x03, 0x73, 0x03, 0x83),
        (0x39, 0xB7, 0x03, 0x94, 0x03, 0xA5, 0x03,
            0xBE, 0x03, 0xD8, 0x03, 0xF1, 0x03, 0xF7),
        # B(-)
        (0x39, 0xB8, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x47, 0x00,
            0x69, 0x00, 0x87, 0x00, 0xA0, 0x00, 0xB7, 0x00, 0xCA),
        (0x39, 0xB9, 0x00, 0xDB, 0x01, 0x15, 0x01, 0x42, 0x01,
            0x82, 0x01, 0xB1, 0x01, 0xFC, 0x02, 0x3A, 0x02, 0x3C),
        (0x39, 0xBA, 0x02, 0x76, 0x02, 0xB5, 0x02, 0xE0, 0x03,
            0x14, 0x03, 0x38, 0x03, 0x63, 0x03, 0x73, 0x03, 0x83),
        (0x39, 0xBB, 0x03, 0x94, 0x03, 0xA5, 0x03,
            0xBE, 0x03, 0xD8, 0x03, 0xF1, 0x03, 0xF7),

        # /
        (0x39, 0xFF, 0x23),
        (0x39, 0xFB, 0x01),
        (0x39, 0xA3, 0x50),

        # /
        (0x39, 0xFF, 0x24),
        (0x39, 0xFB, 0x01),

        # Hi-Z
        (0x39, 0x00, 0x03),
        # CTSW_VCOM(VEN2)
        (0x39, 0x01, 0x27),
        # CTSW_VCOM(VEN2)
        (0x39, 0x02, 0x27),
        # CTSW_VCOM_E(VEN2)
        (0x39, 0x03, 0x27),
        # CTSW_R
        (0x39, 0x04, 0x00),
        # CTSW_G
        (0x39, 0x05, 0x00),
        # CTSW_B
        (0x39, 0x06, 0x00),
        # STV1
        (0x39, 0x07, 0x04),
        # STV2
        (0x39, 0x08, 0x05),
        # CNB(UD2)
        (0x39, 0x09, 0x23),
        # CN(UD1)
        (0x39, 0x0A, 0x22),
        # VGH_G(VEN3)
        (0x39, 0x0B, 0x28),
        # VGH_G(VEN3)
        (0x39, 0x0C, 0x28),
        # RESET(GCL)
        (0x39, 0x0D, 0x21),
        # VGL_G(STV_TP_S1)
        (0x39, 0x0E, 0x29),
        # VGL_G(STV_TP_S1)
        (0x39, 0x0F, 0x29),
        # CK1
        (0x39, 0x10, 0x0C),
        # CK2
        (0x39, 0x11, 0x0D),
        # CK3
        (0x39, 0x12, 0x0E),
        # CK4
        (0x39, 0x13, 0x0F),
        # EN_TOUCH(VEN1)
        (0x39, 0x14, 0x26),
        # EN_TOUCH(VEN1)
        (0x39, 0x15, 0x26),

        # Hi-Z
        (0x39, 0x16, 0x03),
        # CTSW_VCOM(VEN2)
        (0x39, 0x17, 0x27),
        # CTSW_VCOM(VEN2)
        (0x39, 0x18, 0x27),
        # CTSW_VCOM_E(VEN2)
        (0x39, 0x19, 0x27),
        # CTSW_R
        (0x39, 0x1A, 0x00),
        # CTSW_G
        (0x39, 0x1B, 0x00),
        # CTSW_B
        (0x39, 0x1C, 0x00),
        # STV1
        (0x39, 0x1D, 0x04),
        # STV2
        (0x39, 0x1E, 0x05),
        # CNB(UD2)
        (0x39, 0x1F, 0x23),
        # CN(UD1)
        (0x39, 0x20, 0x22),
        # VGH_G(VEN3)
        (0x39, 0x21, 0x28),
        # VGH_G(VEN3)
        (0x39, 0x22, 0x28),
        # RESET(GCL)
        (0x39, 0x23, 0x21),
        # VGL_G(STV_TP_S1)
        (0x39, 0x24, 0x29),
        # VGL_G(STV_TP_S1)
        (0x39, 0x25, 0x29),
        # CK1
        (0x39, 0x26, 0x0C),
        # CK2
        (0x39, 0x27, 0x0D),
        # CK3
        (0x39, 0x28, 0x0E),
        # CK4
        (0x39, 0x29, 0x0F),
        # EN_TOUCH(VEN1)
        (0x39, 0x2A, 0x26),
        # EN_TOUCH(VEN1)
        (0x39, 0x2B, 0x26),

        # STV
        (0x39, 0x2F, 0x02),
        (0x39, 0x30, 0x01),
        (0x39, 0x33, 0x01),
        (0x39, 0x34, 0x02),
        (0x39, 0x37, 0x22),
        (0x39, 0x39, 0x00),
        (0x39, 0x3A, 0x01),
        (0x39, 0x3B, 0x40),
        (0x39, 0x3D, 0x02),

        # CK
        (0x39, 0x4D, 0x43),
        (0x39, 0x4E, 0x21),
        (0x39, 0x51, 0x12),
        (0x39, 0x52, 0x34),
        (0x39, 0x55, 0x0B, 0x0B),
        (0x39, 0x56, 0x04),
        (0x39, 0x58, 0x10),
        (0x39, 0x59, 0x20),
        (0x39, 0x5A, 0x43),
        (0x39, 0x5B, 0x3C),
        (0x39, 0x5E, 0x00, 0x0B),
        (0x39, 0x5F, 0x00),

        # EN_LFD_SOURCE=0
        (0x39, 0x65, 0x82),

        # EN_TOUCH, CTSW_VCOM, VGH_G
        (0x39, 0x96, 0x73),

        # RESET
        (0x39, 0xB1, 0x0E),
        (0x39, 0xB2, 0x0D),

        # CN,CNB
        (0x39, 0xC4, 0x2F),

        (0x39, 0xB6, 0x05, 0x00, 0x05, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00),

        # Resolution (1600RGBx2560)
        (0x39, 0x60, 0xC8),
        (0x39, 0x61, 0x00),
        (0x39, 0x63, 0xA0),

        (0x39, 0x91, 0x40),
        (0x39, 0x92, 0x45),
        (0x39, 0x93, 0x1A),
        (0x39, 0x94, 0xF6),

        # Choose hclk from OSC2
        (0x39, 0x95, 0x81),
        # Suppot backward scan
        (0x39, 0xAB, 0x22),
        # SOG_HBP
        (0x39, 0xD7, 0x55),
        (0x39, 0xDA, 0x0A),
        (0x39, 0xDE, 0x08),

        # Normal
        (0x39, 0xDB, 0x71),
        (0x39, 0xDC, 0x45),
        (0x39, 0xDD, 0x22),
        # Line N
        (0x39, 0xDF, 0x01),
        (0x39, 0xE0, 0x45),
        # Line N+1
        (0x39, 0xE1, 0x01),
        (0x39, 0xE2, 0x45),
        # TP0
        (0x39, 0xE3, 0x01),
        (0x39, 0xE4, 0x45),
        # TP3
        (0x39, 0xE5, 0x01),
        (0x39, 0xE6, 0x45),

        # Gate EQ
        # Normal
        (0x39, 0x5C, 0x00),
        (0x39, 0x5D, 0x00),
        # TP3
        (0x39, 0x8D, 0x00),
        (0x39, 0x8E, 0x00),

        # No Sync @ TP
        (0x39, 0xB5, 0x90),

        # vd_drop
        (0x39, 0xC2, 0xDF),

        # /
        (0x39, 0xFF, 0x25),
        (0x39, 0xFB, 0x01),

        # disable auto_vbp_vfp
        (0x39, 0x05, 0x00),

        # ESD_DET_ERR_SEL
        (0x39, 0x19, 0x07),

        # DP_N_GCK
        (0x39, 0x1F, 0x43),
        (0x39, 0x20, 0x3C),

        # DP_N_1_GCK
        (0x39, 0x26, 0x43),
        (0x39, 0x27, 0x3C),

        # TP0_GCK
        (0x39, 0x33, 0x43),
        (0x39, 0x34, 0x3C),

        # TP3 GCK/MUX=1
        (0x39, 0x3F, 0x00),

        # TP3_GCK_START_LINE
        #            (0x39,0x40,0x02),

        # TP3_STV
        (0x39, 0x44, 0x00),
        (0x39, 0x45, 0x45),

        # TP3_GCK
        (0x39, 0x48, 0x43),
        (0x39, 0x49, 0x3C),

        # LSTP0
        (0x39, 0x5B, 0x00),
        (0x39, 0x5C, 0x00),
        (0x39, 0x5D, 0x00),
        (0x39, 0x5E, 0xD0),

        (0x39, 0x61, 0x43),
        (0x39, 0x62, 0x3C),

        # en_vfp_addvsync
        (0x39, 0xF1, 0x10),

        # CMD2,Page10
        (0x39, 0xFF, 0x2A),
        (0x39, 0xFB, 0x01),

        # PWRONOFF
        # STV
        (0x39, 0x64, 0x96),
        # GCK
        (0x39, 0x6A, 0x9E),
        # RESET(GCL)
        (0x39, 0x76, 0x9E),
        # CN(UD1)
        (0x39, 0x79, 0x96),
        # CNB(UD2)
        (0x39, 0x7C, 0x96),
        # EN_TOUCH(VEN1)
        (0x39, 0x7F, 0x96),
        # CTSW_VCOM(VEN2)
        (0x39, 0x82, 0x16),
        # VGH_G(VEN3)
        (0x39, 0x85, 0x9E),
        # VGL_G(STV_TP_S1)
        (0x39, 0x88, 0x96),

        # ABOFF
        (0x39, 0xA2, 0xFF),
        (0x39, 0xA3, 0xFF),
        (0x39, 0xA4, 0xF3),
        (0x39, 0xA5, 0xFF),

        # Long_V_TIMING disable
        (0x39, 0xD6, 0x08),

        # CMD2,Page6
        (0x39, 0xFF, 0x26),
        (0x39, 0xFB, 0x01),
        # TPEN
        (0x39, 0x00, 0x81),
        # Timing Table A
        (0x39, 0x01, 0x30),
        # Timing Table C
        #            (0x39,0x01,0xB0
        (0x39, 0x02, 0x31),
        (0x39, 0x0A, 0xF2),

        # Table A (120Hz,160*1+300*8=2560)
        (0x39, 0x04, 0x50),
        (0x39, 0x0A, 0xF5),
        (0x39, 0x0C, 0x08),
        (0x39, 0x0D, 0x10),
        (0x39, 0x0F, 0x00),
        (0x39, 0x11, 0x00),
        (0x39, 0x12, 0x50),
        (0x39, 0x13, 0xA0),
        (0x39, 0x14, 0x2C),
        (0x39, 0x15, 0x00),
        (0x39, 0x16, 0x11),
        (0x39, 0x17, 0xA0),
        (0x39, 0x18, 0x86),
        (0x39, 0x19, 0x1C),
        (0x39, 0x1A, 0xFF),
        (0x39, 0x1B, 0x1B),
        (0x39, 0x1C, 0xFF),
        (0x39, 0x22, 0x00),
        (0x39, 0x23, 0x00),
        (0x39, 0x2A, 0x1C),
        (0x39, 0x2B, 0xFF),

        (0x39, 0x1D, 0x00),
        (0x39, 0x1E, 0x45),
        (0x39, 0x1F, 0x45),
        (0x39, 0x24, 0x00),
        (0x39, 0x25, 0x45),
        (0x39, 0x2F, 0x04),
        (0x39, 0x30, 0x45),
        (0x39, 0x31, 0x04),
        (0x39, 0x32, 0x5D),
        (0x39, 0x39, 0x00),
        (0x39, 0x3A, 0x45),

        # PRZ1
        (0x39, 0x20, 0x01),
        (0x39, 0x33, 0x66),
        (0x39, 0x34, 0x66),
        (0x39, 0x35, 0x66),

        (0x39, 0x8B, 0x50),

        # Table C
        # CMD2,Page2
        (0x39, 0xFF, 0x22),
        (0x39, 0xFB, 0x01),
        (0x39, 0x9F, 0x50),

        (0x39, 0x6F, 0x01),
        (0x39, 0x70, 0x11),
        (0x39, 0x73, 0x01),
        (0x39, 0x74, 0x45),
        (0x39, 0x76, 0x01),
        (0x39, 0x77, 0x45),
        (0x39, 0xA0, 0x3F),
        (0x39, 0xA9, 0x50),
        (0x39, 0xAA, 0x28),
        (0x39, 0xAB, 0x28),
        (0x39, 0xAD, 0x10),
        (0x39, 0xB8, 0x00),
        (0x39, 0xB9, 0x45),
        (0x39, 0xBA, 0x45),
        (0x39, 0xBB, 0x45),
        (0x39, 0xBE, 0x04),
        (0x39, 0xBF, 0x45),
        (0x39, 0xC0, 0x04),
        (0x39, 0xC1, 0x5D),
        (0x39, 0xC2, 0x00),
        (0x39, 0xC5, 0x00),

        (0x39, 0xC6, 0x01),
        (0x39, 0xC7, 0x40),
        (0x39, 0xCA, 0x43),
        (0x39, 0xCB, 0x3C),
        (0x39, 0xCE, 0x00),
        (0x39, 0xCF, 0x43),
        (0x39, 0xD0, 0x3C),
        (0x39, 0xD3, 0x43),
        (0x39, 0xD4, 0x3C),
        (0x39, 0xD7, 0x00),
        (0x39, 0xDC, 0x43),
        (0x39, 0xDD, 0x3C),
        (0x39, 0xE1, 0x43),
        (0x39, 0xE2, 0x3C),
        (0x39, 0xF2, 0x00),
        (0x39, 0xF3, 0x01),
        (0x39, 0xF4, 0x40),

        # OSC Trim Function
        (0x39, 0xFF, 0x25),
        (0x39, 0xFB, 0x01),
        (0x39, 0x13, 0x01),
        (0x39, 0x14, 0x1A),
        #            (0x39,0x14,0x22),
        (0x39, 0xBC, 0x01),
        (0x39, 0xBD, 0x1A),
        (0x39, 0xDB, 0x01),
        (0x39, 0xDC, 0x60),

        (0x39, 0xFF, 0x2A),
        (0x39, 0xFB, 0x01),
        (0x39, 0x97, 0x3C),
        (0x39, 0x98, 0x02),
        (0x39, 0x99, 0x95),
        (0x39, 0x9A, 0x03),
        (0x39, 0x9B, 0x00),
        (0x39, 0x9C, 0x0B),
        (0x39, 0x9D, 0x0A),
        (0x39, 0x9E, 0x90),

        (0x39, 0xF2, 0x3C),
        (0x39, 0xF3, 0x02),
        (0x39, 0xF4, 0x95),
        (0x39, 0xF5, 0x03),
        (0x39, 0xF6, 0x00),
        (0x39, 0xF7, 0x0B),
        (0x39, 0xF8, 0x0A),
        (0x39, 0xF9, 0x90),

        # CMD2,Page7
        (0x39, 0xFF, 0x27),
        (0x39, 0xFB, 0x01),

        # VPOR_DYNH_EN=1, VPOR_CNT_REV=1
        (0x39, 0x56, 0x06),

        # FR0
        (0x39, 0x58, 0x80),
        (0x39, 0x59, 0xF2),
        (0x39, 0x5A, 0x00),
        (0x39, 0x5B, 0x01),
        (0x39, 0x5C, 0x00),
        (0x39, 0x5D, 0x00),
        (0x39, 0x5E, 0x20),
        (0x39, 0x5F, 0x10),
        (0x39, 0x60, 0x00),
        (0x39, 0x61, 0x44),
        (0x39, 0x62, 0x00),
        (0x39, 0x63, 0x01),
        (0x39, 0x64, 0xAE),
        (0x39, 0x65, 0x43),
        (0x39, 0x66, 0x00),
        (0x39, 0x67, 0x01),
        (0x39, 0x68, 0xAF),

        # FR1
        (0x39, 0x78, 0x80),
        (0x39, 0x79, 0xF2),
        (0x39, 0x7A, 0x00),
        (0x39, 0x7B, 0x01),
        (0x39, 0x7C, 0x00),
        (0x39, 0x7D, 0x00),
        (0x39, 0x7E, 0x20),
        (0x39, 0x7F, 0x10),
        (0x39, 0x80, 0x00),
        (0x39, 0x81, 0x44),
        (0x39, 0x82, 0x00),
        (0x39, 0x83, 0x01),
        (0x39, 0x84, 0xAE),
        (0x39, 0x85, 0x43),
        (0x39, 0x86, 0x00),
        (0x39, 0x87, 0x01),
        (0x39, 0x88, 0xAF),

        (0x39, 0xC0, 0x00),

        (0x39, 0x3F, 0x40),
        (0x39, 0x43, 0x40),
        (0x39, 0x47, 0x40),
        (0x39, 0x4B, 0x40),
        (0x39, 0x30, 0x02),
        (0x39, 0x76, 0x02),
        (0x39, 0x96, 0x02),
        (0x39, 0xF8, 0x02),

        # TE ESD Solution
        (0x39, 0xD0, 0x71),
        (0x39, 0xD1, 0x84),
        (0x39, 0xD2, 0x30),
        (0x39, 0xDE, 0x43),
        (0x39, 0xDF, 0x03),

        # FTE output TSVD, LEDPWM output TSHD
        (0x39, 0xD1, 0x44),
        (0x39, 0xD2, 0x57),

        # /

        # CMD2,Page10
        (0x39, 0xFF, 0x2A),
        (0x39, 0xFB, 0x01),

        # PEN_EN=1, UL_FREQ=0
        (0x39, 0x22, 0x2F),
        # VFR_SEL
        # 60Hz
        #            (0x39,0x23,0x0C),
        # 120Hz
        (0x39, 0x23, 0x0D),

        # FR0 (60Hz, VFP=26+26+2560+246=2858)
        (0x39, 0x24, 0x01),
        (0x39, 0x25, 0x45),
        (0x39, 0x27, 0x00),
        (0x39, 0x28, 0x1A),
        (0x39, 0x29, 0x00),
        (0x39, 0x2A, 0x1A),
        (0x39, 0x2B, 0x00),
        (0x39, 0x2D, 0x1A),

        # FR1 (120Hz)
        (0x39, 0x2F, 0x00),
        (0x39, 0x30, 0x45),
        (0x39, 0x32, 0x00),
        (0x39, 0x33, 0x1A),
        (0x39, 0x34, 0x00),
        (0x39, 0x35, 0x1A),
        (0x39, 0x36, 0x00),
        (0x39, 0x37, 0x1A),

        # CMD2 Page4
        (0x39, 0xFF, 0x24),
        (0x39, 0xFB, 0x01),
        (0x39, 0xC2, 0xDA),
        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Only Write Slave
        (0x39, 0xB9, 0x05),
        # CMD2 Page4
        (0x39, 0xFF, 0x24),
        (0x39, 0xFB, 0x01),
        (0x39, 0xC2, 0xDF),
        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Write Master & Slave
        (0x39, 0xB9, 0x02),

        # CMD3,PageA
        (0x39, 0xFF, 0xE0),
        (0x39, 0xFB, 0x01),
        # VCOM Driving Ability
        (0x39, 0x14, 0x60),
        (0x39, 0x16, 0xC0),
        # Forcing OSC2 enable
        (0x39, 0x4F, 0x02),

        # CMD3,PageB
        (0x39, 0xFF, 0xF0),
        (0x39, 0xFB, 0x01),
        # slave osc workaround
        (0x39, 0x3A, 0x08),

        # CMD3,PageC
        (0x39, 0xFF, 0xD0),
        (0x39, 0xFB, 0x01),
        (0x39, 0x02, 0xAF),
        (0x39, 0x09, 0xEE),
        (0x39, 0x1C, 0x99),
        (0x39, 0x1D, 0x09),

        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Only Write Slave
        (0x39, 0xB9, 0x05),
        # CMD2,Page0
        (0x39, 0xFF, 0x20),
        (0x39, 0xFB, 0x01),
        (0x39, 0x18, 0x40),

        # CMD1
        (0x39, 0xFF, 0x10),
        (0x39, 0xFB, 0x01),
        # Write Master & Slave
        (0x39, 0xB9, 0x02),
        (0x39, 0x35, 0x00),
        (0x39, 0xBB, 0x13),
        # VBP+VFP=246+26=272
        (0x39, 0x3B, 0x03, 0xF6, 0x1A, 0x04, 0x04),
    )
    for i in mipi_data:
        MIPI_WR(i)


#*****************************************************************************************************************************************
#*****************************************************************************************************************************************
#-----------------------------------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------------------------------
#*****************************************************************************************************************************************
#*****************************************************************************************************************************************
#-----------------------------------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------------------------------
#--------------------START-------------------------------------

# ''' 初始化配置 '''
SHARP_user=User_Fun()

if __name__ == '__main__':  #主程序入口
    SHARP_DEBUG("Enter Python OK !")
    run()