提交rx相关代码,剥离scaler寄存器配置由上位机生成
This commit is contained in:
parent
1a6a76e6cd
commit
0ca70d656b
|
|
@ -1,7 +1,23 @@
|
|||
#include "la_config.h"
|
||||
#include "hal_edp_rx.h"
|
||||
|
||||
RX_CB_Handle rx_cb_handle = {0};
|
||||
/********************RX 基本参数配置*******************/
|
||||
/* 输入帧结构 */
|
||||
#define INPUT_H_ACTIVE (1080)
|
||||
#define INPUT_HFP (1080)
|
||||
#define INPUT_V_ACTIVE (1080)
|
||||
#define INPUT_VS (1080)
|
||||
#define INPUT_VBP (1080)
|
||||
|
||||
/* 输出帧结构 */
|
||||
#define OUTPUT_H_ACTIVE (1080)
|
||||
#define OUTPUT_HS (1080)
|
||||
#define OUTPUT_HBP (1080)
|
||||
#define OUTPUT_V_ACTIVE (1080)
|
||||
#define OUTPUT_VS (1080)
|
||||
#define OUTPUT_VBP (1080)
|
||||
#define OUTPUT_VFP (1080)
|
||||
/*****************************************************/
|
||||
|
||||
/* SDP更新回调,用于获取second data packet */
|
||||
void ap_set_backlight(SDP_Info sdp_info)
|
||||
|
|
@ -28,6 +44,32 @@ RX_CB_Handle rx_cb_tabel =
|
|||
{ap_set_display_on ,false},
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief rx 初始化
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
static void app_rx_init(void)
|
||||
{
|
||||
hal_rx_ctrl_handle rx_ctrl_handle = {0};
|
||||
/* 配置参数 */
|
||||
rx_ctrl_handle.base_info.hfp_in = INPUT_HFP;
|
||||
rx_ctrl_handle.base_info.hact_in = INPUT_H_ACTIVE;
|
||||
rx_ctrl_handle.base_info.vs_in = INPUT_VS;
|
||||
rx_ctrl_handle.base_info.vbp_in = INPUT_VBP;
|
||||
rx_ctrl_handle.base_info.vact_in = INPUT_V_ACTIVE;
|
||||
rx_ctrl_handle.base_info.hs_post = OUTPUT_HS;
|
||||
rx_ctrl_handle.base_info.hbp_post = OUTPUT_HBP;
|
||||
rx_ctrl_handle.base_info.hact_post = OUTPUT_H_ACTIVE;
|
||||
rx_ctrl_handle.base_info.vfp_post = OUTPUT_VFP;
|
||||
rx_ctrl_handle.base_info.vs_post = OUTPUT_VS;
|
||||
rx_ctrl_handle.base_info.vbp_post = OUTPUT_VBP;
|
||||
rx_ctrl_handle.base_info.vact_post = OUTPUT_V_ACTIVE;
|
||||
rx_ctrl_handle.rx_cb = &rx_cb_tabel;
|
||||
|
||||
hal_rx_ctrl_init(rx_ctrl_handle);
|
||||
}
|
||||
|
||||
const DPCD_Packet dpcd_packet_table[] =
|
||||
{
|
||||
//dprx_DPCD_16PM
|
||||
|
|
@ -225,8 +267,8 @@ void main(void)
|
|||
{
|
||||
//------------------------------w818 && ddic initial...
|
||||
ini();
|
||||
app_rx_init();
|
||||
hal_edp_rx_dpcd_init(dpcd_packet_table, sizeof(dpcd_packet_table));
|
||||
hal_edp_rx_cb_init(&rx_cb_tabel);
|
||||
gpio_init();
|
||||
Sys_Matchine_Init();
|
||||
//------------------------------interrupt initial....
|
||||
|
|
|
|||
|
|
@ -92,42 +92,42 @@ extern void ini(void)
|
|||
wr_cfgreg(0xE80C, 0x00); // <hfp_0__1[15:8]>
|
||||
wr_cfgreg(0xE80D, 0xC3); // <hfp_0__0[7:0]>
|
||||
|
||||
//frambuff-porch
|
||||
// //frambuff-porch
|
||||
|
||||
wr_cfgreg(0xE81C,0x05); // <frm_dec_hact__1[15, 8]>
|
||||
wr_cfgreg(0xE81D,0x28); // <frm_dec_hact__0[7, 0]>
|
||||
wr_cfgreg(0xE81E,0x0B); // <frm_dec_vact__1[15, 8]>
|
||||
wr_cfgreg(0xE81F,0x34); // <frm_dec_vact__0[7, 0]>
|
||||
wr_cfgreg(0xE820,0x00); // <frm_dec_vfp__1[15, 8]>
|
||||
wr_cfgreg(0xE821,0x48); // <frm_dec_vfp__0[7, 0]>
|
||||
wr_cfgreg(0xE822,0x00); // <frm_dec_vbp__1[15, 8]>
|
||||
wr_cfgreg(0xE823,0x0A); // <frm_dec_vbp__0[7, 0]>
|
||||
wr_cfgreg(0xE824,0x00); // <frm_dec_hfp__1[15, 8]>
|
||||
wr_cfgreg(0xE825,0x60); // <frm_dec_hfp__0[7, 0]>
|
||||
wr_cfgreg(0xE826,0x00); // <frm_dec_hbp__1[15, 8]>
|
||||
wr_cfgreg(0xE827,0x20); // <frm_dec_hbp__0[7, 0]>
|
||||
wr_cfgreg(0xE828,0x02); // <frm_dec_vs[7:0]>
|
||||
wr_cfgreg(0xE829,0x14); // <frm_dec_hs[7:0]>
|
||||
//--scaler-porch
|
||||
wr_cfgreg(0xE80E,0x05); // <hact_post__1[15, 8]>
|
||||
wr_cfgreg(0xE80F,0x00); // <hact_post__0[7, 0]>
|
||||
wr_cfgreg(0xE810,0x0A); // <vact_post__1[15, 8]>
|
||||
wr_cfgreg(0xE811,0xF0); // <vact_post__0[7, 0]>
|
||||
wr_cfgreg(0xE812,0x14); // <hs_post[7:0]>
|
||||
wr_cfgreg(0xE813,0x00); // <hbp_post__1[15, 8]>
|
||||
wr_cfgreg(0xE814,0x20); // <hbp_post__0[7, 0]>
|
||||
wr_cfgreg(0xE815,0x00); // <hfp_post__1[15, 8]>
|
||||
wr_cfgreg(0xE816,0xA8); // <hfp_post__0[7, 0]>
|
||||
wr_cfgreg(0xE817,0x02); // <vs_post[7:0]>
|
||||
wr_cfgreg(0xE818,0x00); // <vbp_post__1[15, 8]>
|
||||
wr_cfgreg(0xE819,0x0A); // <vbp_post__0[7, 0]>
|
||||
wr_cfgreg(0xE81A,0x00); // <Vfp_post__1[15, 8]>
|
||||
wr_cfgreg(0xE81B,0x46); // <Vfp_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE81C,0x05); // <frm_dec_hact__1[15, 8]>
|
||||
// wr_cfgreg(0xE81D,0x28); // <frm_dec_hact__0[7, 0]>
|
||||
// wr_cfgreg(0xE81E,0x0B); // <frm_dec_vact__1[15, 8]>
|
||||
// wr_cfgreg(0xE81F,0x34); // <frm_dec_vact__0[7, 0]>
|
||||
// wr_cfgreg(0xE820,0x00); // <frm_dec_vfp__1[15, 8]>
|
||||
// wr_cfgreg(0xE821,0x48); // <frm_dec_vfp__0[7, 0]>
|
||||
// wr_cfgreg(0xE822,0x00); // <frm_dec_vbp__1[15, 8]>
|
||||
// wr_cfgreg(0xE823,0x0A); // <frm_dec_vbp__0[7, 0]>
|
||||
// wr_cfgreg(0xE824,0x00); // <frm_dec_hfp__1[15, 8]>
|
||||
// wr_cfgreg(0xE825,0x60); // <frm_dec_hfp__0[7, 0]>
|
||||
// wr_cfgreg(0xE826,0x00); // <frm_dec_hbp__1[15, 8]>
|
||||
// wr_cfgreg(0xE827,0x20); // <frm_dec_hbp__0[7, 0]>
|
||||
// wr_cfgreg(0xE828,0x02); // <frm_dec_vs[7:0]>
|
||||
// wr_cfgreg(0xE829,0x14); // <frm_dec_hs[7:0]>
|
||||
// //--scaler-porch
|
||||
// wr_cfgreg(0xE80E,0x05); // <hact_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE80F,0x00); // <hact_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE810,0x0A); // <vact_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE811,0xF0); // <vact_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE812,0x14); // <hs_post[7:0]>
|
||||
// wr_cfgreg(0xE813,0x00); // <hbp_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE814,0x20); // <hbp_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE815,0x00); // <hfp_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE816,0xA8); // <hfp_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE817,0x02); // <vs_post[7:0]>
|
||||
// wr_cfgreg(0xE818,0x00); // <vbp_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE819,0x0A); // <vbp_post__0[7, 0]>
|
||||
// wr_cfgreg(0xE81A,0x00); // <Vfp_post__1[15, 8]>
|
||||
// wr_cfgreg(0xE81B,0x46); // <Vfp_post__0[7, 0]>
|
||||
|
||||
wr_cfgreg(0xE82A, 0x05); // <hact_aftdrop__1[15:8]>
|
||||
wr_cfgreg(0xE82B, 0x28); // <hact_aftdrop__0[7:0]>
|
||||
wr_cfgreg(0xE82C, 0x0B); // <vact_aftdrop__1[15:8]>
|
||||
wr_cfgreg(0xE82D, 0x34); // <vact_aftdrop__0[7:0]>
|
||||
// wr_cfgreg(0xE82A, 0x05); // <hact_aftdrop__1[15:8]>
|
||||
// wr_cfgreg(0xE82B, 0x28); // <hact_aftdrop__0[7:0]>
|
||||
// wr_cfgreg(0xE82C, 0x0B); // <vact_aftdrop__1[15:8]>
|
||||
// wr_cfgreg(0xE82D, 0x34); // <vact_aftdrop__0[7:0]>
|
||||
|
||||
wr_cfgreg(0xe82e, 0x05);//hact after pixelmap
|
||||
wr_cfgreg(0xe82f, 0x00);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,84 @@
|
|||
/*******************************************************************************
|
||||
* File: drv_edp_rx.h
|
||||
* Description: edp rx驱动层
|
||||
* Version: V1.0
|
||||
* Date: 2026-3-13
|
||||
* Author: lyp
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef __DRV_EDP_RX_H__
|
||||
#define __DRV_EDP_RX_H__
|
||||
|
||||
#include "typedef.h"
|
||||
#include "define.h"
|
||||
#include <stdarg.h>
|
||||
#include "la_config.h"
|
||||
|
||||
#ifndef EDP_RX_BASE
|
||||
#define EDP_RX_BASE (0x80000000)
|
||||
#endif
|
||||
|
||||
#define EDP_RX ((EDP_RX_REG *)EDP_RX_BASE)
|
||||
|
||||
typedef struct _EDP_RX_REG
|
||||
{
|
||||
__I uint32_t sdp ;
|
||||
__I uint32_t fpm ;
|
||||
__I uint32_t dbv ;
|
||||
__I uint32_t no_operation ;
|
||||
|
||||
__I uint32_t reserved1 ;
|
||||
__I uint32_t reserved2 ;
|
||||
__I uint32_t reserved3 ;
|
||||
__I uint32_t reserved4 ;
|
||||
__I uint32_t reserved5 ;
|
||||
|
||||
__I uint32_t err_flag ;
|
||||
__I uint32_t aux_command ;
|
||||
__I uint32_t aux_data0 ;
|
||||
__I uint32_t aux_data4 ;
|
||||
__I uint32_t aux_data8 ;
|
||||
__I uint32_t aux_data12 ;
|
||||
|
||||
__IO uint32_t edid_data0 ;
|
||||
__IO uint32_t edid_data4 ;
|
||||
__IO uint32_t edid_data8 ;
|
||||
__IO uint32_t edid_data12 ;
|
||||
__IO uint32_t edid_ack ;
|
||||
__IO uint32_t dprx_interface_set ;
|
||||
__O uint32_t aux_irq_clear ;
|
||||
__IO uint32_t aux_irq_set ;
|
||||
__IO uint32_t write_cco_trim_out ;
|
||||
__I uint32_t read_cco_trim_in0 ;
|
||||
__I uint32_t read_cco_trim_in1 ;
|
||||
__IO uint32_t write_oscal_out ;
|
||||
__I uint32_t read_oscal_in ;
|
||||
__IO uint32_t write_cco_set0 ;
|
||||
__IO uint32_t write_cco_set1 ;
|
||||
__IO uint32_t write_cco_set2 ;
|
||||
__IO uint32_t write_cco_set3 ;
|
||||
__IO uint32_t write_cco_set4 ;
|
||||
__IO uint32_t write_cco_set5 ;
|
||||
__IO uint32_t write_cco_set6 ;
|
||||
}EDP_RX_REG;
|
||||
|
||||
/**
|
||||
* @brief 上位机处理完的数据
|
||||
* @note init_address是寄存器地址
|
||||
* init_value是寄存器值
|
||||
*/
|
||||
typedef struct _Board_Init
|
||||
{
|
||||
uint32_t init_address;
|
||||
uint8_t init_value;
|
||||
}Board_Init;
|
||||
|
||||
/**
|
||||
* @brief 初始化板子配置
|
||||
* @param table_address: 上位机提供的初始化数据表头
|
||||
* @param table_address: 上位机提供的数据表长度
|
||||
* @retval none
|
||||
*/
|
||||
void drv_init_board(const Board_Init *table_address, uint32_t table_size);
|
||||
|
||||
#endif
|
||||
|
|
@ -22,17 +22,17 @@
|
|||
|
||||
typedef struct _MIPI_TX_PORT0_REG
|
||||
{
|
||||
__O uint32_t write_data ;
|
||||
__IO uint8_t tx_enable ;
|
||||
__IO uint8_t tx_control_L ;
|
||||
__IO uint8_t tx_control_H ;
|
||||
__I uint8_t tx_state ;
|
||||
__IO uint32_t rd_lp_rx_data ;
|
||||
__IO uint32_t rd_lp_rx_ecc ;
|
||||
__O uint32_t fifo_set ;
|
||||
__I uint32_t ISR ;
|
||||
__IO uint32_t IMR ;
|
||||
__O uint32_t ICR ;
|
||||
__O uint32_t write_data ;
|
||||
__IO uint8_t tx_enable ;
|
||||
__IO uint8_t tx_control_L ;
|
||||
__IO uint8_t tx_control_H ;
|
||||
__I uint8_t tx_state ;
|
||||
__IO uint32_t rd_lp_rx_data ;
|
||||
__IO uint32_t rd_lp_rx_ecc ;
|
||||
__O uint32_t fifo_set ;
|
||||
__I uint32_t ISR ;
|
||||
__IO uint32_t IMR ;
|
||||
__O uint32_t ICR ;
|
||||
|
||||
}MIPI_TX_PORT0_REG;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
#include "drv_edp_rx.h"
|
||||
|
||||
/**
|
||||
* @brief 初始化板子配置
|
||||
* @param table_address: 上位机提供的初始化数据表头
|
||||
* @param table_address: 上位机提供的数据长度
|
||||
* @retval none
|
||||
*/
|
||||
void drv_init_board(const Board_Init *table_address, uint32_t table_size)
|
||||
{
|
||||
for(uint32_t i = 0; i < (table_size / sizeof(Board_Init)); i++)
|
||||
{
|
||||
wr_cfgreg(table_address[i].init_address,table_address[i].init_value);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,8 +7,12 @@
|
|||
*******************************************************************************/
|
||||
|
||||
#include "hal_edp_rx.h"
|
||||
#include "drv_edp_rx.h"
|
||||
#include "typedef.h"
|
||||
#include "define.h"
|
||||
#include "board_init.h"//上位机生成的文件
|
||||
|
||||
#define SET_DPCD(dpcd_address, dpcd_value) (write_addr_UINT8(BASE_ADDR_DPCD + dpcd_address, dpcd_value))
|
||||
|
||||
#define EDP_INPUT_3_51Gbps //EDP_INPUT_3_51Gbps
|
||||
#define EDP_TRAIN_BY_TPS1 //如果TPS1 大于15us,启用此宏,一般手机应用启动,ipad应用不启用
|
||||
|
|
@ -177,13 +181,15 @@ static void dprx_load_edp_bit_rate_cco(void)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief 注册rx相关回调
|
||||
* @param RX_CB_Handle: rx回调参数结构体
|
||||
* @brief 注册rx相关参数
|
||||
* @param rx_ctrl_handle: rx参数结构体
|
||||
* @retval true-注册成功;false-注册失败
|
||||
*/
|
||||
bool hal_edp_rx_cb_init(RX_CB_Handle *rx_cb_handle)
|
||||
bool hal_rx_ctrl_init(hal_rx_ctrl_handle rx_ctrl_handle)
|
||||
{
|
||||
|
||||
drv_init_board(board_init_table, sizeof(board_init_table));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hal_edp_rx_dpcd_init(const DPCD_Packet *table_address, uint32_t table_size)
|
||||
|
|
@ -196,7 +202,7 @@ bool hal_edp_rx_dpcd_init(const DPCD_Packet *table_address, uint32_t table_size)
|
|||
|
||||
for(uint32_t i = 0; i < (table_size / sizeof(DPCD_Packet)); i++)
|
||||
{
|
||||
write_addr_UINT8(BASE_ADDR_DPCD + table_address[i].dpcd_address, table_address[i].dpcd_value);
|
||||
SET_DPCD(table_address[i].dpcd_address, table_address[i].dpcd_value);
|
||||
}
|
||||
|
||||
dprx_load_edp_bit_rate_cco();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
/*该文件打包后不会留存,上位机点击编译时生成,编译结束删除*/
|
||||
#ifndef __BOARD_INIT_H__
|
||||
#define __BOARD_INIT_H__
|
||||
#include "drv_edp_rx.h"
|
||||
|
||||
const Board_Init board_init_table[] =
|
||||
{
|
||||
//frambuff-porch
|
||||
{0xE81C,0x05},// <frm_dec_hact__1[15, 8]>
|
||||
{0xE81D,0x28},// <frm_dec_hact__0[7, 0]>
|
||||
{0xE81E,0x0B},// <frm_dec_vact__1[15, 8]>
|
||||
{0xE81F,0x34},// <frm_dec_vact__0[7, 0]>
|
||||
{0xE820,0x00},// <frm_dec_vfp__1[15, 8]>
|
||||
{0xE821,0x48},// <frm_dec_vfp__0[7, 0]>
|
||||
{0xE822,0x00},// <frm_dec_vbp__1[15, 8]>
|
||||
{0xE823,0x0A},// <frm_dec_vbp__0[7, 0]>
|
||||
{0xE824,0x00},// <frm_dec_hfp__1[15, 8]>
|
||||
{0xE825,0x60},// <frm_dec_hfp__0[7, 0]>
|
||||
{0xE826,0x00},// <frm_dec_hbp__1[15, 8]>
|
||||
{0xE827,0x20},// <frm_dec_hbp__0[7, 0]>
|
||||
{0xE828,0x02},// <frm_dec_vs[7:0]>
|
||||
{0xE829,0x14},// <frm_dec_hs[7:0]>
|
||||
|
||||
//--scaler-porch
|
||||
{0xE80E,0x05},// <hact_post__1[15, 8]>
|
||||
{0xE80F,0x00},// <hact_post__0[7, 0]>
|
||||
{0xE810,0x0A},// <vact_post__1[15, 8]>
|
||||
{0xE811,0xF0},// <vact_post__0[7, 0]>
|
||||
{0xE812,0x14},// <hs_post[7:0]>
|
||||
{0xE813,0x00},// <hbp_post__1[15, 8]>
|
||||
{0xE814,0x20},// <hbp_post__0[7, 0]>
|
||||
{0xE815,0x00},// <hfp_post__1[15, 8]>
|
||||
{0xE816,0xA8},// <hfp_post__0[7, 0]>
|
||||
{0xE817,0x02},// <vs_post[7:0]>
|
||||
{0xE818,0x00},// <vbp_post__1[15, 8]>
|
||||
{0xE819,0x0A},// <vbp_post__0[7, 0]>
|
||||
{0xE81A,0x00},// <Vfp_post__1[15, 8]>
|
||||
{0xE81B,0x46},// <Vfp_post__0[7, 0]>
|
||||
|
||||
{0xE82A, 0x05},// <hact_aftdrop__1[15:8]>
|
||||
{0xE82B, 0x28},// <hact_aftdrop__0[7:0]>
|
||||
{0xE82C, 0x0B},// <vact_aftdrop__1[15:8]>
|
||||
{0xE82D, 0x34},// <vact_aftdrop__0[7:0]>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -69,7 +69,6 @@ typedef struct _Sleep_Handle
|
|||
* @brief 唤醒回调注册
|
||||
* @note wake_cb是唤醒回调地址
|
||||
* execute_mode是执行方式:true-在中断里立即执行,false-加入队列异步执行
|
||||
* 需在上位机设置基板reset脚接在芯片具体管脚
|
||||
*/
|
||||
typedef struct _WAKE_Handle
|
||||
{
|
||||
|
|
@ -78,7 +77,7 @@ typedef struct _WAKE_Handle
|
|||
}WAKE_Handle;
|
||||
|
||||
/**
|
||||
* @brief rx相关功能回调
|
||||
* @brief rx回调
|
||||
* @note
|
||||
*/
|
||||
typedef struct _RX_CB_Handle
|
||||
|
|
@ -89,11 +88,44 @@ typedef struct _RX_CB_Handle
|
|||
}RX_CB_Handle;
|
||||
|
||||
/**
|
||||
* @brief 注册rx相关回调
|
||||
* @param RX_CB_Handle: rx回调参数结构体
|
||||
* @brief scaler参数
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
typedef struct _scaler_base_info
|
||||
{
|
||||
uint32_t hfp_in;
|
||||
uint32_t hact_in;
|
||||
uint32_t vs_in;
|
||||
uint32_t vbp_in;
|
||||
uint32_t vact_in;
|
||||
|
||||
uint32_t hs_post;
|
||||
uint32_t hbp_post;
|
||||
uint32_t hact_post;
|
||||
uint32_t vfp_post;
|
||||
uint32_t vs_post;
|
||||
uint32_t vbp_post;
|
||||
uint32_t vact_post;
|
||||
}scaler_base_info;
|
||||
|
||||
/**
|
||||
* @brief rx 初始化
|
||||
* @param none
|
||||
* @retval none
|
||||
*/
|
||||
typedef struct _hal_rx_ctrl_handle
|
||||
{
|
||||
scaler_base_info base_info; /*sclaing up转换基本信息 */
|
||||
RX_CB_Handle *rx_cb; /*rx回调*/
|
||||
}hal_rx_ctrl_handle;
|
||||
|
||||
/**
|
||||
* @brief 注册rx相关参数
|
||||
* @param rx_ctrl_handle: rx参数结构体
|
||||
* @retval true-注册成功;false-注册失败
|
||||
*/
|
||||
bool hal_edp_rx_cb_init(RX_CB_Handle *rx_cb_handle);
|
||||
bool hal_rx_ctrl_init(hal_rx_ctrl_handle rx_ctrl_handle);
|
||||
|
||||
/**
|
||||
* @brief 初始化DPCD寄存器
|
||||
|
|
|
|||
Loading…
Reference in New Issue