Linux第99步_Linux之点亮LCD

主要学习如何在Linux开发板点亮屏,以及modetest命令的实现。

很多人踩坑,我也是一样。关键是踩坑后还是实现不了,这样的人确实很多,从群里可以知道。也许其他人没有遇到这个问题,我想是他运气好。

1、修改设备树

1)、打开"stm32mp15-pinctrl.dtsi",找到"ltdc_pins_b"节点和"ltdc_pins_sleep_b"节点,如下:

ltdc_pins_b: ltdc-b-0 {

pins {

pinmux = <STM32_PINMUX('I', 14, AF14)>, /* LCD_CLK */

<STM32_PINMUX('I', 12, AF14)>, /* LCD_HSYNC */

<STM32_PINMUX('I', 13, AF14)>, /* LCD_VSYNC */

<STM32_PINMUX('K', 7, AF14)>, /* LCD_DE */

<STM32_PINMUX('I', 15, AF14)>, /* LCD_R0 */

<STM32_PINMUX('J', 0, AF14)>, /* LCD_R1 */

<STM32_PINMUX('J', 1, AF14)>, /* LCD_R2 */

<STM32_PINMUX('J', 2, AF14)>, /* LCD_R3 */

<STM32_PINMUX('J', 3, AF14)>, /* LCD_R4 */

<STM32_PINMUX('J', 4, AF14)>, /* LCD_R5 */

<STM32_PINMUX('J', 5, AF14)>, /* LCD_R6 */

<STM32_PINMUX('J', 6, AF14)>, /* LCD_R7 */

<STM32_PINMUX('J', 7, AF14)>, /* LCD_G0 */

<STM32_PINMUX('J', 8, AF14)>, /* LCD_G1 */

<STM32_PINMUX('J', 9, AF14)>, /* LCD_G2 */

<STM32_PINMUX('J', 10, AF14)>, /* LCD_G3 */

<STM32_PINMUX('J', 11, AF14)>, /* LCD_G4 */

<STM32_PINMUX('K', 0, AF14)>, /* LCD_G5 */

<STM32_PINMUX('K', 1, AF14)>, /* LCD_G6 */

<STM32_PINMUX('K', 2, AF14)>, /* LCD_G7 */

<STM32_PINMUX('J', 12, AF14)>, /* LCD_B0 */

<STM32_PINMUX('J', 13, AF14)>, /* LCD_B1 */

<STM32_PINMUX('J', 14, AF14)>, /* LCD_B2 */

<STM32_PINMUX('J', 15, AF14)>, /* LCD_B3 */

<STM32_PINMUX('K', 3, AF14)>, /* LCD_B4 */

<STM32_PINMUX('K', 4, AF14)>, /* LCD_B5 */

<STM32_PINMUX('K', 5, AF14)>, /* LCD_B6 */

<STM32_PINMUX('K', 6, AF14)>; /* LCD_B7 */

bias-disable;/*禁止使用内部偏置电压*/

drive-push-pull;/*设置引脚为推挽输出*/

slew-rate = <1>;/*设置引脚的速度为1档,0最慢,3 最高*/

};

ltdc_pins_sleep_b: ltdc-b-1 {/*在sleep模式下RGB LCD的pinmux配置*/

pins {

pinmux = <STM32_PINMUX('I', 14, ANALOG)>, /* LCD_CLK */

<STM32_PINMUX('I', 12, ANALOG)>, /* LCD_HSYNC */

<STM32_PINMUX('I', 13, ANALOG)>, /* LCD_VSYNC */

<STM32_PINMUX('K', 7, ANALOG)>, /* LCD_DE */

<STM32_PINMUX('I', 15, ANALOG)>, /* LCD_R0 */

<STM32_PINMUX('J', 0, ANALOG)>, /* LCD_R1 */

<STM32_PINMUX('J', 1, ANALOG)>, /* LCD_R2 */

<STM32_PINMUX('J', 2, ANALOG)>, /* LCD_R3 */

<STM32_PINMUX('J', 3, ANALOG)>, /* LCD_R4 */

<STM32_PINMUX('J', 4, ANALOG)>, /* LCD_R5 */

<STM32_PINMUX('J', 5, ANALOG)>, /* LCD_R6 */

<STM32_PINMUX('J', 6, ANALOG)>, /* LCD_R7 */

<STM32_PINMUX('J', 7, ANALOG)>, /* LCD_G0 */

<STM32_PINMUX('J', 8, ANALOG)>, /* LCD_G1 */

<STM32_PINMUX('J', 9, ANALOG)>, /* LCD_G2 */

<STM32_PINMUX('J', 10, ANALOG)>, /* LCD_G3 */

<STM32_PINMUX('J', 11, ANALOG)>, /* LCD_G4 */

<STM32_PINMUX('K', 0, ANALOG)>, /* LCD_G5 */

<STM32_PINMUX('K', 1, ANALOG)>, /* LCD_G6 */

<STM32_PINMUX('K', 2, ANALOG)>, /* LCD_G7 */

<STM32_PINMUX('J', 12, ANALOG)>, /* LCD_B0 */

<STM32_PINMUX('J', 13, ANALOG)>, /* LCD_B1 */

<STM32_PINMUX('J', 14, ANALOG)>, /* LCD_B2 */

<STM32_PINMUX('J', 15, ANALOG)>, /* LCD_B3 */

<STM32_PINMUX('K', 3, ANALOG)>, /* LCD_B4 */

<STM32_PINMUX('K', 4, ANALOG)>, /* LCD_B5 */

<STM32_PINMUX('K', 5, ANALOG)>, /* LCD_B6 */

<STM32_PINMUX('K', 6, ANALOG)>; /* LCD_B7 */

};

上面的连接和原理图一致,不用修改。

2)、检查是否有被使用的引脚:

PI12被hdp0_pins_a节点占用,要屏蔽,见下图:

3)、打开"stm32mp157d-atk.dts",添加内容如下(注意:不是在根节点"/"下添加):

ltdc {

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

pinctrl-0 = <<dc_pins_b>;/*pinctrl-0为default模式*/

pinctrl-1 = <<dc_pins_sleep_b>;/*pinctrl-1为sleep模式*/

/*设置了两个pinmux模式:pinctrl-0为default模式,pinctrl-1为sleep模式,

系统默认使用default模式。*/

status = "okay";

port {

#address-cells = <1>;

#size-cells = <0>;

ltdc_ep0_out: endpoint@0 {/*ltdc_ep0_out为port的子节点*/

reg = <0>;

remote-endpoint = <&rgb_panel_in>;

/*remote-endpoint属性告诉ltdc节点输出到rgb_panel_in接口*/

};

};

};

4)、在stm32mp157d-atk.dts文件的根节点"/"下,添加"输出接口"如下所示内容:

panel_rgb: panel-rgb {

compatible = "zgq,lcd-rgb";

/*在 panel-simple.c 文件里的platform_of_match数组增加一个

of_device_id结构体,此结构体的compatible成员属性值为"zgq,lcd-rgb"。*/

backlight = <&backlight>;/*此属性值为引用背光节点*/

status = "okay";

port {

rgb_panel_in: endpoint {

remote-endpoint = <<dc_ep0_out>;

/*要从ltdc节点里获取显示数据*/

};

};

};

2、修改"panel-simple.c"程序

1)、打开"panel-simple.c",修改platform_of_match[]数组,添加内容如下:

{

.compatible = "zgq,lcd-rgb",

.data = &zgq_desc,

}

2)、在"panel-simple.c"中添加"zgq_desc"参数。

我用的是ATK4384,4.3寸800*480分辨率,参数如下:

/* LCD屏ATK4384的时序参数信息需要向厂家要:4.3寸800*480分辨率 */

static const struct drm_display_mode ATK4384_mode = {

.clock = 31000, /* LCD像素时钟,单位KHz */

.hdisplay = 800, /* LCD X轴像素个数 */

.hsync_start = 800 + 88, /* LCD X轴+hbp的像素个数 */

.hsync_end = 800 + 88 + 48, /* LCD X轴+hbp+hspw的像素个数 */

.htotal = 800 + 88 + 48 + 40,/* LCD X轴+hbp+hspw+hfp */

.vdisplay = 480, /* LCD Y轴像素个数 */

.vsync_start = 480 + 32, /* LCD Y轴+vbp的像素个数 */

.vsync_end = 480 + 32 + 3, /* LCD Y轴+vbp+vspw的像素个数 */

.vtotal = 480 + 32 + 3 + 13,/* LCD Y轴+vbp+vspw+vfp */

.vrefresh = 60, /* LCD的刷新频率为60HZ */

};

static const struct panel_desc zgq_desc = {

.modes = &ATK4384_mode,

.num_modes = 1,

.bus_format = MEDIA_BUS_FMT_RGB888_1X24,

};

3、再次修改设备树头文件,在"stm32mp15-pinctrl.dtsi"中添加"背光节点"

1)、打开"stm32mp15-pinctrl.dtsi",找到"pwm4_pins_b",内容如下:

pwm4_pins_b: pwm4-1 {

pins {

pinmux = <STM32_PINMUX('D', 13, AF2)>; /* TIM4_CH2 */

bias-pull-down;

drive-push-pull;

slew-rate = <0>;

};

};

pwm4_sleep_pins_b: pwm4-sleep-1 {

pins {

pinmux = <STM32_PINMUX('D', 13, ANALOG)>; /* TIM4_CH2 */

};

};

2)、在"stm32mp157d-atk.dts"文件里,添加"&timers4"如下所示内容:

&timers4 {

status = "okay";

/* spare dmas for other usage */

/delete-property/dmas;/*设置此节点不使用DMA*/

/delete-property/dma-names;/*设置此节点不使用DMA*/

pwm4: pwm {/*pwm4是我们为pwm设置的一个别名。*/

pinctrl-0 = <&pwm4_pins_b>;/*设置PWM所使用的IO配置*/

pinctrl-1 = <&pwm4_sleep_pins_b>;/*设置PWM所使用的IO配置*/

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

#pwm-cells = <2>;

status = "okay";

};

};

3)、修改设备树文件,在stm32mp157d-atk.dts文件里,在根节点里,添加"backlight"节点:

backlight: backlight {

compatible = "pwm-backlight";

pwms = <&pwm4 1 5000000>;

/*设置背光使用pwm4的第2个通道,PWM频率为1000000000/5000000=200Hz*/

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

/*设置背 8 级背光(0~7),分别为 0、4、8、16、32、64、128、255,

对应占空比为 0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%*/

power-supply = <&v3v3>;

default-brightness-level = <7>;

/*设置默认背光等级为7,也就是100%的亮度*/

status = "okay";

};

4)、修改"pwm_bl.c"文件

因为背光的驱动代码有点bug,如果设置0级,屏不会灭屏,打开pwm_bl.c文件,将下面的代码修改一下:

if (brightness > 0) {

pwm_get_state(pb->pwm, &state);

state.duty_cycle = compute_duty_cycle(pb, brightness);

pwm_apply_state(pb->pwm, &state);

pwm_backlight_power_on(pb);

}

改成如下:

if (brightness >= 0) {

pwm_get_state(pb->pwm, &state);

state.duty_cycle = compute_duty_cycle(pb, brightness);

pwm_apply_state(pb->pwm, &state);

pwm_backlight_power_on(pb);

}

见下图:

4、配置"Linux内核"

1)、打开终端。

2)、输入"cd linux/atk-mp1/linux/my_linux/linux-5.4.31/回车",切换到"linux/atk-mp1/linux/my_linux/linux-5.4.31/"目录;

3)、输入"make menuconfig回车",打开linux内核图形化配置界面:

4)、移动"向下光标键"至"Device Drivers",见下图:

5)、按下"回车键",移动"向下光标键"至"Graphics support",见下图:

6)、按下"回车键",移动"向下光标键"至"Direct Rendering Manager (XFree86 4.1.0 and higher DRI suppor",按"Y键",见下图:

7)、移动"向下光标键"至"DRM Support for Samsung SoC EXYNOS Series",按"Y键",见下图:

8)、先"保存",按"TAB键"至"Save",按下"回车键",得到下面的界面。

9)、输入"./arch/arm/configs/stm32mp1_atk_defconfig",移动"向下光标键"至"Ok",得到下图:

10)、按"回车键",保存完成。得到下面的界面。

11)、按"回车键",退出保存界面。

12)、移动"向下光标键"至"Display Panels",见下图:

13)、按"回车键",移动"向下光标键"至"support for simple panels",按"Y键",见下图:

14)、按一下"TAB键"至"Exit"。注意:最好也保存一下,防止配置软件有bug。见下图:

15)、按"回车键",移动"向下光标键"至"Backlight & LCD device support",见下图:

16)、按"回车键",移动"向下光标键"至"Generic PWM based Backlight Driver",按下"Y键",见下图:

17)、按"TAB键"至"Save",按下"回车",得到下面的界面。

18)、输入"./arch/arm/configs/stm32mp1_atk_defconfig",移动"向下光标键"至"Ok",得到下图:

19)、按"回车",保存完成。得到下面的界面。

20)、按"回车键",退出。

21)、按8次"ESC键",得到下图:

22)、输入"make stm32mp1_atk_defconfig回车"。

注意:图形化配置完后,要在终端输入"make stm32mp1_atk_defconfig回车",更新".config"这个文件,才叫图形化配置完成,因为参与编译的文件是".config"这个文件。我编译成功,完全是巧合。

5、编译设备树

①在VSCode终端,输入"make uImage dtbs LOADADDR=0XC2000040 -j8回车",执行编译"Image"和"dtbs",并指定装载的起始地址为0XC2000040,j8表示指定采用8线程执行。"make dtbs",用来指定编译设备树。

②输入"ls arch/arm/boot/uImage -l"

查看是否生成了新的"uImage"文件

③输入"ls arch/arm/boot/dts/stm32mp157d-atk.dtb -l"

查看是否生成了新的"stm32mp157d-atk.dtb"文件

4)、拷贝输出的文件:

①输入"cp arch/arm/boot/uImage /home/zgq/linux/atk-mp1/linux/bootfs/ -f回车",执行文件拷贝,准备烧录到EMMC;

②输入"cp arch/arm/boot/dts/stm32mp157d-atk.dtb /home/zgq/linux/atk-mp1/linux/bootfs/ -f回车",执行文件拷贝,准备烧录到EMMC

③输入"cp arch/arm/boot/uImage /home/zgq/linux/tftpboot/ -f回车",执行文件拷贝,准备从tftp下载;

④输入"cp arch/arm/boot/dts/stm32mp157d-atk.dtb /home/zgq/linux/tftpboot/ -f回车",执行文件拷贝,准备从tftp下载;

⑤输入"ls -l /home/zgq/linux/atk-mp1/linux/bootfs/回车",查看"/home/zgq/linux/atk-mp1/linux/bootfs/"目录下的所有文件和文件夹

⑥输入"ls -l /home/zgq/linux/tftpboot/回车",查看"/home/zgq/linux/tftpboot/"目录下的所有文件和文件夹

⑦输入"chmod 777 /home/zgq/linux/tftpboot/stm32mp157d-atk.dtb回车"

给"stm32mp157d-atk.dtb"文件赋予可执行权限

⑧输入"chmod 777 /home/zgq/linux/tftpboot/uImage回车" ,给"uImage"文件赋予可执行权限

⑨输入"ls /home/zgq/linux/tftpboot/ -l回车",查看"/home/zgq/linux/tftpboot/"目录下的所有文件和文件夹

6、文件系统使能libdrm库

如果没有libdrm库,是不能调用drm驱动的,所以我们要在文件系统中使能libdrm库。

1)、输入"cd /home/zgq/linux/buildroot/buildroot-2020.02.6回车"

2)、输入"make menuconfig回车",打开"buildroot的图形化配置界面"

3)、移动"向下光标键"至"Target packages",见下图:

4)、按"回车键",移动"向下光标键"至"Libraries",见下图:

5)、按"回车键",移动"向下光标键"至"Graphics",见下图:

6)、按"回车键",移动"向下光标键"至"libdrm",按下"Y键",见下图:

7)、按"TAB键",移动"向右光标键"至"Save",按"回车键"。

注意:这里必须要先保存,否则一次性保存会失败,我试过了,不要踩坑。

8)、将"/zgq/linux/buildroot/buildroot-2020.02.6/.config"修改为

"./configs/stm32mp1_atk_defconfig",见下图:

9)、移动"向下光标键"至"Ok",按"回车键";按"ESC"

10)、按下"回车键",移动"向下光标键"至"Install test programs",按下"Y键",见下图:

11)、按"TAB键",移动光标至"Save",按"回车键"

12)、将"/zgq/linux/buildroot/buildroot-2020.02.6/.config"修改为

"./configs/stm32mp1_atk_defconfig",见下图:

13)、移动"向下光标键"至"Ok",按"回车键"完成保存;

这里,我们将配置项命名为"stm32mp1_atk_defconfig",以后要重新配置buildroot的话,就可以直接输入"make stm32mp1_atk_defconfig回车"。

15)、按"ESC键"退出,直到出现下图:

16)、输入"make stm32mp1_atk_defconfig回车"

注意:图形化配置完后,要在终端输入"make stm32mp1_atk_defconfig回车",更新".config"这个文件,才叫图形化配置完成,因为参与编译的文件是".config"这个文件。我编译成功,完全是巧合。可以这么理解"stm32mp1_atk_defconfig"好比是缓存,而".config"才是我们要修改的文件。

7、编译"buildroot"

1)、在"/home/zgq/linux/buildroot/buildroot-2020.02.6"目录,

输入"make -j8",编译"buildroot",-j8表示采用8线程编译

2)、等待下载"host-python3 3.8.5"见下图:

3)、等待下载"host-python3-setuptools 41.4.0"

4)、查看编译结果:

输入"cd output/"切换到"output"目录

输入"ls",查看"output"目录下的所有文件和文件夹

输入"cd images/"切换到"images"目录

输入"ls",查看"images"目录下的所有文件和文件夹

5)、打开第2个终端

输入"cd linux/nfs/rootfs",切换到"linux/nfs/rootfs"目录

输入"ls回车"

输入"sudo rm * -rf回车",删除"rootfs"目录下所有的文件和文件夹,前面已经做了备份

输入"ls回车"

输入"cd ..回车",返回到"nfs"目录

输入"ls回车"

6)、回到第1个打开的终端

输入"cp rootfs.tar /home/zgq/linux/nfs/rootfs回车"

将"/home/zgq/linux/buildroot/buildroot-2020.02.6/output/images"目录下的"rootfs.tar"拷贝到"/home/zgq/linux/nfs/rootfs"目录中

7)、回到第2个打开的终端

输入"cd rootfs/回车"

输入"ls回车"

输入"sudo tar -axvf rootfs.tar",解压

8)、输入"ls回车"

输入"rm rootfs.tar回车",删除压缩包

输入"ls回车"

得到buildroot生成的根文件系统。

8、使用****"buildroot"构建根文件系统****

1)、给开发板上电。

输入"root回车"

输入密码"123456回车"

输入"cd /",切换到根目录

输入"ls",可以执行了

2)、输入"reboot回车"

输入"root回车"

输入"depmod回车",报告"depmod: can't change directory to 'lib/modules/5.4.31': No such file or directory"

输入"mkdir /lib/modules/5.4.31 -p回车"

输入"depmod回车"

输入"cd /lib/modules/5.4.31回车"

输入"ls回车"

9、使用vsftpd搭建FTP服务器

1)、输入"vi /etc/vsftpd.conf回车"

按"ESC键",输入"/local_enable=回车",搜索字符串"local_enable="

,先按下"A",然后移动光标至"#local_enable=YES",删除"#",修改为"local_enable=YES"

按"ESC键",输入"/write_enable=回车",搜索字符串"write_enable="

,先按下"A",然后移动光标至"#write_enable=YES",删除"#",修改为"write_enable=YES"

2)、按"ESC键",输入":wq回车",保存退出。

10、测试:使用SSH服务通过网络远程登录开发板

1)、输入"ls /etc/vsftpd.conf -l回车"

报告"-rw-r--r-- 1 sshd sshd 4591 Feb 17 2024 /etc/vsftpd.conf",表示该文件所属用户为"sshd";

输入"chown root:root /etc/vsftpd.conf回车",将/etc/vsftpd.conf修改为"root"用户。

输入"ls /etc/vsftpd.conf -l回车"

报告"-rw-r--r-- 1 root root 4591 Feb 17 2024 /etc/vsftpd.conf",表示该文件所属用户为"root";

2)、输入"adduser Zhanggong回车",使用adduser命令创建开发板用户名为Zhanggong

输入密码"123456"

输入密码"123456"

输入"cd /home/回车"

输入"ls回车"

3)、打开"FileZilla"

4)、点击"文件",再点击"站点管理器"

5)、点击"新站点",修改为"MP157开发板"

6)、等待开发板启动完成,输入"root回车",输入"ifconfig回车",查询卡发板的IP地址

7)、设置开发板的IP地址,用户名和密码

8)、在串口终端输入"reboot",重启开发板。

9)、等待开发板启动完成,再点击"连接"

10、在串口终端输入"root回车",输入"ps回车"

11)、输入"chown root:root /var/empty回车",将"/var/empty"修改为"root"用户。

输入"reboot回车",重启开发板

12)、等待开发板启动完成后,在串口终端输入"root回车",输入"ps回车"

13)、点击"sesson",点击"SSH",然后按照下图设置开发板:

14)、输入密码"123456"

输入"cd /回车",切换至根目录

输入"ls回车"

至此,我们完成了SSH测试。

11、创建"自启动文件"

1)、输入"cd /etc/init.d/",切换到"init.d"目录

输入"ls"

输入"touch Sautorun",创建Sautorun文件

输入"ls"

输入"chmod 777 Sautorun",给"Sautorun"赋可执行权限

输入"ls"

2)、输入"vi Sautorun回车"

先按"A",然后输入内容:

#!/bin/sh

cd /

按"ESC键",输入":wq回车"

12、设置开发板需要显示路径

1)、输入"vi /etc/profile回车"

按"ESC键",输入":q!回车",不保存退出。

输入"cd /etc/profile.d回车"

输入"ls回车"

输入"touch myprofile.sh",创建脚本文件"myprofile.sh"

输入"ls回车"

输入"chmod 777 myprofile.sh",给myprofile.sh赋可执行权限

输入"ls回车"

输入"vi myprofile.sh",打开myprofile.sh文件

先按"A",再输入内容如下

#!/bin/sh

PS1='[\u@\h]:\w$ ' #\u表示用户名,\h表示主机名,\w表示显示当前工作目录的路径

export PS1

2)、按"ESC键",输入":wq回车",保存退出。

3)、输入"reboot"重启开发板

等待开发板启动完成,输入"root回车"

输入"cd /回车"

输入"ls回车"

输入"cd etc/回车"

可以看到工作路径了。

13、使能"sysfs debug"目录

1)、输入"cd /sys/kernel/debug/"

输入"ls回车"

在"Sautorun"文件中,添加"mount -t debugfs none /sys/kernel/debug"

输入"vi /etc/init.d/Sautorun"

输入内容如下:

#!/bin/sh

mount -t debugfs none /sys/kernel/debug

4)、按"ESC键",输入":wq回车",保存退出。

输入"reboot"重启开发板

6)、等待开饭启动完成,输入"root回车"

输入"ls"

输入"ls /sys/kernel/debug/"

至此,根文件系统测试完成了。

7)、输入"modetest --help回车",发现可以执行"modetest --help"

14、点亮显示屏

1)、输入"modetest --help回车"

2)、输入"modetest -M stm回车"

输入"modetest -M stm回车"

输入"modetest -M stm -s 32@35:800x480回车"

具体显示内容如下:

Welcome to zgq STM32MP157

ATK-stm32mp1 login: root

root@ATK-stm32mp1\]:\~$ modetest --help usage: modetest \[-acDdefMPpsCvw

Query options:

-c list connectors

-e list encoders

-f list framebuffers

-p list CRTCs and planes (pipes)

Test options:

-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>] set a plane

-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>] set a mode

-C test hw cursor

-v test vsynced page flipping

-w <obj_id>:<prop_name>:<value> set property

-a use atomic API

-F pattern1,pattern2 specify fill patterns

Generic options:

-d drop master after mode set

-M module use the given driver

-D device use the given device

Default is to dump all info.

root@ATK-stm32mp1\]:\~$ modetest -M stm Encoders: id crtc type possible crtcs possible clones 31 0 DPI 0x00000001 0x00000000 Connectors: id encoder status name size (mm) modes encoders 32 0 connected DPI-1 105x67 1 31 modes: name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot) 800x480 60 800 888 936 976 480 512 515 528 31000 flags: ; type: preferred, driver props: 1 EDID: flags: immutable blob blobs: value: 2 DPMS: flags: enum enums: On=0 Standby=1 Suspend=2 Off=3 value: 0 5 link-status: flags: enum enums: Good=0 Bad=1 value: 0 6 non-desktop: flags: immutable range values: 0 1 value: 0 4 TILE: flags: immutable blob blobs: value: 20 CRTC_ID: flags: object value: 0 CRTCs: id fb pos size 35 0 (0,0) (0x0) 0 0 0 0 0 0 0 0 0 0 flags: ; type: props: 22 ACTIVE: flags: range values: 0 1 value: 0 23 MODE_ID: flags: blob blobs: value: 19 OUT_FENCE_PTR: flags: range values: 0 18446744073709551615 value: 0 24 VRR_ENABLED: flags: range values: 0 1 value: 0 28 GAMMA_LUT: flags: blob blobs: value: 29 GAMMA_LUT_SIZE: flags: immutable range values: 0 4294967295 value: 256 Planes: id crtc fb CRTC x,y x,y gamma size possible crtcs 33 0 0 0,0 0,0 0 0x00000001 formats: AR24 XR24 RG24 RG16 AR15 XR15 AR12 XR12 C8 props: 8 type: flags: immutable enum enums: Overlay=0 Primary=1 Cursor=2 value: 1 17 FB_ID: flags: object value: 0 18 IN_FENCE_FD: flags: signed range values: -1 2147483647 value: -1 20 CRTC_ID: flags: object value: 0 13 CRTC_X: flags: signed range values: -2147483648 2147483647 value: 0 14 CRTC_Y: flags: signed range values: -2147483648 2147483647 value: 0 15 CRTC_W: flags: range values: 0 2147483647 value: 0 16 CRTC_H: flags: range values: 0 2147483647 value: 0 9 SRC_X: flags: range values: 0 4294967295 value: 0 10 SRC_Y: flags: range values: 0 4294967295 value: 0 11 SRC_W: flags: range values: 0 4294967295 value: 0 12 SRC_H: flags: range values: 0 4294967295 value: 0 30 IN_FORMATS: flags: immutable blob blobs: value: 01000000000000000900000018000000 01000000400000004152323458523234 52473234524731364152313558523135 41523132585231324338202000000000 ff010000000000000000000000000000 0000000000000000 in_formats blob decoded: AR24: LINEAR XR24: LINEAR RG24: LINEAR RG16: LINEAR AR15: LINEAR XR15: LINEAR AR12: LINEAR XR12: LINEAR C8 : LINEAR 36 0 0 0,0 0,0 0 0x00000001 formats: AR24 RG24 RG16 AR15 AR12 C8 props: 8 type: flags: immutable enum enums: Overlay=0 Primary=1 Cursor=2 value: 0 17 FB_ID: flags: object value: 0 18 IN_FENCE_FD: flags: signed range values: -1 2147483647 value: -1 20 CRTC_ID: flags: object value: 0 13 CRTC_X: flags: signed range values: -2147483648 2147483647 value: 0 14 CRTC_Y: flags: signed range values: -2147483648 2147483647 value: 0 15 CRTC_W: flags: range values: 0 2147483647 value: 0 16 CRTC_H: flags: range values: 0 2147483647 value: 0 9 SRC_X: flags: range values: 0 4294967295 value: 0 10 SRC_Y: flags: range values: 0 4294967295 value: 0 11 SRC_W: flags: range values: 0 4294967295 value: 0 12 SRC_H: flags: range values: 0 4294967295 value: 0 30 IN_FORMATS: flags: immutable blob blobs: value: 01000000000000000600000018000000 01000000300000004152323452473234 52473136415231354152313243382020 3f000000000000000000000000000000 0000000000000000 in_formats blob decoded: AR24: LINEAR RG24: LINEAR RG16: LINEAR AR15: LINEAR AR12: LINEAR C8 : LINEAR Frame buffers: id size pitch \[root@ATK-stm32mp1\]:\~$ modetest -M stm -s 32@35:800x480 setting mode 800x480-60Hz@XR24 on connectors 32, crtc 35 ![](https://i-blog.csdnimg.cn/direct/cce1975d5e344f368c2dc64e84ae9d35.png)

相关推荐
虾..3 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙3 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
hkhkhkhkh1235 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen6 小时前
Linux字符串处理
linux·string
张童瑶6 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功1236 小时前
什么是SELinux
linux
石小千6 小时前
Linux安装OpenProject
linux·运维
柏木乃一6 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30906 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
百年渔翁_肯肯7 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix