ROC-RK3399-PC 的LCD驱动介绍

LCD使用

简介

ROC-RK3399-PC 开发板默认外置支持了两个LCD屏接口,一个是MIPI-DSI,一个是eDP,板子上对应的LCD接口位置如下图所示:

_images/roc-rk3399-pc6.jpg

  • MIPI 接口

  • eDP 接口

  • 通用type-C转DP 接口

  • HDMI 接口

ROC-RK3399-PC 的ubuntu系统默认支持MIPI屏幕,如果使用eDP屏幕需要更换DTS。

MIPI屏

配置MIPI-DSI

ROC-RK3399-PC 的MIPI-DSI的使用的是RK原厂的基本配置,如果不考虑热拔插和功耗控制可以不配置其它管脚:

kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi:

dsi: dsi@ff960000 {
	compatible = "rockchip,rk3399-mipi-dsi";
	reg = <0x0 0xff960000 0x0 0x8000>;
	interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH 0>;
	clocks = <&cru SCLK_DPHY_PLL>, <&cru PCLK_MIPI_DSI0>,
		 <&cru SCLK_DPHY_TX0_CFG>;
	clock-names = "ref", "pclk", "phy_cfg";
	power-domains = <&power RK3399_PD_VIO>;
	resets = <&cru SRST_P_MIPI_DSI0>;
	reset-names = "apb";
	rockchip,grf = <&grf>;
	status = "disabled";
	#address-cells = <1>;
	#size-cells = <0>;

	ports {
		port {
			#address-cells = <1>;
			#size-cells = <0>;

			dsi_in_vopb: endpoint@0 { //从RK自定义显卡vopb输入
				reg = <0>;
				remote-endpoint = <&vopb_out_dsi>;
			};

			dsi_in_vopl: endpoint@1 {//从RK自定义显卡vopl输入
				reg = <1>;
				remote-endpoint = <&vopl_out_dsi>;
			};
		};
	};
};

其它相应的更改如下:

kernel/arch/arm64/boot/dts/rockchip/rk3399-roc-pc-mipi.dts

//mipi
&dsi {
	status = "okay";
	//status = "okay";
	dsi_panel: panel {
		compatible ="simple-panel-dsi";
		reg = <0>;
		backlight = <&backlight>;
		power-supply = <&vcc_lcd>;
		dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST)>;
		dsi,format = <MIPI_DSI_FMT_RGB888>;
		bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;
		dsi,lanes = <4>;
		reset-delay-ms = <20>;
		init-delay-ms = <20>;
		enable-delay-ms = <120>;
		prepare-delay-ms = <120>;
		status = "okay";

		panel-init-sequence = [
			05 20 01 29
			05 96 01 11
		];

		panel-exit-sequence = [
			05 05 01 28
			05 78 01 10
		];

		disp_timings: display-timings {
			native-mode = <&timing0>;

			timing0: timing0 {
				clock-frequency = <80000000>;
				hactive = <768>;
				vactive = <1024>;
				hsync-len = <20>;
				hback-porch = <110>;
				hfront-porch = <170>;
				vsync-len = <40>;
				vback-porch = <130>;
				vfront-porch = <136>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};
	};
};

配置背光

ROC-RK3399-PC 开发板外置了一个背光接口用来控制屏幕背光,如下图所示:

img/ROC-RK3399-PC/MIPI-DSI_pin.jpg

在DTS文件:kernel/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi中配置了背光信息,brightness-levels属性:配置背光亮度数组,最大值为255,配置暗区和亮区,并把亮区数组做255的比例调节。比如范例中暗区是255-221,亮区是220-0(具体请参考kernel中的说明文档:kernel/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt)。其中default-brightness-level属性设置开机时默认背光亮度,范围为0-255。基本配置信息如下:

/ {
	compatible = "firefly,roc-rk3399-pc", "rockchip,rk3399";

	backlight: backlight {
		status = "okay";
		compatible = "pwm-backlight";
		pwms = <&pwm1 0 25000 0>;
		brightness-levels = <
			  0   1   2   3   4   5   6   7
			  8   9  10  11  12  13  14  15
			 16  17  18  19  20  21  22  23
			 24  25  26  27  28  29  30  31
			 32  33  34  35  36  37  38  39
			 40  41  42  43  44  45  46  47
			 48  49  50  51  52  53  54  55
			 56  57  58  59  60  61  62  63
			 64  65  66  67  68  69  70  71
			 72  73  74  75  76  77  78  79
			 80  81  82  83  84  85  86  87
			 88  89  90  91  92  93  94  95
			 96  97  98  99 100 101 102 103
			104 105 106 107 108 109 110 111
			112 113 114 115 116 117 118 119
			120 121 122 123 124 125 126 127
			128 129 130 131 132 133 134 135
			136 137 138 139 140 141 142 143
			144 145 146 147 148 149 150 151
			152 153 154 155 156 157 158 159
			160 161 162 163 164 165 166 167
			168 169 170 171 172 173 174 175
			176 177 178 179 180 181 182 183
			184 185 186 187 188 189 190 191
			192 193 194 195 196 197 198 199
			200 201 202 203 204 205 206 207
			208 209 210 211 212 213 214 215
			216 217 218 219 220 221 222 223
			224 225 226 227 228 229 230 231
			232 233 234 235 236 237 238 239
			240 241 242 243 244 245 246 247
			248 249 250 251 252 253 254 255>;
		default-brightness-level = <200>;
	};
  ...
}

pwms属性:配置PWM,范例里面默认使用pwm1,25000ns是周期(40 KHz):

pwms = <&pwm1 0 25000 0>;

配置时序

  • MIPI屏的 Timing 写在DTS文件中,在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-mipi.dts中可以看到以下语句:

disp_timings: display-timings {
    native-mode = <&timing0>;
    timing0: timing0 {
         clock-frequency = <80000000>;
         hactive = <768>;
         vactive = <1024>;
         hsync-len = <20>;   //20, 50
         hback-porch = <130>; //50, 56
         hfront-porch = <150>;//50, 30
         vsync-len = <40>;
         vback-porch = <130>;
         vfront-porch = <136>;
         hsync-active = <0>;
         vsync-active = <0>;
         de-active = <0>;
         pixelclk-active = <0>;
           };
    }
}
  • Kernel 在kernel/drivers/gpu/drm/panel/panel-simple.c中可以看到在初始化函数panel_simple_probe中初始化了获取时序的函数。

static int panel_simple_probe(struct device *dev, const struct panel_desc *desc){
···
 panel->base.funcs = &panel_simple_funcs;
···
}

该函数的在kernel/drivers/gpu/drm/panel/panel-simple.c中也有定义:

static int panel_simple_get_timings(struct drm_panel *panel,unsigned int num_timings,struct display_timing *timings)
{
    struct panel_simple *p = to_panel_simple(panel);
    unsigned int i;
    if (!p->desc)
        return 0;

    if (p->desc->num_timings < num_timings)
        num_timings = p->desc->num_timings;

    if (timings)
        for (i = 0; i < num_timings; i++)
        timings[i] = p->desc->timings[i];
    return p->desc->num_timings;
}

eDP

待续。。

<think>首先,用户的问题是关于分析一个特定的Make命令:`make PID=be68v1_1 firmware image V=s`。我需要基于提供的站内引用来回答这个问题。 回顾提供的引用: - [^1]:讨论编译生成内核模块文件ch343.ko后加载驱动- [^2]:显示在打包过程中修改文件,去掉trust分区。 - [^3]:似乎是系统日志输出,显示vcc3v3_lcd_edp被禁用。 - [^4]:关于检查NFD是否运行并添加Helm仓库。 用户的问题集中在分析`make PID=be68v1_1 firmware image V=s`命令。命令中有几个部分: - `make`:构建工具。 - `PID=be68v1_1`:指定一个参数或变量值。 - `firmware image`:目标,可能是构建固件映像。 - `V=s`:设置变量V为s,可能表示verbose输出或特定模式。 我需要理解这个命令的上下文。引用中没有直接提到这个命令,所以我应该基于一般知识解释: - `make` 是一个自动化构建工具,用于编译和链接代码。 - `PID=be68v1_1`:PID可能代表Product ID或Project ID,这是一个自定义变量设置。 - `firmware image`:目标,意味着构建一个固件映像。 - `V=s`:通常,V用于verbosity级别,s可能代表silent或其他,但常见的是V=1或V=verbose;这里s可能是特定选项。 从引用[^1]提到`sudo make load`和`sudo make install`,显示Makefile用于驱动加载和安装。引用[^2]涉及打包过程,修改package-file。引用[^4]有Helm命令,用于Kubernetes相关任务。这个命令看起来像在构建嵌入式系统或固件,可能与RK3399RK3588相关(从引用[^2]和[^3])。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。" 但在这个对话中,这是第一个问题,没有上一次回答。系统提示说:"参考用户上一次的问题和你的回答",但在这个上下文中,我是第一次回应这个用户请求。 因此,我应该专注于分析这个命令,基于提供的引用和一般知识。 结构化回答: - 解释命令的各个部分。 - 推测命令的作用。 - 基于引用推断可能的上下文。 - 提供相关建议或潜在问题。 引用[^1]提到编译内核模块和加载驱动,这可能与固件构建相关。 引用[^2]讨论打包固件时去掉trust分区,暗示固件映像构建。 引用[^3]显示系统日志,可能与嵌入式设备相关。 引用[^4]关于Helm和NFD,似乎无关,但可能在更大系统中。 所以,命令`make PID=be68v1_1 firmware image V=s` 可能用于构建一个特定产品ID的固件映像,并启用详细输出。 步骤: 1. **解释命令**: - `make`: 构建工具。 - `PID=be68v1_1`: 设置环境变量PID为be68v1_1,可能是产品标识符。 - `firmware image`: Makefile中的目标,负责生成固件映像。 - `V=s`: 设置verbosity选项;s可能表示"silent"或"summary",但通常V=s可能不是标准;常见的是V=0为安静,V=1为详细。这里s可能是自定义。 在某些系统中,V=s可能意味着"show commands",类似make -n或类似的东西。但在Linux内核构建中,V=1用于详细输出。所以推测V=s可能启用详细输出。 2. **命令作用**: - 这个命令会构建一个固件映像,针对产品ID be68v1_1。 - 输出可能是详细的日志,帮助调试构建过程。 3. **基于引用的上下文**: - 从引用[^2],有关于RK3399的打包文件修改,暗示这可能是一个Rockchip平台的固件构建过程。 - 引用[^1]中的加载驱动可能相关,如果固件包括内核模块。 - PID=be68v1_1 可能与特定设备型号相关。 4. **潜在问题**: - 如果构建失败,V=s可以提供更多细节。 - 用户可能需要检查Makefile或构建脚本以理解目标。 5. **生成相关问题**:根据系统指令,我需要在回答末尾生成相关问题。 回答结构: - 使用中文回答。 - 结构清晰:解释命令、推测作用、给出建议。 - 引用相关部分:例如,提到引用[^2]关于打包过程的修改。 - 末尾添加相关问题。 最终回答大纲: 1. 介绍命令分析。 2. 分解命令部分解释。 3. 推测整体作用。 4. 基于引用提供上下文洞察。 5. 给出建议。 6. 生成相关问题。 </think>### Make命令分析:`make PID=be68v1_1 firmware image V=s` 用户查询的指令 `make PID=be68v1_1 firmware image V=s` 是一个使用 GNU Make 工具的构建命令,用于自动化编译和生成固件映像。下面我将基于一般知识并结合提供的站内引用内容,逐步分析该命令的各个部分、作用、潜在上下文和可能的问题点。分析时参考了引用内容中涉及的固件构建、驱动加载和打包过程[^1][^2]。 #### 1. **命令分解与解释** - **`make`**:这是 GNU Make 工具的主命令,用于解析 Makefile 文件并执行定义的构建规则。Makefile 通常包含源代码编译、链接和打包的自动化指令[^1]。 - **`PID=be68v1_1`**:这是一个变量赋值,其中 `PID` 可能表示“Product ID”或“Project ID”,指定了目标设备或项目的标识符(如 `be68v1_1` 可能是特定硬件型号的代号)。在固件构建中,这种变量常用于切换配置或选择目标平台(参考引用[^2]中的打包文件修改,其中涉及 RK3399 平台)。 - **`firmware image`**:这是 Makefile 中的目标(target),表示构建固件映像(firmware image)。固件映像通常是嵌入式系统中的二进制文件,包含引导程序(bootloader)、内核模块或完整系统镜像(类似引用[^1]中的内核模块 `.ko` 文件生成)。 - **`V=s`**:设置环境变量 `V` 的值为 `s`,通常用于控制构建过程的输出详细级别(verbosity)。常见用法: - `V=0` 或默认:安静模式,仅显示基本输出。 - `V=1`:详细模式,显示编译命令和细节。 - `V=s`:在某些系统中,`s` 可能与“silent”或“summary”相关,但更常见的是 `V=s` 表示“show commands”,类似于 `make -n`(模拟执行),用于调试构建流程而不实际运行命令。如果输出包含详细日志,则可能用于诊断错误(类似引用[^3]中的系统日志输出)。 #### 2. **整体命令作用推测** - 该命令旨在为产品 ID `be68v1_1` 构建固件映像(firmware image),并启用详细输出模式(`V=s`)。 - **预期行为**: - Make 工具会查找当前目录中的 Makefile。 - 根据 `PID=be68v1_1` 加载特定配置(如硬件依赖的编译选项)。 - 执行 `firmware image` 目标,这可能包括编译源代码、链接对象文件、生成二进制固件(如 `.img` 文件),并可能涉及打包步骤(参考引用[^2]中的 `package-file` 修改)。 - `V=s` 会输出详细的构建日志,包括每个执行的命令和中间结果,有助于调试(类似引用[^1]中的驱动加载命令的输出)。 - **典型上下文**:这种命令常见于嵌入式 Linux 开发,如构建 Rockchip 平台(RK3399RK3588)的固件(引用[^2][^3] 涉及 RK3399 和日志输出)。固件映像可能包括 bootloader、内核和文件系统组件。 #### 3. **基于引用的潜在上下文与注意事项** - **硬件平台关联**:引用[^2] 提到 RK3399-ROC-PC-PRO 的打包过程(修改 `package-file` 以移除 trust 分区),暗示 `be68v1_1` 可能类似 Rockchip 设备。PID 的设置有助于区分不同硬件变体[^2]。 - **构建流程细节**:固件构建通常涉及多个步骤: - 编译驱动或内核模块(如引用[^1]中的 `ch343.ko`)。 - 打包映像(如引用[^2]中的文件修改),其中 `image` 目标可能触发生成最终固件文件。 - `V=s` 的详细输出可帮助识别失败点,例如编译错误或依赖缺失。 - **常见问题与建议**: - **构建失败排查**:如果命令执行失败,检查 `V=s` 的输出日志: - 搜索错误信息(如 `error:` 或 `failed`)。 - 确保依赖项(如工具链、库)已安装(参考引用[^1]中的 `sudo make install` 用于永久安装驱动)。 - 验证 Makefile 中 `firmware image` 目标的定义是否完整。 - **性能优化**:在资源受限的设备上(如嵌入式系统),构建可能耗时。考虑减少不必要的步骤或并行编译(例如,添加 `-j N` 参数,其中 N 是 CPU 核心数)。 - **安全考虑**:引用[^2] 中移除了 trust 分区(安全相关),如果 `be68v1_1` 涉及安全固件,需评估类似修改的影响。 - **调试工具**:结合系统日志(如引用[^3]中的 `vcc3v3_lcd_edp disabling`)分析硬件兼容性问题。 #### 4. **建议操作步骤** 如果您需要运行或调试此命令: 1. **准备环境**:确保开发环境已设置,包括编译器(如 GCC)、Make 工具和硬件 SDK(例如 Rockchip 的构建工具)。 2. **执行命令**: ```bash make PID=be68v1_1 firmware image V=s ``` 观察输出:如果 `V=s` 显示所有命令细节,可用于跟踪问题。 3. **分析输出**: - 成功时:通常会生成固件文件(如 `firmware.img` 或类似)。 - 失败时:检查输出中的错误行,并参考 Makefile 调整变量或依赖。 4. **结合引用内容**:如果涉及驱动加载(引用[^1]),构建后可能需要类似 `make load` 的步骤来测试固件。 此命令分析基于标准嵌入式开发实践和引用内容。如果提供更多细节(如 Makefile 内容或错误日志),可进一步精准定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值