完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。
针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。 1.实验原理 DSI(Display Serial Interface),是有MIPI联盟定义的一组通信协议的一部分,MIPI DSI主机控制器是一个数字核心,实现MIPI DSI规范中定义的所有协议功能。它提供了系统和MIPI D_PHY中间的接口,允许用户和符合DSI的显示器进行通信。STM32MP157A系列芯片集成MIPI DSI主机控制器。 MIPI®DSI主机包括内部连接到LTDC的专用视频接口以及一个通用的APB接口,可用于向显示器传输信息。 FS-MP1A提供两组LCD显示接口,分别是RGB和MIPI接口,本节介绍如何在Linux中完成MIPI LCD的支持。 上图为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接口管脚对应关系:
Documentation/devicetree/bindings/pwm/pwm-stm32.txt 内核中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 = bias-pull-down; drive-push-pull; slew-rate = <0>; }; }; pwm2_sleep_pins_b: pwm1-sleep-0 { pins { pinmux = }; };
Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt Documentation/devicetree/bindings/leds/backlight/gpio-backlight.txt 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"; };
Documentation/devicetree/bindings/display/st,stm32-ltdc.txt 由于前面章节已经对LTDC做了讲解,并且已经增加了LTDC的设备节点,本节只需在原有基础上增加DSI对应的数据通道即可。 status = "okay"; port { #address-cells = <1>; #size-cells = <0>; ltdc_ep1_out: endpoint@1 { reg = <1>; remote-endpoint = <&dsi_in>; }; }; };
Documentation/devicetree/bindings/display/panel/panel-dsi-cm.txt 结合参考文档及内核中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>; }; }; };
Documentation/devicetree/bindings/display/mipi-dsi-bus.txt 内核中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 = < }; }; 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.实验步骤
将【华清远见-FS-MP1A开发资料 2-程序源码 4-Linux系统移植 4-移植相关文件 2-Linux内核移植st7701驱动】下的panel-sitronix-st7701.c复制到内核源码下的drivers/gpu/drm/panel/目录下。 linux@ubuntu $> cp panel-sitronix-st7701.c drivers/gpu/drm/panel/
&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 = bias-pull-down; drive-push-pull; slew-rate = <0>; }; }; pwm2_sleep_pins_b: pwm1-sleep-0 { pins { pinmux = }; }; };
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"; };
在内核的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
status = "okay"; port { #address-cells = <1>; #size-cells = <0>; ltdc_ep1_out: endpoint@1 { reg = <1>; remote-endpoint = <&dsi_in>; }; }; };
&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 = < }; }; 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>; }; }; }; };
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
LABEL stm32mp157a-fsmp1a-mipi KERNEL /uImage FDT /stm32mp157a-fsmp1a-mipi050.dtb APPEND root=/dev/mmcblk1p4 rootwait rw console=ttySTM0,115200
|
|||
|
|||
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:09 , Processed in 1.235503 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号