
前阵子帮客户调一台7寸竖屏触摸一体机跑的是Wayland的Weston合成器。现象很典型上电开机界面横着显示触摸方向完全反了顶部还压着一条系统状态栏把应用的操作区硬生生挤掉一块。客户觉得这就是“改个配置”的事但真正上手你会发现Weston.ini这套东西在不同BSP之间差异极大同样的参数在A方案里好使换到B方案就毫无反应。这篇东西我把屏幕旋转、触摸校准、状态栏隐藏这三件事的weston.ini配置思路、参数含义和排查顺序完整记录下来适合正在做嵌入式触摸屏、自助终端、工业HMI、信息发布屏的人参考也适合刚接触Wayland/Weston、想搞懂配置文件为什么不生效的开发者。1. 配置不生效先把weston.ini的加载顺序和段落职责搞清楚1.1 配置文件到底放哪、谁先谁后Weston在设计上沿用了Linux桌面那套XDG目录规范weston.ini的搜索顺序是这样的。优先级从高到低启动时用--config/path/to/weston.ini显式指定这是最直接、最不容易出错的方式环境变量WESTON_CONFIG_FILE指定的路径$XDG_CONFIG_HOME/weston.ini也就是通常的~/.config/weston.ini/etc/xdg/weston/weston.ini这是大多数嵌入式BSP默认放置的路径上面全部都没有Weston就用内置默认参数跑起来。很多人说“我改了配置文件怎么没反应”九成是路径放错了。尤其要注意如果你在systemd服务里启动Weston比如weston.service它很可能在ExecStart里写了--config/etc/xdg/weston/weston.ini此时你往~/.config/weston.ini里写什么都白搭。反过来如果服务脚本里带了--shell或者--backend这类命令行参数这些参数的优先级也会压过weston.ini里对应的[core]段配置。我的建议是在所有调试动作之前先确认Weston进程到底是怎么拉起来的。ps aux | grep weston看一下全命令或者journalctl -u weston | head -50看启动日志。日志开头通常会打印“使用哪个配置文件”之类的信息如果连这行日志都没有说明它读的根本不是你改的那份文件。1.2 用--debug参数验证加载情况在西文文档里经常看到weston --debug这种启动方式很多人以为这只是给开发者看协议dump的其实它对你的配置调试非常有帮助。weston --debug --config/etc/xdg/weston/weston.ini --tty1启动后观察终端输出Weston会把加载的配置路径、后端类型、输出接口connector列表、输入设备识别结果都打出来。比如你看到Output DSI-1这种字眼说明DRM后端已经识别到你的显示接口如果你在[output]里写的名字和这里打出来的不一样那屏幕旋转不生效就是必然的。还有个笨但有效的办法故意在配置文件里写一个不存在的键值比如foobar如果启动时报错或者日志里出现“unknown key”类提示说明文件被读到了如果毫无反应那说明文件压根没被解析。1.3 weston.ini常见段落职责速查weston.ini不是只有[core]很多人一上来就写[output]结果没反应是因为没搞清楚各段落归谁管。我按实际使用频率整理了一张表段落管什么常用键[core]合成器主体行为backend、shell、idle-time、repaint-window[shell]桌面壳面板、背景、光标panel-position、panel-size、panel-color、background-type、background-color[output]每个显示输出的模式和旋转name、mode、transform、scale[input]输入设备/HID类参数部分BSP用它承载触摸校准[libinput]libinput设备行为enable-tap、natural-scroll、left-handed等[launcher]面板上的快捷启动图标icon、path[keyboard]键盘布局类设置少数版本支持这里要给新手提个醒weston.ini是给Weston合成器进程用的不是给Wayland客户端用的。你在里面写[shell]、[output]这些段落只能影响合成器的行为。像weston-terminal这类客户端程序它们各自的配置走的是自己的配置文件或命令行参数和weston.ini没有半毛钱关系。2. 屏幕旋转Output段transform参数全解别再瞎试90/1802.1 transform参数有哪些取值屏幕旋转的核心就一个键transform它放在[output]段落里。合法的取值有transform取值效果normal不旋转常规横屏90顺时针旋转90度180旋转180度270逆时针旋转90度等价于顺时针270度flipped水平镜像flipped-90水平镜像后再顺时针90度flipped-180水平镜像后再180度flipped-270水平镜像后再顺时针270度平时做竖屏设备用得最多的就是90和270。差别在于你的设备是怎么挂的如果屏幕顺时针转了90度比如把原本横屏的LCD按侧边竖起来底部朝右一般用transform90如果是另一侧朝下就用270。到底哪个对现场试一下就知道不行就换另一个。示例配置[output] nameDSI-1 mode800x128060 transform90 scale12.2 先确认输出名否则旋转配置无效这是旋转配置里最容易踩的坑name写错或者漏写导致[output]段落根本没匹配到任何输出。在Weston的DRM后端下输出名对应内核DRM连接器名称常见的有HDMI-A-1、DP-1、DSI-1、LVDS-1、eDP-1。想拿到准确的名称有几种办法在Weston跑起来的终端或串口里执行weston-info这个Wayland客户端会列出当前所有output的name、mode、transform信息用libdrm工具modetest -p查看连接器列表直接看ls /sys/class/drm/带card0-前缀的目录就是各个连接器。我见过有人在Rockchip的SDK里把HDMI-A-1写成HDMI-1结果旋转完全不生效还以为是合成器不支持。这种问题日志里一般不会明确报错因为它只是“没匹配上”属于静默忽略。另外要注意weston.ini里可以写多个[output]段落带name的只作用于对应连接器不带name的[output]段落则作为全局默认作用于所有输出。如果两块屏都要转你可以写两个段落分别点名。2.3 mode和transform的关系很多人搞不清mode和transform的区别我打个比方mode决定的是“屏幕的物理像素时序”也就是面板按什么分辨率刷新transform决定的是“合成器把画面旋转多少度之后再送给屏幕”。如果你的LCD面板本身就是竖屏的比如10.1寸800x1280内核驱动里上报的模式就是800x128060这个时候你如果想做竖屏UI理论上transformnormal就行。但如果你想在这块竖屏面板上跑一个横屏UI逻辑分辨率变成1280x800那就要mode800x128060配合transform90。反过来如果面板物理上是横屏1280x800你要做竖屏UI那就mode1280x80060配合transform90逻辑分辨率变成800x1280。有个实用建议如果你不确定面板原生分辨率先别写mode让Weston自己选默认模式只写transform90跑一下能转就说明一切正常。如果写上mode之后启动报Failed to set mode多半是这个模式不被驱动支持或者面板根本没有这个时序。嵌入式DSI屏没有EDID的情况下模式表由内核驱动里的panel配置决定不是你想写什么就有什么。2.4 旋转后触摸映射也跟着变但不是自动变好屏幕旋转之后触摸坐标映射的坑马上就来。这里先给结论Weston在输出层做了transformlibinput在输入层拿到的是触摸设备上报的原始坐标两者之间不会因为transform90就自动完成坐标对齐。就像你把一张纸转90度纸上画的点不会自己跟着挪到正确位置。所以每当你改了transform触摸校准一定要重新做。别问“能不能从数学上推算”实际项目里触摸屏模组装偏、面板胶水厚度不均、触摸IC坐标方向与面板不一致这些变量太多直接跑一遍校准比啥都快。具体怎么做下一章细讲。3. 触摸校准从矩阵到udev规则Weston这条链路的完整落地3.1 Weston的触摸坐标是从libinput来的先明确一个事新版Weston的输入处理走的是libinput而不是合成器自己解析evdev事件。所以你要“校准触摸”本质上是在给libinput提供一个坐标映射矩阵。这个矩阵通过udev属性LIBINPUT_CALIBRATION_MATRIX传给libinput属性值是6个数ENV{LIBINPUT_CALIBRATION_MATRIX}a b c d e f映射关系是x a * x b * y c y d * x e * y f其中x、y是触摸设备上报的原始坐标x、y是归一化到[0,1]范围的屏幕坐标。a和e是缩放系数b和d处理轴之间的旋转/倾斜c和f是偏移量。3.2 手动算校准矩阵的事例如果触摸面板基本贴装正确只是有偏移和比例问题你可以手动算。用evtest读取触摸设备原始坐标范围比如设备上报x范围0~32767y范围0~32767屏幕分辨率1280x800那么最简单的不带旋转、不带偏移的矩阵是a 1 / 32768 ≈ 0.0000305 e 1 / 32768 ≈ 0.0000305 c 0 f 0完整一点的公式a 1 / (x_max - x_min) c -x_min * a e 1 / (y_max - y_min) f -y_min * e b 0 d 0把这个矩阵写进udev规则。注意这里算出来的是“触摸设备满量程覆盖整个屏幕”的情况如果你的触摸屏有效区域只占屏幕的一部分那就不能这么简单算最好是交互式校准。3.3 交互式校准weston-calibration或其他工具很多BSP在Weston里集成了校准工具常见的有weston-calibration有的版本也把触摸校准做成一个Wayland客户端名字五花八门。用法一般是在Weston已经跑起来的前提下另开一个终端或者通过SSH登录执行weston-calibration屏幕上会依次出现几个十字准星用触摸笔依次点准完成后工具会输出一组矩阵有的BSP会直接写进weston.ini或打印出来让你手动拷贝。不同版本的输出方式差异很大。有的BSP把结果写进/etc/xdg/weston/weston.ini的[input]段落有的只打印到终端。如果工具支持直接写配置文件省事如果不支持就把打印出来的6个数填到udev规则里。这里有个需要注意的点xinput_calibrator这类工具是针对X11的生成的是X的坐标变换矩阵不能直接抄到LIBINPUT_CALIBRATION_MATRIX里两者坐标空间定义不一样。在Wayland会话里跑X11校准工具也不是标准做法别在这上面浪费时间。3.4 udev规则怎么写、怎么生效拿一个常见的电容触摸屏举例设备名比如是Goodix Capacitive TouchScreen。udev规则可以这样写SUBSYSTEMinput, ATTRS{name}Goodix Capacitive TouchScreen, ENV{LIBINPUT_CALIBRATION_MATRIX}0.0000305 0 0 0 0.0000305 0写好后执行sudo udevadm control --reload-rules sudo udevadm trigger然后再重启Weston校准才对输入设备生效。udevadm trigger是对所有设备重新触发事件你也可以只针对特定设备触发比如udevadm trigger /sys/class/input/event4前提是你知道这个触摸设备对应哪个event节点。验证校准是否生效可以看libinput debug-events的输出。找到你的触摸设备触点按下时观察打印出来的坐标是否在合理范围。前面提到校准矩阵作用于归一化坐标如果你发现x或者y出现了负数或者大于1的情况那说明矩阵算错了或者触摸设备的raw值范围估错了。3.5 旋转和触摸校准的顺序问题这是最实用的建议先定屏幕旋转再做触摸校准。为什么因为每次修改transform显示内容的坐标空间都会变。比如你先把屏幕UI调成竖屏再去校准触摸这时候触摸映射对应的是竖屏状态如果你之后又把transform从90改成270老校准数据就不再适用触摸方向会变成反的。我在实际项目里的标准流程是先确定最终形态的屏幕方向和transform值再跑一次触摸校准固定这两个配置后做整机稳定性验证不再来回改。这里我建议直接用udev规则做校准矩阵的最终落地而不是依赖weston.ini里的[input]段。因为[input]段对校准的支持在不同版本、不同BSP里存在与否不一致而udev规则是libinput标准机制不管你换哪个版本的Weston只要底层还是libinput这套规则就有效。如果某天BSP升级了Weston你的校准不会一起丢。4. 状态栏隐藏panel-positionnone和kiosk-shell两套方案怎么选4.1 desktop-shell的panel控制Weston默认的shell是desktop-shell它会画一个顶部状态栏panel上面带launcher图标、时钟这些。做嵌入式整机UI的时候这条状态栏通常是要去掉的。最直接的办法是在weston.ini里写[shell] panel-positionnone background-typecolor background-color0xff000000在我接触过的多数BSP里panel-positionnone可以把desktop-shell的状态栏完全隐藏。同时把背景设成纯色避免合成器的默认背景图露出来。颜色格式是0xAARRGGBB0xff000000是不透明黑色。很多人在这里写0x000000结果背景变成全透明露出黑屏或者白屏看着像是“没生效”其实是alpha通道没写。如果你不是要完全隐藏只是想换位置或者换颜色panel相关参数还有[shell] panel-positionbottom panel-size36 panel-color0xee333333panel-size是像素高度panel-color是带alpha的背景色。注意panel只会在desktop-shell下存在如果你切到了kiosk-shell这些panel参数即便写了也不会有人去读。4.2 用kiosk-shell做纯净单应用界面如果做的是自助终端、广告机这类只需要跑一个全屏应用的场景我更推荐直接用kiosk-shell。它没有状态栏、没有launcher、没有桌面背景装饰天然就是“隐藏状态栏”的最佳解。配置方式[core] shellkiosk-shell.so前提是你的Weston版本编译了kiosk-shell模块。Weston从7.x开始把kiosk-shell作为标准shell带进发行版很多BSP也默认包含。如果你的版本没有这个so文件可以确认一下Weston的编译选项或者退回panel-positionnone的方案。kiosk-shell下客户端默认以全屏方式呈现窗口装饰也基本不做比较适合那种“开机直接进业务界面”的封闭式设备。它还支持通过[shell]段配置背景[shell] background-color0xff112233这里的[shell]段对kiosk-shell同样有效背景色、背景类型这些参数会被它读取。另外提一句顶层思路如果系统里用systemd管理Weston而service文件里写了--shelldesktop-shell.so那么你在weston.ini里写的shellkiosk-shell.so会被命令行参数覆盖。改配置文件之前先看service文件有没有硬编码shell这个坑我踩过不止一次。4.3 状态栏隐藏之后还容易漏掉的两件事第一件是熄屏。终端设备经常开机24小时不休息如果Weston没有禁用idle一段时间没操作它会自己进入DPMS睡眠或者画面变暗。很多人的“状态栏隐藏后屏幕还会黑”其实是idle导致的不是状态栏的问题。解决办法[core] idle-time0idle-time单位是秒0表示永不idle。对于无人值守终端这条一定要写上。第二件是鼠标光标。触摸一体机上不该出现鼠标箭头但如果你用desktop-shell跑某些带鼠标移动的应用光标可能会露出来。kiosk-shell在纯触摸场景下基本不画光标desktop-shell下想隐藏光标比较省事的做法是做一个全透明的PNG光标主题然后在[shell]里指定[shell] cursor-themetransparent-cursor cursor-size32主题目录放在标准光标主题路径下。说实话这个操作稍微有点绕所以我个人的倾向是能上kiosk-shell就上kiosk-shell省掉一堆麻烦事。5. 一套完整的实战配置示例竖屏触摸校准无状态栏一次到位5.1 场景设定假设一台10.1寸设备显示接口是DSI-1物理面板原生分辨率800x1280竖屏安装触摸屏是电容式GT911设备名Goodix Capacitive TouchScreen原始坐标范围0~32767业务UI希望逻辑分辨率是1280x800的横屏界面开机后要跑一个全屏应用不允许出现状态栏、桌布、光标。先算一下物理面板是800x1280竖屏逻辑UI想做成1280x800横屏那就需要mode800x128060配合transform90或者270以现场方向为准。触摸矩阵先按满量程映射估算a 1 / 32768 ≈ 0.0000305 e 1 / 32768 ≈ 0.0000305 c 0 f 0这只是初始值最终值以交互校准输出为准。5.2 udev规则文件新建/etc/udev/rules.d/99-touchscreen.rulesSUBSYSTEMinput, ATTRS{name}Goodix Capacitive TouchScreen, ENV{LIBINPUT_CALIBRATION_MATRIX}0.0000305 0 0 0 0.0000305 0保存后执行udevadm control --reload-rules udevadm trigger5.3 weston.ini完整内容放在/etc/xdg/weston/weston.ini[core] backenddrm-backend.so shellkiosk-shell.so idle-time0 repaint-window7 [shell] background-typecolor background-color0xff000000 [output] nameDSI-1 mode800x128060 transform90如果是调试阶段临时想看状态栏、想在桌面上快速启动终端可以把shell换回desktop-shell.so加一个launcher[launcher] icon/usr/share/icons/hicolor/24x24/apps/utilities-terminal.png path/usr/bin/weston-terminal生产环境再切回kiosk-shell。这种“调试用desktop-shell、交付用kiosk-shell”的做法我在多个项目里都用得很顺手。5.4 启动和验证步骤假设你的系统用systemd管理先确认weston.service里没有硬编码--shell和--config。然后重启服务sudo systemctl restart weston验证顺序看journalctl -u weston日志确认配置文件被加载、输出被识别用weston-info确认output的transform已经生效触摸交互式校准确认点击位置和UI元素对得上启动业务应用观察顶部、底部是否还有合成器绘制的条带或背景。6. 我在生产环境里踩过的坑从配置不生效到触摸反向的排查清单6.1 配置不生效的排查顺序碰到“我改了weston.ini没用”的问题按下面顺序查文件路径是不是Weston实际读取的那份用--config强制指定最保险命令行参数有没有覆盖查systemd unit或启动脚本里的--shell、--backendname有没有写对输出名对不上[output]段落被静默忽略有没有杀死旧进程嵌入式里经常出现weston 启动改完配置又weston 两个进程抢同一块DRM设备日志还不报错配置语法是不是有误INI文件里注释用#段落名和键名严格区分大小写颜色值是不是写成了6位十六进制必须0xAARRGGBB八位。6.2 屏幕旋转后触摸反向或偏移这个问题的根因我在3.5里讲过transform变了触摸校准没跟着变。但还有一种情况容易被忽略你的触摸设备可能被内核识别成多个设备节点比如GT911有时会注册两个event节点udev规则只匹配到了其中一个另一个节点还在用默认映射。这时候校准矩阵看似写对了实际只生效了一半。排查方法libinput list-devices把所有触摸相关设备列出来逐个确认匹配的udev规则。如果你的触摸IC确实会注册多个节点可以把udev规则写得更通用一点比如同时匹配多个名字或者用KERNELS、ATTRS{phys}这种更底层的属性来锁定设备。6.3 transform90在某些驱动下花屏或黑屏这个问题在部分GPU/显示控制器上会出现。Weston的旋转如果走硬件plane旋转那是最高效的路径如果硬件不支持合成器要自己转画面对性能和内存带宽要求不低。少数情况下某款驱动对rotate的支持有bug导致黑屏或者花屏。我遇到过一次是在一颗比较老的显示控制器上transform90黑屏但transform180正常。查了一通发现是驱动对90度旋转的时钟/带宽限制没处理好。这种问题从weston.ini层面很难彻底解决常见出路是通过内核启动参数给连接器加一个旋转模式比如某些平台支持videoDSI-1:800x1280配合驱动级旋转或者换一种物理安装方式让面板默认方向和你想要的UI方向一致从根上省掉transform。当然如果只是180度绝大多数驱动是支持得很好的。6.4 panel-positionnone在某些版本里失效panel-positionnone不是每个desktop-shell版本都支持。我在一套相对老的BSP上就遇到过明明写了panel-positionnone状态栏还在。后来确认那个版本的desktop-shell根本不认none这个值。这种情况的兜底方案就是上kiosk-shell同时把业务应用做成全屏启动。如果你因为某些原因必须用desktop-shell也可以试试把panel的高度设成0[shell] panel-size0但我不保证所有版本都认panel-size0所以最稳妥的还是kiosk-shell。6.5 校准矩阵“看着对”但点不准有一种情况是矩阵数值完全按照公式算出来了udev规则也生效了但点击还是差几个像素。这通常是触摸设备的raw值不是线性的或者在边缘区域存在非线性畸变。电阻屏特别容易出现这种问题电容屏相对好一点但劣质模组一样会翻车。面对非线性问题手动算矩阵搞不定必须走交互式多点校准。Weston自带的校准工具通常在多点采样后会做一个最小二乘拟合比你自己拿两个点硬算靠谱得多。如果你调试的BSP没有校准工具可以自己写个Wayland测试客户端draw几个十字在回调里读触摸坐标自己拟合这在嵌入式项目里也是常见操作。6.6 改完配置后“没重启”导致的假故障Weston不会像桌面系统那样自动reload配置文件。改完weston.ini必须重启Weston进程。很多人在嵌入式开发板上习惯用串口改配置改完觉得“程序跑着就应该读到新值”结果怎么试都不对。正确操作是sudo systemctl restart weston如果你是在前台跑Weston调试先CtrlC停掉再重新启动。别用kill -HUP之类的信号指望它reload至少在我用过的版本里SIGHUP并没有统一的配置重载行为。尾声一套能少踩坑的调试顺序最后分享一个我这两年调试Weston触摸屏设备总结出来的顺序照着走能省掉很多来回。先不要动触摸校准先把显示调好。第一步确认Weston跑起来了、DRM后端正常、能看到输出第二步定transform把屏幕方向调到最终交付的形态第三步再去处理触摸校准把校准矩阵固化到udev规则里第四步做状态栏和背景的收尾能上kiosk-shell就上kiosk-shell最后把所有配置固化进镜像或者部署脚本保证每一台设备出来的效果一致。这个顺序的背后逻辑是显示是触摸的参照系坐标系没定之前任何校准都是白做。反过来如果你先把触摸调准了再回头改屏幕方向那校准一定得重来一遍。Weston.ini这个东西说简单就是几个键值对说复杂版本差异、BSP定制、命令行覆盖、udev交互每一个环节都能让人卡半天。希望这份配置笔记能帮你少走几步弯路至少别像我当年那样在串口前面耗上两个通宵。