BeagleBone通过触摸屏启动到Qt应用 [英] BeagleBone boot to Qt app with touch screen

查看:108
本文介绍了BeagleBone通过触摸屏启动到Qt应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

和其他许多人一样,我希望有一个Qt应用程序可以在BeagleBone Black启动时直接运行.使用其他类似主题的答案: Beaglebone引导至Qt应用在嵌入式系统上启动时启动QT应用程序Linux设备(Beaglebone Black)

As many other person, I want to have a Qt application that run directly when the BeagleBone Black boot. Using the answers from other topics like these: Beaglebone Boot to Qt App ; Start QT Application on bootup on an Embedded Linux Device (Beaglebone Black)

我有一个与Angstrom合作的BeagleBone Black revC,2012年9月12日.

I have a BeagleBone Black revC with Angstrom 2012-09-12.

通过以下服务设置,我可以使应用程序在启动时启动:

I achieved to get my application to start on boot with the following service setup:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
Type=simple
TimeoutStartSec=120
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always

[Install]
WantedBy=multi-user.target

但是我的应用程序通过触摸屏(4D​​CAPE-43T)使用触摸界面,并且根本不起作用.似乎在systemd运行我的应用程序时未加载tslib库.我推论是因为当我将此行添加到服务[Unit]:

But my application uses a touch interface via a touch screen (4DCAPE-43T) and it doesn't work at all. It seems the tslib library isn't loaded when the systemd run my application. I deduced that because when I add this line to the service [Unit]:

ConditionPathExists=/dev/input/touchscreen0

然后,该服务不会加载该应用程序,并会显示错误消息,因为该路径不存在.

Then the service doesn't load the application and shows an error message because the path doesn't exist.

此外,如果我将类型从简单"替换为空闲",那么它仅在BeagleBone处于空闲模式时才加载应用程序,因此在大多数情况下每次启动过程结束时,它有时都可以工作.

Also, if I replace the type from simple to idle, so it load the application only when the BeagleBone is in idle mode and therefore most of the time at the end of every boot processes, it works sometimes.

所以我试图找到一种方法来确保tslib完成加载后我的应用程序的执行,但是我找不到正在加载tslib的内容(不是服务?).那么,如何在运行之前确保文件"/dev/input/touchscreen0"已经存在?

So I tried to find a way to assure the execution of my application after tslib finished to load, but I couldn't find what is loading tslib (not a service?). So, how can I make sure the file "/dev/input/touchscreen0" is already existing before running?

谢谢!

PS:由于我的配置文件由于环境变量的定义而在我的服务中被提及,因此它是:

PS: as my profile file is mentioned in my service because of the definitions of environment variables, here it is:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

PATH="/usr/local/bin:/usr/bin:/bin"
EDITOR="/bin/vi"            # needed for packages like cron
test -z "$TERM" && TERM="vt100" # Basic terminal capab. For screen etc.

if [ ! -e /etc/localtime ]; then
    TZ="UTC"        # Time Zone. Look at http://theory.uwinnipeg.ca/gnu/glibc/libc_303.html 
            # for an explanation of how to set this to your local timezone.
    export TZ
fi
if [ "$HOME" = "/home/root" ]; then
    PATH=$PATH:/usr/local/sbin:/usr/sbin:/sbin
fi
if [ "$PS1" ]; then
    # works for bash and ash (no other shells known to be in use here)
    PS1='\u@\h:\w\$ '
fi
if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/* ; do
      . $i
    done
    unset i
fi

PATH=$PATH:/opt/qt/lib
QWS_MOUSE_PROTO="LinuxInput:/dev/input/touchscreen0 MouseMan:/dev/input/mouse2"
SLOTS=/sys/devices/bone_capemgr.8/slots
PINS=/sys/kernel/debug/pinctrl/44e10800.pinmux/pins
export PATH PS1 OPIEDIR QPEDIR QTDIR EDITOR TERM QWS_MOUSE_PROTO SLOTS PINS
echo DM-GPIO-Test > $SLOTS
umask 022

服务文件已修改为:

Service file modified to:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice
After=systemd-modules-load.service

[Service]
Type=oneshot
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
RemainAfterExit=1;

[Install]
WantedBy=multi-user.target

在应用程序运行时检查状态后,我得到以下输出(无触摸功能):

And I get the followings output after checking the status while the application is running (without touch capabilities working):

root@beaglebone:~# systemctl status systemd-modules-load.service
systemd-modules-load.service - Load Kernel Modules
      Loaded: loaded (/lib/systemd/system/systemd-modules-load.service; static)
      Active: active (exited) since Sat 2000-01-01 01:16:39 CET; 29s ago
        Docs: man:systemd-modules-load.service(8)
              man:modules-load.d(5)
     Process: 89 ExecStart=/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/systemd-modules-load.service
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

root@beaglebone:~# systemctl status autoShow.service
autoShow.service - Autorun Qt app
      Loaded: loaded (/lib/systemd/system/autoShow.service; enabled)
      Active: activating (start) since Sat 2000-01-01 01:16:39 CET; 32s ago
    Main PID: 140 (sh)
      CGroup: name=systemd:/system/autoShow.service
          |-140 /bin/sh -c source /etc/profile ; /home/root/ShowcaseNice -qws
          `-195 /home/root/ShowcaseNice -qws
Jan 01 01:16:39 beaglebone systemd[1]: Starting Autorun Qt app...
Jan 01 01:16:45 beaglebone sh[140]: Cannot open mouse input device '/dev/input/touchscreen0': No such file or directory

root@beaglebone:~# systemctl status rc-local.service
rc-local.service
      Loaded: error (Reason: No such file or directory)
      Active: inactive (dead)

在结合命题进行了几次测试之后,我发现了一种中间解决方案,在大多数情况下似乎都可以使用.但是有时触摸功能仍然无法使用.由于我在systemd上遇到其他麻烦(请参阅此帖子),我把它放在一边.

After doing several test combining the proposition, I found an intermediate solution that seems to work most of the time. But sometimes the touch capabilities still doesn't work. As I am having other troubles with systemd (see this post), I put that on the side.

这是我几乎可以使用的服务文件:

Here is my almost working service file:

"autoShow.service"
[Unit]
Description=Autorun Qt app
ConditionFileIsExecutable=/home/root/ShowcaseNice

[Service]
After=getty@.service or getty.target
Requires=systemd-modules-load.service
WorkingDirectory=/home/root
ExecStart=/bin/sh -c 'source /etc/profile ; /home/root/ShowcaseNice -qws'
Restart=always
sysVStartPriority=99
Type=idle

[Install]
WantedBy=multi-user.target

推荐答案

实际上没有加载tslib.那是一个用户土地图书馆.如果systemd尝试启动程序时该设备不存在,则很可能是因为尚未加载硬件的内核模块.

Nothing actually loads tslib. That's a user land library. If the device doesn't exist when systemd tries to start your program, that is most likely because the kernel module for the hardware hasn't been loaded yet.

After=systemd-modules-load.service

将其添加到服务中应使systemd在加载所有静态定义的内核模块之后启动程序.

Adding this to your service should make systemd start your program after all of the statically defined kernel modules have loaded.

如果还不够晚,请考虑从/etc/rc.local启动程序或设置"After = rc-local.service"(执行/etc/rc.local).默认情况下,/etc/rc.local应该是systemd启动的最后一件事.

If that isn't late enough, consider just launching your program from /etc/rc.local or setting your "After=rc-local.service" (execs /etc/rc.local). /etc/rc.local should be the last thing started by systemd by default.

rc-local.service:

rc-local.service:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

[Unit]
Description=Local customization

[Service]
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

rc.local必须是可执行的:

rc.local needs to be executable:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

我什至没有想到这一点,但是您可以将SysVStartPriority = [1-99]添加到您的服务中.它不是推荐的属性(systemd.service建议在此之前或之后),但是比找出systemd引导过程中的位置要容易得多.他们确实需要更好的工具来显示启动顺序.

I hadn't even thought of this, but you can just add SysVStartPriority=[1-99] to your service. It's not a recommended attribute (systemd.service recommends after or before), but it's easier than figuring out where things are in the boot process in systemd. They really need better tools for showing the boot order.

这篇关于BeagleBone通过触摸屏启动到Qt应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆