Mythsman


乐极生悲,苦尽甘来。


树莓派与1024x600分辨率屏幕的适配问题

问题

为了方便操作,买了一个 7英寸的 LCD 触摸屏,结果发现屏幕是 1024x600 的分辨率,系统总是会认为是 1024x768 的分辨率,导致了两个后果:

  1. 分辨率不准。由于实际展示的高度比渲染的要低,导致屏幕下方的东西是看不到的。
  2. 触摸板不准。虽然图像渲染会超出屏幕,但是触摸板似乎却做了缩放,触摸的地方越往下鼠标跟手的位置就越不准。

问了下亚博智能的技术客服,按照他的建议修改了 /boot/config.txt 中的 hdmi_cvt 等相关参数,重启后依然不行。接着他们建议直接刷入他们配置好的 armhf 镜像。由于我需要使用 arm64 ,因此个我肯定是不能干的。于是就自己琢磨了下,大半天才终于搞定。

踩坑

弯路稍微提一嘴吧,不然对不起大半天踩的坑。

为了解决分辨率问题,研究了树莓派官网HDMI配置的一大堆参数,经过一下午的重启后,结果还是不行。

为了解决触摸板不准的问题,找到了 xinput_calibrator 这个屏幕校准的工具,结果由于屏幕太矮,下面的两个检查点根本点不到,太坑。

解决

这个问题可以理解是驱动问题,应当还是要直接找到生产厂商,整到驱动相关的文档。

经过多方查找,发现我的这个板子是 微雪的7inch HDMI LCD ,找到官方文档后,发现了驱动的 github 地址:https://github.com/waveshare/LCD-show.git

代码clone下来后,似乎是要执行其中的 ./LCD7-1024x600-show 脚本。不过慢着,先看下脚本做了啥:

i=1
for lines in `cat ./boot/mark`
do
  case ${i} in
  1) var1=${lines};;
  esac
  i=`expr ${i} + 1`
done
#echo "$var1"

j=$(uname -n)
if test "$var1" = "0" -a "$1" != "lite" -a "$2" != "lite" ;then

if test "$j" != "retropie" ;then
sudo apt-get install xserver-xorg-input-evdev
sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
fi

if test "$j" = "retropie" ;then
sudo cp -rf ./nes /home/pi/RetroPie/roms/
fi

echo "1" > ./boot/mark
sudo dpkg -i -B ./xinput-calibrator_0.7.5-1_armhf.deb

sudo apt-get install cmake -y
cd ./rpi-fbcp/build/
sudo cmake ..
sudo make
sudo install fbcp /usr/local/bin/fbcp
cd ../../
sudo mkdir -p /usr/share/X11/xorg.conf.d

elif test "$var1" = "0" -a "$1" = "lite" ;then
echo "1" > ./boot/mark
echo "No touch driver installled"
echo "No fbcp driver installled"
sudo mkdir -p /usr/share/X11/xorg.conf.d

fi

sudo cp -rf ./etc/rc.local /etc/rc.local

if test "$1" = "0" -o "$#" = "0" -o "$2" = "0" ; then
sudo cp -rf ./etc/X11/xorg.conf.d/99-calibration.conf-7-1024x600  /usr/share/X11/xorg.conf.d/99-calibration.conf
sudo cp ./boot/config-7-1024x600.txt /boot/config.txt
echo "LCD configure 0"
elif test "$1" = "lite" -a  "$#" = "1"; then
sudo cp -rf ./etc/X11/xorg.conf.d/99-calibration.conf-7-1024x600  /usr/share/X11/xorg.conf.d/99-calibration.conf
sudo cp ./boot/config-7-1024x600.txt /boot/config.txt
echo "LCD configure 0"
elif test "$1" = "90" -o "$2" = "90" ; then
sudo cp -rf ./etc/X11/xorg.conf.d/99-calibration.conf-7-1024x600-90  /usr/share/X11/xorg.conf.d/99-calibration.conf
sudo cp ./boot/config-7-1024x600.txt-90 /boot/config.txt
echo "LCD configure 90"
elif test "$1" = "180" -o "$2" = "180" ;then
sudo cp -rf ./etc/X11/xorg.conf.d/99-calibration.conf-7-1024x600-180  /usr/share/X11/xorg.conf.d/99-calibration.conf
sudo cp ./boot/config-7-1024x600.txt-180 /boot/config.txt
echo "LCD configure 180"
elif test "$1" = "270" -o "$2" = "270" ;then
sudo cp -rf ./etc/X11/xorg.conf.d/99-calibration.conf-7-1024x600-270  /usr/share/X11/xorg.conf.d/99-calibration.conf
sudo cp ./boot/config-7-1024x600.txt-270 /boot/config.txt
echo "LCD configure 270"
fi



sudo cp -rf ./usr/share/X11/xorg.conf.d/99-fbturbo.conf-HDMI /usr/share/X11/xorg.conf.d/99-fbturbo.conf 
if test "$j" = "kali" ;then
sudo cp ./usr/share/X11/xorg.conf.d/99-fbturbo.conf-kali-HDMI /usr/share/X11/xorg.conf.d/99-fbturbo.conf
fi

if [ -b /dev/mmcblk0p7 ]; then
sudo cp ./cmdline.txt-noobs /boot/cmdline.txt
else
sudo cp ./cmdline.txt /boot/
fi

sudo cp ./inittab /etc/

if test "$#" = "0" -o "$1" = "0" -o "$1" = "90"  -o "$1" = "180" -o "$1" = "270" -o "$2" = "0" -o "$2" = "90"  -o "$2" = "180" -o "$2" = "270" -o "$1" = "lite" -o "$2" = "lite"; then
sudo reboot
echo "reboot now"
else
echo "Invalid parameter,Usage:LCD7-1024x600-show [0] [90] [180] [270] [lite]"
fi

需要注意的坑是这里有个 sudo dpkg -i -B ./xinput-calibrator_0.7.5-1_armhf.deb 操作。不懂为啥他要把 xinput-calibrator 的 armhf 包写死在项目里。如果系统镜像是 arm64 的话,这个包是用不了的,还会报错。解决方法是,把这行直接改成 sudo apt install xinput-calibrator -y 即可。

其他操作看起来都没有坑,比如用 apt 安装依赖、往 /usr/share/X11/xorg.conf.d/ 下扔配置文件、往 /etc 下扔 inittab 文件、修改 /boot/config.txt 配置文件、修改 /boot/cmdline.txt 启动参数等等,似乎都是些业务逻辑。

但其实这里的配置修改的地方简直太暴力了,都是直接用项目里的配置完整替换掉原始文件,也不做任何备份。万一我自己加了一些配置,这里就完全被覆盖掉了,找都找不回来。。。所以建议在刷完干净的镜像后就执行这个命令,不要急着配置其他的东西。并且记得把这两个文件手动备份下,万一出了问题也方便改回去。。。