u-boot显示模块学习

news2025/1/23 23:22:53

**

1-5由大模型自动学习和输出

**

  1. U-Boot 项目的代码主要结构和功能:
    主要用于:
  • 系统初始化
  • 硬件检测与配置
  • 内核加载与启动
  • 提供调试环境
    代码组织清晰,模块化程度高,支持多种硬件平台和功能配置。
  1. 整体架构:
  • arch/: 处理器架构相关代码(ARM、MIPS等)
  • board/: 各种开发板的板级支持包
  • cmd/: U-Boot 命令实现
  • common/: 通用功能代码
  • drivers/: 各类驱动程序
  • dts/: 设备树文件
  • include/: 头文件
  • net/: 网络相关代码
  • lib/: 通用库函数
  • tools/: 开发工具
  1. 主要功能模块:
  • 引导加载:
    • 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: 配置选项定义
  1. 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)
{
    // 配置时钟
    // 初始化寄存器
    // 配置显示时序
    // 配置图层
}
  1. 显示接口(如HDMI):
// drivers/video/bridge/rockchip_hdmi.c
static int rockchip_hdmi_init(struct display_state *state)
{
    // PHY初始化
    // 时序配置  
    // HDCP配置(如果需要)
}
  1. 显示操作:
// 帧缓冲操作
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, ...); // 格式化输出
  1. 显示配置:
// include/configs/rk3568_common.h
#define CONFIG_VIDEO_ROCKCHIP
#define CONFIG_DISPLAY_ROCKCHIP
#define CONFIG_DRM_ROCKCHIP
#define CONFIG_LCD_BPP                 LCD_BPP_32  // 颜色深度
  1. 显示初始化时序:
    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等)
  • 多层显示
  • 硬件加速
  • 各种颜色格式
  • 动态分辨率切换
    主要用于:
  1. 显示启动信息

  2. 提供命令行界面

  3. 显示启动Logo

  4. 支持图形化菜单

  5. 整个显示系统架构清晰,层次分明,具有良好的可扩展性和可维护性。

  6. 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显示
  • 调试信息输出
  • 图形界面支持
  • 视频播放支持
  1. 修改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 },
};
  1. hdmi屏输出模块
    5.1 整体架构
  2. 显示子系统
    ├── 显示控制器(VOP2.0)
    ├── HDMI控制器(DW HDMI)
    ├── HDMI PHY
    └── 显示接口(HDMI/DP/DSI等)
  3. 源码结构
    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 显示模式设置流程
  4. 基本流程
    设置显示模式
    ├── 1. 读取EDID获取支持的模式
    ├── 2. 选择合适的显示模式
    ├── 3. 配置VOP参数
    │ ├── 时序配置
    │ └── 图层配置
    ├── 4. 配置HDMI控制器
    │ ├── 视频配置
    │ └── 音频配置
    └── 5. 配置HDMI PHY
    ├── PLL设置
    └── 带宽配置
  5. 关键代码
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文件重置为备份的设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC视频生成明星——Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

Genetic Prompt Search via Exploiting Language Model Probabilities

题目 利用语言模型概率的遗传提示搜索 论文地址&#xff1a;https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址&#xff1a;https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力&#xff0c;尤其是在诸如fewshot学习…

NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D

在全球拥有近100家工厂的舍弗勒&#xff0c;从2016年开启数字化运营进程&#xff0c;而当前制造、库存、劳动力和物流的数字化&#xff0c;已无法支持其进一步简化工作流程&#xff0c;亟需数字化物理制造环境&#xff0c;打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…

最新-CentOS 7安装1 Panel Linux 服务器运维管理面板

CentOS 7安装1 Panel Linux 服务器运维管理面板 一、前言二、环境要求三、在线安装四、离线安装1.点击下面1 Panel官网链接访问下载&#xff0c;如未登录或注册&#xff0c;请登录/注册后下载2.使用将离线安装包上传至目标终端/tem目录下3.进入到/tem目录下解压离线安装包4.执行…

vscode环境中用仓颉语言开发时调出覆盖率的方法

在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率&#xff0c;需要如下几个步骤&#xff1a; 1.在vscode中搭建仓颉语言开发环境&#xff1b; 2.在源代码中右键运行[cangjie]coverage. 思路1&#xff1a;编写了测试代码的情况&#xff08;包管理工具&#xff09; …

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…

10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据

数据已经成为企业核心竞争力的关键要素。随着大数据技术的发展&#xff0c;如何高效管理和利用海量的数据&#xff0c;已成为企业在数字化转型过程中面临的重要课题。传统的数据仓库已经不能满足当今企业对数据处理的高效性、灵活性和实时性的需求。在这种背景下&#xff0c;逻…

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

Hadoop•搭建完全分布式集群

听说这里是目录哦 一、安装Hadoop&#x1f955;二、配置Hadoop系统环境变量&#x1f96e;三、验证Hadoop系统环境变量是否配置成功&#x1f9c1;四、修改Hadoop配置文件&#x1f36d;五、分发Hadoop安装目录&#x1f9cb;六、分发系统环境变量文件&#x1f368;七、格式化HDFS文…

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…

修改word的作者 最后一次保存者 总编辑时间 创建时间 最后一次保存的日期

作者&#xff1a; 1.打开word文件 2.点击左上角的文件 3.选项 4.用户信息 5.将用户信息中的 姓名改为你需要的名字 最后一次保存者 1.word重命名为.zip文件 2.docProps中有个core.xml 3.用记事本打开有个lastModifiedBy标签&#xff0c;将里面内容改为你需要的名字 总编辑时…

C++之初识模版

目录 1.关于模版的介绍 2.函数模版 2.1函数模板概念 2.2函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5模板参数的匹配原则 3.类模版 3.1类模板的定义格式 3.2 类模板的实例化 1.关于模版的介绍 C中的模板是一种通用编程工具&#xff0c;它允许程序员编…

题解 CodeForces 131D Subway BFS C++

题目传送门 Problem - 131D - Codeforceshttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/D 翻译 地铁方案&#xff0c;对于Berland城市来说是一种经典的表示&#xff0c;由…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制&#xff1a;多个节点共享同一个“总线型”广播信道时&#xff0c;可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问&#xff0c;才能减少冲突&#xff0c;甚至避免冲突? 时分复用(TDM) 时分复用&#xff1a;将时间分为等长的“…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者&#xff1a; Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位&#xff1a;昆士兰大学&#xff0c;澳大利亚科学与工业研究组织&#xff0c;阿德莱德大学 论文标题&#xff1a;Why Only Text: Empowering Vision-and-Language Navigation wi…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序&#x1f388;3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一&#xff0c;每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法&#xff0c;排序后的数据更易于处理和查找。在计算机发展…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…