Rockchip Baseparameter 分区格式定义和使用说明
:::info 文档信息
文档标识:RK-YH-YF-194 · 发布版本:V1.0.0 · 发布日期:2021-08-27 · 页数:11 · 语言:中文
原始文档:Rockchip_Developer_Guide_Baseparameter_Format_Define_And_Use_CN.pdf
:::
章节大纲
- Rockchip Baseparameter 分区格式定义和使用说明(P1)
- 说明(P4)
- Baseparameter 分区(P4)
- 分区拓扑图(P4)
- Baseparameter 结构(P4)
- struct baseparameter_info(P5)
- struct disp_header(P5)
- struct disp_info(P5)
- 占用存储空间(P5)
- Baseparameter 基础结构说明(P6)
- struct screen_info(P6)
- struct bcsh_info(P7)
- struct overscan_info(P7)
- struct gamma_lut_data(P8)
- struct cubic_lut_data(P8)
- struct framebuffer_info(P8)
- struct reserved[244](P8)
- Baseparameter 备份分区(P9)
- Baseparameter 读写 API 说明(P9)
- Baseparameter 解析工具使用说明(P10)
- Android 软件配置流程和代码路径(P10)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. 说明
Baseparameter 分区用于存储 Rockchip 平台显示分辨率、显示效果调节的配置等信息,确保关机重启后能维持和关机之前一样的效果,并确保整个开机过程显示效果保持一致。
2. Baseparameter 分区
2.1 分区拓扑图
2.2 Baseparameter 结构
2.2.1 struct baseparameter_info
struct baseparameter_info base_info {
char head_flag[4]; /* 头标识, "BASP" */
u16 major_version; /* Baseparameter 大版本信息 */
u16 minor_version; /* Baseparameter 小版本信息 */
struct disp_header disp_header``[``8``]; ``/* 通过head可以正确找到每一个显示设备的偏移,按现在每个disp_info的大小,最多支持8个disp */
struct disp_info disp_info[8]; /* 显示设备信息 */
}
2.2.2 struct disp_header
struct disp_header {
u32 connector_type; /* 显示设备类型 */
u32 connector_id; /* 显示设备id */
u32 offset; /* disp_info 偏移 */
}
占用存储空间: 12 Byte。
2.2.3 struct disp_info
struct disp_info {
char disp_head_flag[6]; /* disp 头标识,"DISP_N", N 可以是0-7, size: 6 Byte*/
struct screen_info screen_info``[``4``]; ``/* 支持热插拔的设备接不同的设备,如DP出来可能接
DP->HDMI 或者 DP->VGA, size: 72 * 4 = 288 Byte */
struct bcsh_info bcsh_info; /* 调节亮度、对比度、饱和度、色度信息, size: 8 Byte */
struct overscan_info overscan_info; /* 过扫描信息, size: 12 Byte */
struct gamma_lut_data gamma_lut_data; /* gamma 信息, size: 6146 Byte */
struct cubic_lut_data cubic_lut_data; /* 3D lut信息, size: 29480 Byte */
struct framebuffer_info framebuffer_info; /* framebuffer信息, size: 12 Byte
*/
u32 reserved[244]; /* 预留, size: 976 Byte*/
u32 crc; /* CRC 校验, size: 4 Byte */
}
占用存储空间: 36972 Byte。
2.2.4 占用存储空间
struct disp_info 占用存储空间: 36972 Byte;
struct disp_header 占用存储空间: 12 Byte;
struct baseparameter_info 合计占用存储空间:4 + 2 + 2 + 8 x12 + 8 x 36,932 = 295848 Byte。
Baseparameter 主分区和备份分区的大小分别是512KB,目前用到的有效数据是 295848 Byte,剩下未使用的空间预留;
2.3 Baseparameter 基础结构说明
2.3.1 struct screen_info
struct screen_info: 用于保持显示接口的类型、分辨率时序等信息,占用 72 Byte。
struct screen_info {
u32 type; /* connector 类型, 4 bytes */
u32 id; /* 4 byte, 用于区别相同 type 的不同设备 */
struct drm_display_mode resolution; /* 52 bytes */
enum output_format format; /* 4 bytes */
enum output_depth depthc; /* 4 bytes */
u32 feature; /* 4 bytes */
};
type: 屏的接口类型
#define DRM_MODE_CONNECTOR_Unknown 0
#define DRM_MODE_CONNECTOR_VGA 1
#define DRM_MODE_CONNECTOR_DVII 2
#define DRM_MODE_CONNECTOR_DVID 3
#define DRM_MODE_CONNECTOR_DVIA 4
#define DRM_MODE_CONNECTOR_Composite 5
#define DRM_MODE_CONNECTOR_SVIDEO 6
#define DRM_MODE_CONNECTOR_LVDS 7
#define DRM_MODE_CONNECTOR_Component 8
#define DRM_MODE_CONNECTOR_9PinDIN 9
#define DRM_MODE_CONNECTOR_DisplayPort 10
#define DRM_MODE_CONNECTOR_HDMIA 11
#define DRM_MODE_CONNECTOR_HDMIB 12
#define DRM_MODE_CONNECTOR_TV 13
#define DRM_MODE_CONNECTOR_eDP 14
#define DRM_MODE_CONNECTOR_VIRTUAL 15
#define DRM_MODE_CONNECTOR_DSI 16
#define DRM_MODE_CONNECTOR_DPI 17
#define DRM_MODE_CONNECTOR_WRITEBACK 18
struct drm_display_mode: 扫描时序信息
struct drm_display_mode {
/* Proposed mode values */
int clock; /* in kHz */
int hdisplay;
int hsync_start;
int hsync_end;
int htotal;
int vdisplay;
int vsync_start;
int vsync_end;
int vtotal;
int vrefresh;
int vscan;
unsigned int flags;
int picture_aspect_ratio;
};
output_format: 颜色格式,属性字符串为Auto时,选择output_ycbcr_high_subsampling
enum output_format {
output_rgb=0,
output_ycbcr444=1,
output_ycbcr422=2,
output_ycbcr420=3,
output_ycbcr_high_subsampling=4, /* (YCbCr444 > YCbCr422 > YCbCr420 > RGB)
*/
output_ycbcr_low_subsampling=5, /* (RGB > YCbCr420 > YCbCr422 > YCbCr444) */
invalid_output=6,
};
depthc: 色深,属性字符串为Auto时,选择Automatic
enum output_depth{
Automatic=0,
depth_24bit=8,
depth_30bit=10,
};
feature: feature 目前有如下flag,配置分辨率以及颜色的AUTO模式,是否开启hdcp1x,是否过滤分辨率列表
#define RESOLUTION_AUTO (1<<0)
#define COLOR_AUTO (1<<1)
#define HDCP1X_EN (1<<2)
#define RESOLUTION_WHITE_EN (1<<3)
2.3.2 struct bcsh_info
保存bcsh信息,取值范围0~100,默认值都是50,用于调节亮度、对比度、饱和度、色度:
struct bcsh_info {
unsigned short brightness;
unsigned short contrast;
unsigned short saturation;
unsigned short hue;
};
2.3.3 struct overscan_info
过扫描缩放系数
struct overscan_info {
unsigned int maxvalue;
unsigned short leftscale;
unsigned short rightscale;
unsigned short topscale;
unsigned short bottomscale;
};
2.3.4 struct gamma_lut_data
保存gamma lut data信息,size表示每个rgb lut表中有多少个数据,最大为1024
struct gamma_lut_data{
u16 size;
u16 lred[1024];
u16 lgreen[1024];
u16 lblue[1024];
};
2.3.5 struct cubic_lut_data
保存cubic lut data信息,size表示每个rgb lut表中有多少个数据,最大为17x17x17 = 4913
struct cubic_lut_data{
u16 size;
u16 lred[4913];
u16 lgreen[4913];
u16 lblue[4913];
};
2.3.6 struct framebuffer_info
预设 framebuffer 信息
struct framebuffer_info {
u32 framebuffer_width;
u32 framebuffer_height;
u32 fps;
};
2.3.7 struct reserved[244]
预留配置信息
2.4 Baseparameter 备份分区
baseparameter 的后半部分用来保存初始数据,恢复出厂设置的时候将备份分区的数据拷贝到主分区。
3. Baseparameter 读写 API 说明
为方便应用层对 Baseparameter 分区的读写,将以库的形式提供统一的 API 供不同的应用调用。库的源码位置在:hardware/rockchip/libbaseparameter API说明:
bool have_baseparameter(); /* 判断是否有baseparameter分区 */
int dump_baseparameter(const char *file_path); /* 导出baseparameter分区数据到文件
*/
int get_disp_info(unsigned int connector_type, unsigned int connector_id, struct
disp_info *info); /* 获取disp_info */
int set_disp_info(unsigned int connector_type, unsigned int connector_id, struct
disp_info *info); /* 设置disp_info */
int get_screen_info(unsigned int connector_type, unsigned int connector_id, int
index, struct screen_info *screen_info); /* 获取screen_info */
int set_screen_info(unsigned int connector_type, unsigned int connector_id, int
index, struct screen_info *screen_info); /* 设置screen_info */
unsigned short get_brightness(unsigned int connector_type, unsigned int
connector_id); /* 获取亮度 */
unsigned short get_contrast(unsigned int connector_type, unsigned int
connector_id); /* 获取对比度 */
unsigned short get_saturation(unsigned int connector_type, unsigned int
connector_id); /* 获取饱和度 */
unsigned short get_hue(unsigned int connector_type, unsigned int connector_id);
/* 获取色调 */
int set_brightness(unsigned int connector_type, unsigned int connector_id,
unsigned short value); /* 设置亮度 */
int set_contrast(unsigned int connector_type, unsigned int connector_id, unsigned
short value); /* 设置对比度 */
int set_saturation(unsigned int connector_type, unsigned int connector_id,
unsigned short value); /* 设置饱和度 */
int set_hue(unsigned int connector_type, unsigned int connector_id, unsigned
short value); /* 设置色调 */
int get_overscan_info(unsigned int connector_type, unsigned int connector_id,
struct overscan_info *overscan_info); /* 获取overscan_info */
int set_overscan_info(unsigned int connector_type, unsigned int connector_id,
struct overscan_info *overscan_info); /* 设置overscan_info */
int get_gamma_lut_data(unsigned int connector_type, unsigned int connector_id,
struct gamma_lut_data *data); /* 获取gamma数据 */
int set_gamma_lut_data(unsigned int connector_type, unsigned int connector_id,
struct gamma_lut_data *data); /* 设置gamma数据 */
int get_cubic_lut_data(unsigned int connector_type, unsigned int connector_id,
struct cubic_lut_data *data); /* 获取3dlut数据 */
int set_cubic_lut_data(unsigned int connector_type, unsigned int connector_id,
struct cubic_lut_data *data); /* 设置3dlut数据 */
int set_disp_header(unsigned int index, unsigned int connector_type, unsigned int
connector_id); /* 设置connector_id,connector_type和分区中disp_info的对应关系 */
bool validate``(); ``/* 判断分区数据是否有效 */
int get_framebuffer_info(unsigned int connector_type, unsigned int connector_id,
framebuffer_info *info);
int set_framebuffer_info(unsigned int connector_type, unsigned int connector_id,
framebuffer_info *info);
int get_baseparameter_info(unsigned int index, baseparameter_info *info);
int set_baseparameter_info(unsigned int index, baseparameter_info *info);
4. Baseparameter 解析工具使用说明
saveBaseParameter 是 Android上用来对 baseparameter 分区管理工具,实现了打印、修改分区数据等功能。工具的源码位置:device/rockchip/common/baseparameter/saveBaseParameter使用说明:
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,vs
ync_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"
5. Android 软件配置流程和代码路径
DisplayAjust源码位置:packages/apps/DisplayAdjust流程图: