你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:13
1.实验原理
DSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。

MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。

edc326cbe2a595fc4b1166c428f390cf.png

FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。

bb2cebf753fade0b3a712cbdab54f2c3.png

上图为MIPI LCD的接口,接口信号线分为两组,分别是由DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN、DSI_TE、DSI_RST、LCD_PWM组成的LCD接口和由I2C2_SCL、I2C2_SDA、TP_RST、TP_IRQ组成的触摸屏接口,本节介绍LCD的支持。

DSI_D0P、DSI_D0N、DSI_D1P、DSI_D1N、DSI_CKP、DSI_CKN是DSI-MIPI的信号线,DSI_TE未使用,DSI_RST是LCD屏复位信号LCD_PWM是背光控制信号。

MIPI LCD接口管脚对应关系:

69260c05eeb6ed21b9271b6430afe809.png

989321323dbac9ca83311c4b7d45e11c.png

e6cbe903854fd66e44880f300d4a184b.png

43e8dd79ca02794994127213f61ac3db.png
%2IAQZU(INJWMPJ__5)R@(N.png

1.PWM设备节点

内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:

arch/arm/boot/dts/stm32mp151.dtsi

stm32mp151中timers2定义如下:

timers2: timer@40000000 {

#address-cells = <1>;

#size-cells = <0>;

compatible = "st,stm32-timers";

reg = <0x40000000 0x400>;

clocks = <&rcc TIM2_K>;

clock-names = "int";

dmas = <&dmamux1 18 0x400 0x80000001>,

<&dmamux1 19 0x400 0x80000001>,

<&dmamux1 20 0x400 0x80000001>,

<&dmamux1 21 0x400 0x80000001>,

<&dmamux1 22 0x400 0x80000001>;

dma-names = "ch1", "ch2", "ch3", "ch4", "up";

status = "disabled";

pwm {

compatible = "st,stm32-pwm";

#pwm-cells = <3>;

status = "disabled";

};

timer@1 {

compatible = "st,stm32h7-timer-trigger";

reg = <1>;

status = "disabled";

};

counter {

compatible = "st,stm32-timer-counter";

status = "disabled";

};

};

上述代码只对timers5做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。

参考文档或stm32mp15xx-dkx.dtsi对于i2c设备节点的描述,增加timers内容如下:

&timers2 {

/* spare dmas for other usage */

/delete-property/dmas;

/delete-property/dma-names;

status = "okay";

pwm2: pwm {

pinctrl-0 = <&pwm2_pins_b>;

pinctrl-1 = <&pwm2_sleep_pins_b>;

pinctrl-names = "default", "sleep";

#pwm-cells = <2>;

status = "okay";

};

timer@2 {

status = "disabled";

};

};

stm32mp15-pinctrl.dtsi对于pwm2的描述与FS-MP1A所使用管脚不一致,所以无法直接使用,需参考其增加如下内容:

pwm2_pins_b: pwm2-0 {

pins {

pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */

bias-pull-down;

drive-push-pull;

slew-rate = <0>;

};

};

pwm2_sleep_pins_b: pwm1-sleep-0 {

pins {

pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */

};

};

2.背光设备节点

FS-MP1A背光可以通过GPIO驱动也可通过PWM2的通道1驱动,可以对比参考文档或内核中其他设备树关于背光的定义。

GPIO驱动背光节点内容如下:

panel_backlight: panel-backlight {

compatible = "gpio-backlight";

gpios = <&gpiod 13 GPIO_ACTIVE_LOW>;

default-on;

status = "okay";

};

PWM驱动背光节点内容如下:

panel_backlight: panel-backlight {

compatible = "pwm-backlight";

pwms = <&pwm2 0 5000000>;

brightness-levels = <0 4 8 16 32 64 128 255>;

default-brightness-level = <6>;

status = "okay";

};

3.LTDC设备节点

由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。

<dc {

status = "okay";

port {

#address-cells = <1>;

#size-cells = <0>;

ltdc_ep1_out: endpoint@1 {

reg = <1>;

remote-endpoint = <&dsi_in>;

};

};

};

4.Panel设备树节点

结合参考文档及内核中STM32MP157其他设备树文件,Panel设备树节点为:

panel: panel@0 {

compatible = "sitronix,st7701";

reg = <0>;

reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;

power-supply = <&v3v3>;

status = "okay";

port {

panel_in: endpoint {

remote-endpoint = <&dsi_out>;

};

};

};

5.DSI设备树节点

内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:

arch/arm/boot/dts/stm32mp157.dtsi

stm32mp157中dsi定义如下:

dsi: dsi@5a000000 {

compatible = "st,stm32-dsi";

reg = <0x5a000000 0x800>;

phy-dsi-supply = <®18>;

clocks = <&rcc DSI_K>, <&scmi0_clk CK_SCMI0_HSE>, <&rcc DSI_PX>;

clock-names = "pclk", "ref", "px_clk";

resets = <&rcc DSI_R>;

reset-names = "apb";

status = "disabled";

};

上述代码只对dsi做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。补齐后内容如下:

&dsi {

#address-cells = <1>;

#size-cells = <0>;

status = "okay";

ports {

#address-cells = <1>;

#size-cells = <0>;

port@0 {

reg = <0>;

dsi_in: endpoint {

remote-endpoint = <<dc_ep1_out>;

};

};

port@1 {

reg = <1>;

dsi_out: endpoint {

remote-endpoint = <&dsi_panel_in>;

};

};

};

panel_dsi: panel-dsi@0 {

compatible = "sitronix,st7701";

reg = <0>;

reset-gpios = <&gpiog 9 GPIO_ACTIVE_LOW>;

backlight = <&panel_backlight>;

power-supply = <&v3v3>;

status = "okay";

port {

dsi_panel_in: endpoint {

remote-endpoint = <&dsi_out>;

};

};

};

};

2.实验目的
熟悉基于Linux操作系统下的MIPI-LCD设备驱动移植配置过程。

3.实验平台
华清远见开发环境,FS-MP1A平台;

4.实验步骤
1.导入交叉编译工具链
linux@ubuntu source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

2.添加MIPI-LCD驱动
FS-MP1A配套MIPI屏幕主控芯片是st7701,内核中并没有提供其的驱动,所以需要移植st7701的驱动

将下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。

linux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/

3.添加pwm2内容
修改stm32mp15xx-fsmp1x.dtsi,在stm32mp15xx-fsmp1x.dtsi文件末尾添加如下内容:

&timers2 {

/* spare dmas for other usage */

/delete-property/dmas;

/delete-property/dma-names;

status = "okay";

pwm2: pwm {

pinctrl-0 = <&pwm2_pins_b>;

pinctrl-1 = <&pwm2_sleep_pins_b>;

pinctrl-names = "default", "sleep";

#pwm-cells = <2>;

status = "okay";

};

timer@2 {

status = "disabled";

};

};

&pinctrl {

pwm2_pins_b: pwm2-0 {

pins {

pinmux = <STM32_PINMUX('A', 5, AF1)>; /* TIM2_CH1 */

bias-pull-down;

drive-push-pull;

slew-rate = <0>;

};

};

pwm2_sleep_pins_b: pwm1-sleep-0 {

pins {

pinmux = <STM32_PINMUX('A', 5, ANALOG)>; /* TIM2_CH1 */

};

};

};

4.添加背光内容
修改stm32mp15xx-fsmp1x.dtsi,在根节点中添加如下内容:

panel_backlight: panel-backlight {

compatible = "pwm-backlight";

pwms = <&pwm2 0 5000000>;

brightness-levels = <0 4 8 16 32 64 128 255>;

default-brightness-level = <6>;

status = "okay";

};

5.增加设备树文件
由于MIPI LCD并非FS-MP1A必须配置,本节增加一个设备树文件,对应增加了屏幕的设备。

在内核的arch/arm/boot/dts目录下新建文件stm32mp157a-fsmp1a-mipi050.dts文件并添加如下内容:

#include "stm32mp157a-fsmp1a.dts"

/ {

model = "HQYJ STM32MP157 FSMP1A MIPI Discovery Board";

compatible = "st,stm32mp157a-dk1", "st,stm32mp157";

};

由于增加了新的设备树文件需修改arch/arm/boot/dts/Makefile,在文件中增加新的条目,红色字体部分为增加内容

dtb-$(CONFIG_ARCH_STM32) += \

…..

stm32mp157a-dk1.dtb \

stm32mp157a-fsmp1a.dtb \

stm32mp157a-fsmp1a-mipi050.dtb \

stm32mp157d-dk1.dtb \

6.添加ltdc内容
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:

<dc {

status = "okay";

port {

#address-cells = <1>;

#size-cells = <0>;

ltdc_ep1_out: endpoint@1 {

reg = <1>;

remote-endpoint = <&dsi_in>;

};

};

};

7.添加dts内容
修改stm32mp157a-fsmp1a-mipi050.dts,在文件末尾添加如下内容:

&dsi {

#address-cells = <1>;

#size-cells = <0>;

status = "okay";

ports {

#address-cells = <1>;

#size-cells = <0>;

port@0 {

reg = <0>;

dsi_in: endpoint {

remote-endpoint = <<dc_ep1_out>;

};

};

port@1 {

reg = <1>;

dsi_out: endpoint {

remote-endpoint = <&dsi_panel_in>;

};

};

};

panel_dsi: panel-dsi@0 {

compatible = "sitronix,st7701";

reg = <0>;

reset-gpios = <&gpiog 9 GPIO_ACTIVE_HIGH>;

power-supply = <&v3v3>;

status = "okay";

port {

dsi_panel_in: endpoint {

remote-endpoint = <&dsi_out>;

};

};

};

};

8.配置内核
配置内核支持st7701,并列出主要选项,如下:

linux@ubuntu make menuconfig

Device Drivers --->

Graphics support --->

<*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->

<*> DRM Support for STMicroelectronics SoC Series

<*> STMicroelectronics specific extensions for Synopsys MIPI DSI

Display Panels --->

<*> Sitronix ST7701 panel driver

Backlight & LCD device support --->

<*> Generic PWM based Backlight Driver

<*> Generic GPIO based Backlight Driver

9.增加启动项
在虚拟机/tftpboot /tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17末尾添加

LABEL stm32mp157a-fsmp1a-mipi
KERNEL /uImage
FDT /stm32mp157a-fsmp1a-mipi050.dtb
APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200

10.编译内核及设备树
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040

重启测试
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,设备连接HDMI显示器,重启设备后查看/sys/class/drm会多出HMID的信息,同时显示器会有显示。
————————————————
版权声明:华清远见IT开放实验室


收藏 1 评论0 发布时间:2022-9-30 18:13

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版