**
1-5由大模型自动学习和输出
**
- U-Boot 项目的代码主要结构和功能:
主要用于:
- 系统初始化
- 硬件检测与配置
- 内核加载与启动
- 提供调试环境
代码组织清晰,模块化程度高,支持多种硬件平台和功能配置。
- 整体架构:
- arch/: 处理器架构相关代码(ARM、MIPS等)
- board/: 各种开发板的板级支持包
- cmd/: U-Boot 命令实现
- common/: 通用功能代码
- drivers/: 各类驱动程序
- dts/: 设备树文件
- include/: 头文件
- net/: 网络相关代码
- lib/: 通用库函数
- tools/: 开发工具
- 主要功能模块:
- 引导加载:
- SPL(Secondary Program Loader): 第一阶段引导加载
- TPL(Tertiary Program Loader): 第二阶段引导加载
- U-Boot 主程序: 最终的引导加载器
- 设备驱动:
- MMC/SD卡
- USB
- 网络
- 存储设备
- 显示
- GPIO等
- 编译构建系统:
- Makefile: 主构建文件
- Kconfig: 配置系统
- configs/: 预定义配置
- make.sh: 编译脚本
- 关键功能:
- 设备树支持:
- dts/.dt-tpl.dtb.cmd: TPL 阶段设备树
- dts/.dt-spl.dtb.cmd: SPL 阶段设备树
- dts/.dt.dtb.cmd: U-Boot 主程序设备树
- 设备树支持:
- 特定功能:
- Android 启动支持
- PSCI(Power State Coordination Interface)支持
- 安全启动
- 网络启动
- 各类文件系统支持
- 配置系统:
- .config: 当前配置
- u-boot.cfg: 编译配置
- Kconfig: 配置选项定义
- U-Boot中显示模块
初始化和显示功能主要涉及以下几个部分
2.1 驱动层次结构:
drivers/video/ - 显示驱动主目录
├── drm/ - DRM驱动框架
├── rockchip/ - 瑞芯微显示控制器驱动
├── bridge/ - 显示桥接器驱动
└── panel/ - 显示面板驱动
2.2 初始化流程:
// 1. 设备树配置
display {
compatible = "rockchip,display-subsystem";
ports {
port@0 {
reg = <0>;
vop_out_hdmi: endpoint {
remote-endpoint = <&hdmi_in_vop>;
};
};
};
};
// 2. 驱动初始化
static int rockchip_display_probe(struct udevice *dev)
{
// 初始化显示控制器(VOP)
ret = rockchip_vop_init(display);
// 初始化显示接口(HDMI/eDP/MIPI等)
ret = rockchip_display_init_hw(display);
// 初始化显示面板
ret = rockchip_panel_init(panel);
}
2.3 主要组件:
1. VOP(Video Output Processor):
// drivers/video/rockchip/vop.c
struct vop_device {
u32 *regs; // 寄存器基地址
struct display_state *state; // 显示状态
u32 version; // VOP版本
};
// VOP初始化
static int rockchip_vop_init(struct display_state *state)
{
// 配置时钟
// 初始化寄存器
// 配置显示时序
// 配置图层
}
- 显示接口(如HDMI):
// drivers/video/bridge/rockchip_hdmi.c
static int rockchip_hdmi_init(struct display_state *state)
{
// PHY初始化
// 时序配置
// HDCP配置(如果需要)
}
- 显示操作:
// 帧缓冲操作
void *lcd_base; // 帧缓冲基地址
int lcd_line_length; // 行长度(字节)
// 基本绘图函数
void lcd_putc(int x, int y, char c); // 显示字符
void lcd_puts(int x, int y, char *s); // 显示字符串
void lcd_printf(int x, int y, const char *fmt, ...); // 格式化输出
- 显示配置:
// include/configs/rk3568_common.h
#define CONFIG_VIDEO_ROCKCHIP
#define CONFIG_DISPLAY_ROCKCHIP
#define CONFIG_DRM_ROCKCHIP
#define CONFIG_LCD_BPP LCD_BPP_32 // 颜色深度
- 显示初始化时序:
SPL/TPL阶段:
└── minimal_init()
└── board_init_f()
└── init_sequence_f[]
└── setup_display()
U-Boot阶段:
└── board_init_r()
└── init_sequence_r[]
└── drm_init()
├── vop_probe()
├── bridge_init()
└── panel_init()
1. 关键功能实现:
// 1. 显示初始化
int video_init(void)
{
// 初始化显示控制器
// 配置显示模式
// 分配帧缓冲
// 初始化显示设备
}
// 2. 控制台输出
void console_init(void)
{
// 初始化控制台
// 注册显示设备
// 设置输出函数
}
// 3. 图形操作
void lcd_draw_pixel(int x, int y, u32 color)
{
// 计算像素位置
// 写入颜色值
}
// 4. 显示刷新
void lcd_sync(void)
{
// 刷新显示缓冲
// 等待垂直同步
}
2.4 这个显示系统支持:
- 多种显示接口(HDMI/DP/MIPI等)
- 多层显示
- 硬件加速
- 各种颜色格式
- 动态分辨率切换
主要用于:
-
显示启动信息
-
提供命令行界面
-
显示启动Logo
-
支持图形化菜单
-
整个显示系统架构清晰,层次分明,具有良好的可扩展性和可维护性。
-
RK3568平台的显示初始化和实现
3.1 RK3568显示硬件架构:
VOP2.0 (Video Output Processor)
├── Video Port 0 (4K)
├── Video Port 1 (4K)
└── Video Port 2 (1080P)
显示接口:
├── HDMI 2.0
├── eDP 1.3
├── MIPI DSI
├── RGB
└── BT.656/1120
3.2 设备树配置:
// arch/arm/dts/rk3568-evb.dts
vop: vop@fe040000 {
compatible = "rockchip,rk3568-vop";
reg = <0x0 0xfe040000 0x0 0x3000>;
interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP>, <&cru DCLK_VOP0>;
clock-names = "aclk", "dclk";
status = "okay";
vop_out: port {
#address-cells = <1>;
#size-cells = <0>;
vop_out_hdmi: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_vop>;
};
};
};
3.3 显示驱动初始化:
// drivers/video/rockchip/rk3568_vop.c
static int rk3568_vop_probe(struct udevice *dev)
{
struct rk3568_vop *vop = dev_get_priv(dev);
// 1. 获取寄存器基地址
vop->regs = dev_read_addr_ptr(dev);
// 2. 使能VOP时钟
clk_enable(&vop->aclk);
clk_enable(&vop->dclk);
// 3. 初始化VOP寄存器
rk3568_vop_init_regs(vop);
// 4. 配置显示时序
rk3568_vop_config_timing(vop);
return 0;
}
3.4 关键寄存器配置:
// VOP寄存器定义
#define VOP_SYS_CTRL 0x0000
#define VOP_DSP_CTRL0 0x0010
#define VOP_DSP_CTRL1 0x0014
#define VOP_WIN0_CTRL0 0x0100
#define VOP_WIN0_VIR 0x0104
static void rk3568_vop_init_regs(struct rk3568_vop *vop)
{
// 配置系统控制寄存器
writel(0x00ff0000, vop->regs + VOP_SYS_CTRL);
// 配置显示控制寄存器
writel(0x00000000, vop->regs + VOP_DSP_CTRL0);
// 配置窗口控制寄存器
writel(0x00000000, vop->regs + VOP_WIN0_CTRL0);
}
3.5 显示通路配置:
// drivers/video/rockchip/rk3568_display.c
static int rk3568_display_init(struct display_state *state)
{
struct connector_state *conn_state = &state->conn_state;
switch (conn_state->type) {
case DRM_MODE_CONNECTOR_HDMIA:
ret = rk3568_hdmi_init(state);
break;
case DRM_MODE_CONNECTOR_DSI:
ret = rk3568_mipi_init(state);
break;
case DRM_MODE_CONNECTOR_eDP:
ret = rk3568_edp_init(state);
break;
}
return ret;
}
3.6 帧缓冲配置:
static int rk3568_fb_init(struct display_state *state)
{
struct vop_state *vop_state = &state->vop_state;
// 分配帧缓冲内存
vop_state->fb_addr = gd->fb_base;
vop_state->fb_size = ALIGN(mode->vdisplay * stride, PAGE_SIZE);
// 配置窗口参数
rk3568_vop_set_win(state);
return 0;
}
3.7 显示时序:
U-Boot启动流程中的显示初始化:
board_init_f()
└── setup_display()
├── rk3568_display_probe()
│ ├── vop_probe()
│ └── connector_probe()
└── rk3568_display_init()
├── vop_init()
├── bridge_init()
└── panel_init()
3.8 调试命令:
显示信息查看
=> display info
VOP: resolution 1920x1080@60Hz
Interface: HDMI
Format: RGB888
显示测试
=> display test
3.9 特定功能支持:
- 支持4K@60Hz输出
- 支持HDR显示
- 支持HDCP 2.2
- 多视频层叠加
- 硬件光标
3.10 常见配置:
configs/evb-rk3568_defconfig
CONFIG_DRM_ROCKCHIP=y
CONFIG_DRM_ROCKCHIP_VOP2=y
CONFIG_DISPLAY_ROCKCHIP_HDMI=y
CONFIG_DISPLAY_ROCKCHIP_EDP=y
CONFIG_DISPLAY_ROCKCHIP_MIPI=y
3.11 RK3568的显示系统特点:
- 采用新一代VOP2.0架构
- 支持多种显示接口
- 支持高分辨率输出
- 具备硬件加速能力
- 主要应用场景:
- 开发板启动Logo显示
- 调试信息输出
- 图形界面支持
- 视频播放支持
- 修改dsi屏显示分辨率
4.1 通过设备树修改:
// arch/arm/dts/rk3568-evb.dts
display-subsystem {
route {
route_hdmi: route-hdmi {
status = "okay";
connect = <&vop_out_hdmi>;
// 修改分辨率配置
display-timings {
native-mode = <&timing1>;
timing1: timing1 {
clock-frequency = <74250000>; // 像素时钟
hactive = <1280>; // 水平分辨率
vactive = <720>; // 垂直分辨率
hfront-porch = <110>;
hsync-len = <40>;
hback-porch = <220>;
vfront-porch = <5>;
vsync-len = <5>;
vback-porch = <20>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
};
};
};
4.2 通过驱动代码修改:
// drivers/video/rockchip/rk3568_vop.c
static const struct display_timing default_timing = {
.pixelclock = { 74250000, 74250000, 74250000 },
.hactive = { 1280, 1280, 1280 },
.hfront_porch = { 110, 110, 110 },
.hback_porch = { 220, 220, 220 },
.hsync_len = { 40, 40, 40 },
.vactive = { 720, 720, 720 },
.vfront_porch = { 5, 5, 5 },
.vback_porch = { 20, 20, 20 },
.vsync_len = { 5, 5, 5 },
};
- hdmi屏输出模块
5.1 整体架构 - 显示子系统
├── 显示控制器(VOP2.0)
├── HDMI控制器(DW HDMI)
├── HDMI PHY
└── 显示接口(HDMI/DP/DSI等) - 源码结构
drivers/video/
├── drm/
│ ├── rockchip_display.c - 显示子系统
│ ├── rockchip_dw_hdmi.c - RK HDMI驱动
│ └── rockchip_vop2.c - VOP2.0驱动
├── bridge/
│ └── dw_hdmi.c - DW HDMI核心驱动
└── common/
└── edid.c - EDID解析
5.2 显示模式设置流程 - 基本流程
设置显示模式
├── 1. 读取EDID获取支持的模式
├── 2. 选择合适的显示模式
├── 3. 配置VOP参数
│ ├── 时序配置
│ └── 图层配置
├── 4. 配置HDMI控制器
│ ├── 视频配置
│ └── 音频配置
└── 5. 配置HDMI PHY
├── PLL设置
└── 带宽配置 - 关键代码
int rockchip_display_mode_set(struct display_state *state) {
struct connector_state *conn_state = &state->conn_state;
struct drm_display_mode *mode = &conn_state->mode;
// 1. 配置VOP
vop_mode_set(state->crtc, mode);
// 2. 配置HDMI
dw_hdmi_mode_set(state->connector, mode);
// 3. 使能显示
vop_enable(state->crtc);
dw_hdmi_enable(state->connector);
return 0;
}
5.3 核心模块分析
5.3.1 EDID解析模块(edid.c)
1.1 主要功能
- EDID数据读取和解析
- 支持的显示模式解析
- 显示器能力检测
1.2 关键结构
// EDID基本结构
struct edid {
u8 header[8]; // EDID标识头
u16 manufacturer_id; // 制造商ID
u16 product_code; // 产品代码
u32 serial_number; // 序列号
u8 week; // 生产周
u8 year; // 生产年份
u8 version; // 版本号
u8 revision; // 修订号
u8 input; // 输入参数
u8 width_cm; // 屏幕宽度
u8 height_cm; // 屏幕高度
u8 gamma; // Gamma值
u8 features; // 特性支持
// ... 其他参数
};
// 详细时序结构
struct detailed_timing {
u16 pixel_clock; // 像素时钟
u8 h_active; // 水平分辨率
u8 h_blanking; // 水平消隐
u8 v_active; // 垂直分辨率
u8 v_blanking; // 垂直消隐
// ... 其他时序参数
};
1.3 核心函数
// EDID读取
static int do_get_edid(struct ddc_adapter *adap, u8 *buf) {
// 1. 通过I2C读取EDID数据
// 2. 校验EDID数据
// 3. 处理扩展块
}
// 解析详细时序
static void get_detailed_timing(struct detailed_timing *timing) {
// 1. 解析像素时钟
// 2. 解析水平时序
// 3. 解析垂直时序
// 4. 计算刷新率
}
5.3.2 显示子系统(rockchip_display.c)
2.1 主要功能
- 显示设备管理
- 显示模式配置
- 显示路径管理
2.2 关键结构
// 显示设备结构
struct rockchip_display {
struct list_head head;
struct udevice *dev;
struct rockchip_crtc *crtc; // 显示控制器
struct rockchip_connector *conn; // 显示连接器
struct drm_display_mode mode; // 显示模式
};
// 显示模式结构
struct drm_display_mode {
int clock; // 像素时钟(KHz)
int hdisplay; // 水平分辨率
int hsync_start; // 水平同步起始
int hsync_end; // 水平同步结束
int htotal; // 水平总时序
int vdisplay; // 垂直分辨率
int vsync_start; // 垂直同步起始
int vsync_end; // 垂直同步结束
int vtotal; // 垂直总时序
int flags; // 模式标志
};
2.3 初始化流程
rockchip_display_probe()
├── 1. 获取设备树配置
├── 2. 初始化显示控制器
│ └── rockchip_vop2_init()
├── 3. 初始化HDMI控制器
│ └── rockchip_dw_hdmi_init()
├── 4. 读取EDID
│ └── do_get_edid()
└── 5. 配置显示模式
└── rockchip_display_mode_set()
5.3.3 RK HDMI驱动(rockchip_dw_hdmi.c)
3.1 主要功能
- HDMI控制器初始化
- PHY配置
- 时序设置
3.2 平台数据
// RK3568 HDMI驱动数据
const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = {
.mpll_cfg = rockchip_mpll_cfg, // PLL配置表
.cur_ctr = rockchip_cur_ctr, // 电流控制
.phy_config = rockchip_phy_config, // PHY配置
.dev_type = RK3568_HDMI, // 设备类型
};
// PHY配置结构
struct rockchip_phy_config {
u32 tmdsclock; // TMDS时钟
u32 regs[8]; // PHY寄存器配置
};
3.3 关键函数
// HDMI驱动初始化
static int rockchip_dw_hdmi_probe(struct udevice *dev) {
// 1. 获取平台数据
// 2. 初始化HDMI控制器
// 3. 配置PHY
// 4. 使能时钟
}
// PHY配置
static int rockchip_phy_configure(struct dw_hdmi *hdmi) {
// 1. 配置PLL
// 2. 设置带宽
// 3. 配置阻抗
// 4. 使能PHY
}
5.3.4 DW HDMI核心驱动(dw_hdmi.c)
4.1 主要功能
- HDMI控制器寄存器操作
- 音视频配置
- HDCP处理
4.2 关键寄存器
// HDMI主要寄存器
#define HDMI_IH_FC_STAT0 0x0100 // 中断状态
#define HDMI_FC_INVIDCONF 0x1000 // 视频配置
#define HDMI_FC_INHACTV0 0x1001 // 水平激活
#define HDMI_FC_INHACTV1 0x1002
#define HDMI_FC_INVACTV0 0x1003 // 垂直激活
#define HDMI_FC_INVACTV1 0x1004
#define HDMI_PHY_CONF0 0x3000 // PHY配置
#define HDMI_PHY_TST0 0x3001
4.3 核心函数
// HDMI控制器设置
static void dw_hdmi_setup(struct dw_hdmi *hdmi) {
// 1. 软件复位
// 2. 配置视频模式
// 3. 配置音频模式
// 4. 使能HDMI输出
}
// 视频模式配置
static void hdmi_video_mode_config(struct dw_hdmi *hdmi) {
// 1. 设置时序参数
// 2. 配置像素重复
// 3. 配置色彩空间
// 4. 配置色深
}
5.4 设置分辨率的主要步骤
1.1 CEA标准模式 (edid_cea_modes)
// drivers/video/drm/drm_edid.c
const struct drm_display_mode edid_cea_modes[] = {
// 640x480p@60Hz
{
DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
752, 800, 0, 480, 490, 492, 525, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
.vrefresh = 60,
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3
},
// 1920x1080p@60Hz
{
DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
.vrefresh = 60,
.picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9
},
// ... 其他CEA模式
};
1.2 VESA DMT标准模式 (drm_dmt_modes)
// drivers/video/drm/drm_edid.c
const struct drm_display_mode drm_dmt_modes[] = {
// 1024x768@60Hz
{
DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
1184, 1344, 0, 768, 771, 777, 806, 0,
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
.vrefresh = 60,
},
// ... 其他DMT模式
};
1.3 建立的时序模式 (edid_est_modes)
// drivers/video/drm/drm_edid.c
const struct established_timings edid_est_modes[] = {
{
.timing = { 800, 600, 60 },
.est_timing = EST_TIMING_800x600_60
},
// ... 其他基础时序
};
1.4 白名单分辨率 (resolution_white)
// drivers/video/drm/rockchip_display.c
static const struct base_screen_info resolution_white[] = {
{
.type = DRM_MODE_CONNECTOR_HDMIA,
.mode = {
.clock = 74250,
.hdisplay = 1280,
.hsync_start = 1390,
.hsync_end = 1430,
.htotal = 1650,
.vdisplay = 720,
.vsync_start = 725,
.vsync_end = 730,
.vtotal = 750,
.flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
},
},
};
5.6 分辨率设置流程
2.1 基本流程代码
int set_display_mode(struct display_state *state, int width, int height, int refresh)
{
struct connector_state *conn_state = &state->conn_state;
struct drm_display_mode *mode = NULL;
// 1. 检查白名单
mode = find_mode_in_whitelist(width, height, refresh);
if (mode)
goto found;
// 2. 检查CEA模式
mode = find_cea_mode(width, height, refresh);
if (mode)
goto found;
// 3. 检查DMT模式
mode = find_dmt_mode(width, height, refresh);
if (mode)
goto found;
// 4. 使用建立的时序
mode = find_est_mode(width, height, refresh);
if (!mode)
return -EINVAL;
found:
conn_state->mode = *mode;
return 0;
}
2.2 模式查找函数
static struct drm_display_mode *find_cea_mode(int width, int height, int refresh)
{
int i;
for (i = 0; i < ARRAY_SIZE(edid_cea_modes); i++) {
const struct drm_display_mode *mode = &edid_cea_modes[i];
if (mode->hdisplay == width &&
mode->vdisplay == height &&
mode->vrefresh == refresh)
return (struct drm_display_mode *)mode;
}
return NULL;
}
2.3 HDMI配置示例
int configure_hdmi_mode(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
{
struct display_timing timing = {
.pixelclock.typ = mode->clock * 1000,
.hactive.typ = mode->hdisplay,
.hfront_porch.typ = mode->hsync_start - mode->hdisplay,
.hback_porch.typ = mode->htotal - mode->hsync_end,
.hsync_len.typ = mode->hsync_end - mode->hsync_start,
.vactive.typ = mode->vdisplay,
.vfront_porch.typ = mode->vsync_start - mode->vdisplay,
.vback_porch.typ = mode->vtotal - mode->vsync_end,
.vsync_len.typ = mode->vsync_end - mode->vsync_start,
};
return dw_hdmi_enable(hdmi, &timing);
}
2.4 使用建议
优先级顺序:
- 白名单分辨率
- CEA标准模式
- DMT标准模式
- 建立的时序模式
注意事项: - 检查EDID支持情况
- 验证硬件带宽限制
- 考虑色深设置
- 确认时钟频率正确
6 saveBaseParameter程序来设置显示器参数(引用原文)
rockchip android平台支持多种类型的显示器接口,如HDMI、DP、eDP、MIPI等。为了方便开发者和用户对显示器的参数进行设置和修改,rockchip提供了一个工具程序saveBaseParameter,它可以读取和写入baseparameter.img文件,这个文件存储在设备的分区中,包含了显示器的参数,如分辨率、色彩、帧缓冲区、亮度、对比度等。
本文将介绍如何使用saveBaseParameter程序来设置rockchip android平台的显示器参数,包括以下几个方面:
- 如何编译和运行saveBaseParameter程序
- 如何查看和修改显示器的参数
- 如何支持双显示器的输出
- 如何恢复显示器的默认参数
6.1 如何编译和运行saveBaseParameter程序
要编译saveBaseParameter程序,你需要先下载rockchip android平台的源码,然后在源码目录下执行以下命令:
mmm device/rockchip/common/baseparameter
[图片]
这样就会在out/target/product/rk3568_r/vendor/bin/目录下生成saveBaseParameter可执行文件,你可以把它拷贝到设备上运行,或者通过adb shell命令来运行。
要运行saveBaseParameter程序,你需要把它推送到设备的/vendor/bin目录下,并且给它可执行的权限。你可以在设备上打开一个终端,或者在电脑上打开一个命令行窗口,然后输入以下命令:
adb root
adb remount
adb push out\target\product\rk3568_r\vendor\bin\saveBaseParameter /vendor/bin/saveBaseParameter
adb shell chmod 755 /vendor/bin/saveBaseParameter
[图片]
然后,你可以运行saveBaseParameter程序,它会打印出用法说明,告诉你有哪些选项和参数可以使用。例如,你可以输入以下命令:
adb shell saveBaseParameter -h
这样就会打印出帮助信息,如下所示:
rk3568_r:/ # saveBaseParameter -h
saveParameter: read and write baseparameter partition tool
Usage:
-h Help info
-p Print Baseparamter
-t output to target file (e: “/sdcard/baseparameter.img)”
-f Framebuffer Resolution (e: 1920x1080@60)
-c Color (e: RGB-8bit or YCBCR444-10bit)
-u Is Enable Auto Resolution (auto resolution:“auto”;set one fixed resolution:
hdisplay,vdisplay,vrefresh,hsync_start,hsync_end,htotal,vsync_start,vsync_end,vtotal,vscan,flags,clock
e: “1920,1080,60,2008,2052,2200,1084,1089,1125,0,5,148500”)
-o Overscan (left,top,right,bottom e: overscan “100,100,100,100”)
-b BCSH (brightness,contrast,saturation,hue e: “50,50,50,50”)
-R Reset Baseparameter (1:only reset user setting baseparameter partition; 2:reset baseparameter paratition include backup)
-C Choose Connector type and id to Setting (e: 11,0 or 16,0)
Example: saveBaseParameter -C “16,0” -f “1920x1080@60” -c Auto -u 2 -o “100,100,100,100” -b “50,50,50,50”
===== Rockchip All Rights Reserved =====
如何查看和修改显示器的参数
要查看和修改显示器的参数,你需要先选择要设置的显示器接口的类型和编号,然后根据你的需要选择不同的选项和参数来设置显示器的参数。
如何选择显示器接口的类型和编号
rockchip android平台支持以下几种类型的显示器接口:
暂时无法在飞书文档外展示此内容
connector_id表示接口的序号,从0开始。你可以通过运行以下命令来查看当前连接的显示器接口的类型和编号:
rk3568_r:/ # cat /sys/kernel/debug/dri/0/state
你可以通过运行以下命令来选择要设置的显示器接口的类型和编号:
adb shell saveBaseParameter -C “type,id”
其中,type和id表示要设置的显示器接口的类型和编号。例如,如果你想要选择第一个HDMI-A接口(connector_type为11,connector_id为0),你可以输入以下命令:
adb shell saveBaseParameter -C “11,0”
如何查看显示器的参数
要查看显示器的参数,你可以运行以下命令:
rk3568_r:/ # saveBaseParameter -p
print baseparameter
========== base parameter ==========
-connector type: 11 connector id: 0 offset: 104
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
-connector type: 11 connector id: 1 offset: 37040
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
========= backup parameter ==========
-connector type: 11 connector id: 0 offset: 104
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
-connector type: 11 connector id: 1 offset: 37040
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
====================================
这样就会打印出baseparameter.img文件中的所有参数,包括显示器的分辨率、色彩、帧缓冲区、亮度、对比度等。例如,如果你想要查看第一个HDMI-A接口(connector_type为11,connector_id为0)的显示器参数,你可以输入以下命令:
adb shell saveBaseParameter -C “11,0” -p
这样就会打印出类似于以下内容:
disp_info[0]:
connector_type = HDMIA
connector_id = 0
overscan_info.maxvalue = 100;
overscan_info.leftscale = 100;
overscan_info.rightscale = 100;
overscan_info.topscale = 100;
overscan_info.bottomscale = 100;
drm_display_mode.hdisplay = 1920;
drm_display_mode.vdisplay = 1080;
drm_display_mode.vrefresh = 60;
drm_display_mode.hsync_start = 2008;
drm_display_mode.hsync_end = 2052;
drm_display_mode.htotal = 2200;
drm_display_mode.vsync_start = 1084;
drm_display_mode.vsync_end = 1089;
drm_display_mode.vtotal = 1125;
drm_display_mode.vscan = 0;
drm_display_mode.flags = 5;
drm_display_mode.clock = 148500;
framebuffer_info.framebuffer_width = 0;
framebuffer_info.framebuffer_height = 0;
framebuffer_info.fps = 60;
bcsh_info.brightness = 50;
bcsh_info.contrast = 50;
bcsh_info.saturation = 50;
bcsh_info.hue = 50;
如何修改显示器的参数
要修改显示器的参数,你可以根据你的需要选择不同的选项和参数来设置显示器的参数。以下是一些常用的选项和参数:
- -f:设置显示器的分辨率和刷新率,格式为widthxheight@fps。例如,如果你想要把第一个HDMI-A接口(connector_type为11,connector_id为0)的显示器分辨率设置为1920x1080,刷新率设置为60,你可以输入以下命令:
adb shell saveBaseParameter -C “11,0” -f “3840x2160@60”
这是改完重启后的结果 ,发现HDMI显示确实变成了3840x2160了。只影响系统开机后的显示 ,就是kernel阶段跑完进入动画发现显示的分辨率就和设置的一样了。
rk3568_r:/ # saveBaseParameter -p
print baseparameter
========== base parameter ==========
-connector type: 11 connector id: 0 offset: 104
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 3840x2160@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
- -c:设置显示器的色彩格式和深度,格式为color-depth。你可以选择以下几种色彩格式和深度:
暂时无法在飞书文档外展示此内容
如果你选择Auto,那么程序会根据显示器的能力和信号源的要求来自动选择合适的色彩格式和深度。例如,如果你想要把第一个DP接口(connector_type为15,connector_id为0)的显示器色彩格式和深度设置为自动,你可以输入以下命令:
rk3568_r:/ # saveBaseParameter -C "11,0" -c Auto
rk3568_r:/ # saveBaseParameter -C "11,0" -c Auto
connector 11,0 (-C)
color Auto (-c)
rk3568_r:/ # saveBaseParameter -p
print baseparameter
========== base parameter ==========
-connector type: 11 connector id: 0 offset: 104
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 4 depth 0
feature: 0x2
fbinfo: 3840x2160@120
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
-connector type: 11 connector id: 1 offset: 37040
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
- -u:设置显示器是否开启自动分辨率,格式为mode。如果mode为0,表示关闭自动分辨率,只输出固定的分辨率;如果mode非0,表示开启自动分辨率,根据显示器的能力和信号源的要求来输出合适的分辨率。例如,如果你想要把第一个HDMI-A接口(connector_type为11,connector_id为0)的显示器开启自动分辨率,你可以输入以下命令:
adb shell saveBaseParameter -C "11,0" -u 2
rk3568_r:/ # saveBaseParameter -C "11,0" -u 2
connector 11,0 (-C)
resolution 2 (-u)
rk3568_r:/ #
rk3568_r:/ # saveBaseParameter -p
print baseparameter
========== base parameter ==========
-connector type: 11 connector id: 0 offset: 104
resolution: 2x0@p0-0-0-0-0-0-0-0 clk=0
corlor: format 4 depth 0
feature: 0x0
fbinfo: 3840x2160@120
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
-connector type: 11 connector id: 1 offset: 37040
resolution: 1920x1080@p60-2008-2052-2200-1084-1089-1125-5 clk=148500
corlor: format 0 depth 0
feature: 0x0
fbinfo: 0x0@60
bcsh: 50 50 50 50
overscan: 100 100 100 100
gamma size:0
3dlut size:0
- -o:设置显示器的overscan,即边缘裁剪,格式为left,top,right,bottom。overscan值越大,表示裁剪的范围越小。例如,如果你想要把第一个eDP接口(connector_type为16,connector_id为0)的显示器overscan设置为100,100,100,100,即不裁剪,你可以输入以下命令:
adb shell saveBaseParameter -C “16,0” -o “100,100,100,100” - -b:设置显示器的亮度、对比度、饱和度和色调,格式为brightness,contrast,saturation,hue。BCSH值的范围是0到100。例如,如果你想要把第一个DP接口(connector_type为15,connector_id为0)的显示器亮度设置为80,对比度设置为60,饱和度设置为70,色调设置为50,你可以输入以下命令:
adb shell saveBaseParameter -C “15,0” -b “80,60,70,50”
如何支持双显示器的输出
要支持双显示器的输出,即同时输出两个不同的画面,你需要先选择两个不同的显示器接口的类型和编号,然后分别设置它们的参数。
例如,如果你想要把第一个HDMI-A接口(connector_type为11,connector_id为0)和第一个DP接口(connector_type为15,connector_id为0)同时输出不同的画面,你可以输入以下命令:
adb shell saveBaseParameter -C “11,0” -f “1920x1080@60” -c Auto -u 2 -o “100,100,100,100” -b “50,50,50,50”
adb shell saveBaseParameter -C “15,0” -f “1280x720@60” -c Auto -u 2 -o “90,90,90,90” -b “60,60,60,60”
这样就完成了双显示器的输出的设置。你可以通过查看设备的显示器来确认是否生效。如果你想要关闭双显示器的输出,只输出一个画面,你可以输入以下命令:
adb shell saveBaseParameter -C “type,id” -f “0x0@0”
其中,type,id表示要关闭的显示器接口的类型和编号。例如,如果你想要关闭第一个DP接口(connector_type为15,connector_id为0)的输出,只输出第一个HDMI-A接口(connector_type为11,connector_id为0)的画面,你可以输入以下命令:
adb shell saveBaseParameter -C “15,0” -f “0x0@0”
如何恢复显示器的默认参数
要恢复显示器的默认参数,你可以运行以下命令:
adb shell saveBaseParameter -R
这样就会把baseparameter.img文件重置为备份的设置。