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
相关文章:
Linux第99步_Linux之点亮LCD
主要学习如何在Linux开发板点亮屏,以及modetest命令的实现。 很多人踩坑,我也是一样。关键是踩坑后还是实现不了,这样的人确实很多,从群里可以知道。也许其他人没有遇到这个问题,我想是他运气好。 1、修改设备树 1)、…...
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(三):基于BT行为树实现复杂敌人BOSS-AI
前言 (题外话)nav2系列教材,yolov11部署,系统迁移教程我会放到年后一起更新,最近年末手头事情多,还请大家多多谅解。回顾我们整个学习历程,我们已经学习了很多C的代码特性,也学习了很多ROS2的跨…...
SpringCloudAlibaba技术栈-Higress
1、什么是Higress? 云原生网关,干啥的?用通俗易懂的话来说,微服务架构下Higress 就像是一个智能的“交通警察”,它站在你的网络世界里,负责指挥和调度所有进出的“车辆”(也就是数据流量)。它的…...
《信息传播:人工智能助力驱散虚假信息阴霾》
在信息爆炸的时代,虚假信息和谣言如同脱缰野马,肆意传播,对社会秩序和公众生活造成了严重影响。人工智能作为一种强大的技术工具,正逐渐成为信息传播的有力助手,为防止虚假信息和谣言扩散提供了新的途径。 虚假信息和…...
玩客云v1.0 刷机时无法识别USB
v1.0刷机时公对公插头掉了,刷机失败,再次刷机,一直提示无法识别的USB设备,此时LED一直不亮,就像是刷成砖了一样,查了好多文章最后发现正面还有一个地方需要短接。 背面的短接点 【免费】玩客云刷机包s805-…...
STM32F103RCT6学习之五:ADC
1.ADC基础 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁12位逐次逼近型ADC,1us转换时间 输入电压范围:0~3.3Vÿ…...
通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤
1、什么是Ceph Ceph是一种开源、分布式存储系统,旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的,使得用户可以在无需特定硬件支持的前提下,通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…...
flink+kafka实现流数据处理学习
在应用系统的建设过程中,通常都会遇到需要实时处理数据的场景,处理实时数据的框架有很多,本文将以一个示例来介绍flinkkafka在流数据处理中的应用。 1、概念介绍 flink:是一个分布式、高可用、高可靠的大数据处理引擎,…...
SpringBoot使用外置的Servlet容器(详细步骤)
嵌入式Servlet容器:应用打成可执行的jar 优点:简单、便携; 缺点:默认不支持JSP、优化定制比较复杂.; 外置的Servlet容器:外面安装Tomcat---应用war包的方式打包; 操作步骤: 方式一&…...
C# 中的委托与事件:实现灵活的回调机制
C#中的委托(Delegate)和事件(Event)。委托和事件是C#中非常重要的特性,它们允许你实现回调机制和发布-订阅模式,从而提高代码的灵活性和解耦程度。通过使用委托和事件,你可以编写更加模块化和可…...
大模型辅助测试的正确打开方式?
测试的基本目的之一,是对被测对象进行质量评估。换言之,是要提供关于被测对象质量的“确定性”。因此,我们很忌讳在测试设计中引入“不确定性”,比如采用不可靠的测试工具、自动化测试代码逻辑复杂易错、测试选择假设过于主观等等…...
设计模式之代理模式
代理模式代码示例:https://blog.csdn.net/weixin_39865508/article/details/141924680 代理模式的左右,一定程度上不暴露被代课对象的内容,更安全,也减少系统的耦合性 静态代理 代理对象和被代理对象都继承同一个接口 在代理对象…...
win11中win加方向键失效的原因
1、可能是你把win键锁了: 解决办法:先按Fn键,再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了,只需要将其打开就好了...
Html——11. 页面跳转
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>页面跳转</title><meta http-equiv"refresh" content"5; urlhttps://www.51zxw.net"/><!--<meta http-equiv"refresh" co…...
要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量
要查询 user 表中 we_chat_open_id 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_open_id IS NOT NULL AND we_chat_open_id ! ;解释: SELECT COUNT(*): 表示要计算符合条件的行数。FROM us…...
docker-compos mysql5.7主从配置
docker-compos mysql5.7主从配置 docker-compose目录结构 配置文件 master/my.cnf [client] port 3306 socket /var/run/mysqld/mysqld.sock[mysqld_safe] pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock nice 0…...
关于无线AP信道调整的优化(锐捷)
目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰,提高网络覆盖范围和信号质量。基本原则包括: 1. 选择合适的信道:根据…...
Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)
文章目录 一、Flask介绍二、Flask创建和运行 1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装 介绍watchdog使用python–dotenv使用(操作环境变量) 七、虚拟环境 介绍Mac/linux创建虚拟…...
解决Docker国内网络问题
6月后以来,大量Docker镜像网站停服,Docker无法下载安装 本仓库致力于解决国内网络原因无法使用Docker的问题。 特点: 使用Github Action将官网的安装脚本/安装包定时下载到本项目Release,供国内使用官方安装包,安全可…...
Anaconda 安装与虚拟环境创建完整指南
Anaconda 安装与虚拟环境创建完整指南 Anaconda 是目前最流行的 Python 和数据科学工具集之一,它不仅可以轻松管理 Python 包,还能提供强大的虚拟环境功能,避免项目之间的依赖冲突。如果你是机器学习、数据科学或计算机视觉的开发者…...
【Java数据结构】LinkedList与链表
认识LinkedList LinkedList就是一个链表,它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来,所以不需要数组。LinkedList也是以泛型的方法实现的,所以使用这个类都需要实例化对象。 链表分为很多种,比…...
Linux 搭建 nginx+keepalived 高可用 | Nginx反向代理
注意:本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用(HA) xyang0917 于 2016-09-17 00:24:15 发布 keepalived 的 HA 分为抢占模式和非抢占模式,抢占…...
17_HTML5 Web 存储 --[HTML5 API 学习之旅]
HTML5 Web 存储(Web Storage)是 HTML5 引入的一种在用户浏览器中存储数据的机制。它提供了比传统的 cookies 更加方便和强大的功能,包括更大的存储空间、更好的性能以及更简单的 API。Web 存储主要分为两种类型:localStorage 和 s…...
uni-app(优医咨询)项目实战 - 第7天
学习目标: 能够基于 WebSocket 完成问诊全流程 能够使用 uniCloud 云存储上传文件 能够完成查看电子处方的功能 能够完成医生评价的功能 一、问诊室 以对话聊天的方式向医生介绍病情并获取诊断方案,聊天的内容支持文字和图片两种形式。 首先新建一…...
今日总结 2024-12-28
今天全身心投入到鸿蒙系统下 TCPSocket 的学习中。从最基础的 TCP 协议三次握手、四次挥手原理重新梳理,深刻理解其可靠连接建立与断开机制,这是后续运用 TCPSocket 无误通信的根基。在深入鸿蒙体系时,仔细研读了其为 TCPSocket 封装的 API&a…...
ip归属地怎么判定?如何查看自己ip属地
在当今数字化时代,IP地址作为互联网通信的基础,扮演着至关重要的角色。而IP归属地的判定与查看,不仅关乎网络安全、隐私保护,还直接影响到社交平台的信任机制与信息传播的真实性。本文将深入探讨IP归属地的判定原理以及如何查看自…...
4.采用锁操作并支持等待功能的线程安全队列
分析 书接上文 修改push()似乎并不困难:在函数末尾加上对data_cond.notify_one()的调用即可,与代码清单1(第一篇文章)一样。事情其实没那么简单,我们之所以采用精细粒度的锁,目的是尽可能提高并发操作的数量。如果在notify_one()调用期间&a…...
螺杆支撑座在运用中会出现哪些问题?
螺杆支撑座是一种用于支撑滚珠螺杆的零件,通常用于机床、数控机床、自动化生产线等高精度机械设备中。在运用中可能会出现多种问题,这些问题源于多个方面,以下是对可能出现的问题简单了解下: 1、安装不当:安装过程中没…...
OSI 七层模型 | TCP/IP 四层模型
注:本文为 “OSI 七层模型 | TCP/IP 四层模型” 相关文章合辑。 未整理去重。 OSI 参考模型(七层模型) BeretSEC 于 2020-04-02 15:54:37 发布 OSI 的概念 七层模型,亦称 OSI(Open System Interconnection…...
秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行
别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! 下篇更新: 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。 默认的类型别名 MyBatis的增删改查 添加 <!--int insertUs…...
快云服务器小助手getdetail存在任意文件文件读取漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
尚硅谷Vue3入门到实战 —— 02 编写 App 组件
根目录下的 index.html 是项目的入口文件,默认的具体内容如下: src 文件夹分析 <!DOCTYPE html> <html lang""><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"&…...
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J实现原理分析
文章目录 官网SLF4J 简单使用案例分析SLF4J 获取 Logger 的原理获取 ILoggerFactory 的过程获取 Logger 的过程SLF4J 与底层日志框架的集成 小结 官网 https://slf4j.org/ Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g…...
Flutter 调试环境下浏览器网络请求跨域问题解决方案
本篇文章主要讲解,Flutter调试环境情况下,浏览器调试报错跨域问题的解决方法,通过本篇文章你可以快速掌握Flutter调试环境情况下的跨域问题。 日期:2024年12月28日 作者:任聪聪 报错现象: 报文信息…...
python编译为可执行文件
1.用py2exe生成可执行文件 目前,在py2exe 0.9.2版本已经支持python3.x,它可以将python程序打包为windows下独立的可执行文件。 要使用py2exe,首先要编写一个编译程序(例如编写一个名为setup.py的程序),然后在python中运行…...
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111
文章目录 一、算法概念111二、算法原理(一)感知机(二)多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点(一)优点(二)缺点 四、MLP分类任务…...
spring cloud微服务-OpenFeign的使用
OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…...
欢迪迈手机商城设计与实现基于(代码+数据库+LW)
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本欢迪迈手机商城就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…...
GCP Cloud Architect exam - PASS
备考指南 推荐视频课程 https://www.udemy.com/course/google-cloud-architect-certifications/?couponCodeKEEPLEARNING 推荐题库 https://www.udemy.com/course/gcp-professional-cloud-architect-exam-practice-tests-2024/?couponCodeKEEPLEARNING 错题集 http…...
通过 `@Configuration` 和 `WebMvcConfigurer` 配置 Spring MVC 中的静态资源映射
通过 Configuration 和 WebMvcConfigurer 配置 Spring MVC 中的静态资源映射 一、前言1. 了解静态资源的默认配置2. 使用 Configuration 和 WebMvcConfigurer 自定义资源映射示例:将 /upload/ 和 /img/ 映射到不同的文件系统目录解释:为什么使用 classpa…...
敏捷测试文化的转变
敏捷文化是敏捷测试转型的基础,只有具备敏捷文化的氛围,对组织架构、流程和相关测试实践的调整才能起作用。在前面的敏捷测试定义中,敏捷测试是遵从敏捷软件开发原则的一种测试实践,这意味着敏捷的价值观。 此外,从传…...
深度学习:从原理到搭建基础模型
引言: 深度学习为什么火? 深度学习在处理复杂的感知和模式识别任务方面展现出了前所未有的能力。以图像识别为例,深度学习模型(如卷积神经网络 CNN)能够识别图像中的各种物体、场景和特征,准确率远超传统的计算机视觉方法。 当然这之中也还因为 大数据时代的推动(随着…...
MySQL和HBase的对比
Mysql :关系型数据库,主要面向 OLTP ,支持事务,支持二级索引,支持 sql ,支持主从、 Group Replication 架构模型(此处以 Innodb 为例,不涉及别的存储引擎)。 HBase &am…...
Gateway Timeout504 网关超时的完美解决方法
引言 在Web开发中,遇到HTTP状态码504(Gateway Timeout)是相当常见的。这个状态码表示前端服务器(如负载均衡器或代理服务器)作为网关工作时,在尝试访问后端服务器处理请求时未能及时得到响应。本文将探讨导…...
【探花交友】day03—MongoDB基础
目录 课程介绍 1、通用设置 1.1 需求分析 1.2 查询通用设置 1.2 陌生人问题 1.3 通知设置 1.4 黑名单管理 2、MongoDB简介 1.1、MongoDB简介 1.2、MongoDB的特点 1.3 数据类型 3、MongoDB入门 2.1、数据库以及表的操作 2.2、新增数据 2.3、更新数据 2.4、删除数…...
总结-常见缓存替换算法
缓存替换算法 1. 总结 1. 总结 常见的缓存替换算法除了FIFO、LRU和LFU还有下面几种: 算法优点缺点适用场景FIFO简单实现可能移除重要数据嵌入式系统,简单场景LRU局部性原理良好维护成本高,占用更多存储空间内存管理,浏览器缓存L…...
宏集eX710物联网工控屏在石油开采机械中的应用与优势
案例概况 客户:天津某石油机械公司 应用产品:宏集eX710物联网工控屏 应用场景:钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂,涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…...
【社区投稿】自动特征auto trait的扩散规则
自动特征auto trait的扩散规则 公式化地概括,auto trait marker trait derived trait。其中,等号右侧的marker与derived是在Rustonomicon书中的引入的概念,鲜见于Rust References。所以,若略感生僻,不奇怪。 marker …...
【MySQL】第一弹----库的操作及数据类型
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:MySQL 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 一、SQL 语句分类 DDL:数据定…...
【服务器主板】定制化:基于Intel至强平台的全新解决方案
随着数据处理需求不断增长,服务器硬件的发展也在持续推进。在这一背景下,为用户定制了一款全新的基于Intel至强平台的服务器主板,旨在提供强大的计算能力、优异的内存支持以及高速存储扩展能力。适用于需要高性能计算、大规模数据处理和高可用…...