可以直接拷贝至arm32 linux系统上使用的X11VNC应用,无需配置,解压即用:
支持X11版本【可共享屏幕,可键盘和鼠标操作】
https://download.csdn.net/download/wanvan/10920626
服务端启动:
./x11vnc
不支持X11版本【仅共享屏幕,不能键盘和鼠标操作】
vnc_arm32_withoutX11_rawfb
https://download.csdn.net/download/wanvan/10920632
服务端启动:
./x11vnc -rawfb /dev/fb0 -clip 640x480+0+0
然后PC端通过VNC-Viewer连接服务端即可。注意:要保证服务端和客户端网络能ping通才能连上,这是前提
手上有块IMX6的板子,为了方便直接在PC上显示该arm32 的板子的界面内容(这样就可以不用板子再外接一个显示器来显示内容了),且可以鼠标键盘操作。说白了就是要实现远程控制,经过调研可以用X11VNC,可是没有直接可以给imx6 arm32可用的版本,没办法就自己编译移植咯。
整个在IMX6嵌入式平台搭建VNC环境的过程如下:
方式1:IMX6开发板上安装VNC服务端:
通过脚本安装x11vnc 作为VNC服务器端
https://blog.csdn.net/zjqlovell/article/details/52910097
https://github.com/suchja/x11server
https://github.com/LibVNC/libvncserver
方式2:VNC交叉编译移植到ARM开发板过程【最终采用的方案】
X11VNC源码下载地址:
http://x11vnc.sourceforge.net/dev/x11vnc-0.9.14-dev.tar.gz
编译不支持x11 的版本
刚开按如下命令去配置:
CC=arm-poky-linux-gnueabi-gcc CFLAGS=-O2 ./configure --host=arm-linux --without-x --prefix=/opt/vnc/
报上述找不到crtl.o、-lgcc_s等库和目标文件的原因是: configure时少传入了一些交叉编译的参数。正确的传参如下:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure CC=arm-poky-linux-gnueabi-gcc -cache-file=cache0 --host=arm-poky-linux --prefix=/opt/vnc/
CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi”
最终可以正常configure OK的命令如下:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure CC=arm-poky-linux-gnueabi-gcc -cache-file=cache0 --host=arm-poky-linux --without-x --prefix=/opt/vnc/ CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi" 【rawfb也可以】
按上述编译出来的在imx6上运行时只能使用rawfb,因为是不支持X11
Configure完输出的结果如下:
make之后 sudo make install
注意必须sudo make install加上“sudo”,不然opt/vnc/下创建目录会失败导致安装过程失败。如上是安装OK了。
编译支持x11 的版本
配置支持X11模式的vnc服务端版本:
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure CC=arm-poky-linux-gnueabi-gcc -cache-file=cache0 --host=arm-poky-linux --prefix=/opt/vnc_arm32/ CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi" 【使用的imx6上提取的交叉编译工具链】
编译
上面报找不到-lX11和相关库,实际上最终是去路径fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/lib找有没-lX11,而之前该路径下没有此库。另外相关的库都是x86-x64版本的,不是arm版的。将此路径下相关库替换为imx6上usr/lib下面的so库,则configure通过;
make编译时报如下错:
解决方案:从imx6板子usr/include下提取整个X11目录至交叉编译工具链fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/include 路径下然后编译就通过了。
最后make install没有问题。之后打包成tar格式,拷贝至imx6板子上,解压出来。
启动运行:./x11vnc 可以啥也不用配置,然后PC端通过VNC-Viewer连接它,便可以看到arm板的界面、鼠标和键盘也可以操作了
方式3:自己基于VNC库开发程序
LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.
https://sourceforge.net/projects/libvncserver/
连接和预览
将前面方式2编译出的vnc库拷贝至IMX6的opt目录下(其实拷贝至随便哪个路径均可),然后./x11vnc直接运行即可,后面可带一些参数
设置PC-IMX的直连通信
PC端设置以太网的静态ip: eth0设置静态IP,而且IP不要与wlan0的ip处于同一个网段
IMX6端设置以太网的静态ip:sudo ifconfig eth0 192.168.0.101
保持PC和IMX6在同一个网络。交叉网线连接之后,相互ping,如果相互ping得通,说明可以正常通信了。
IMX6端启动VNC服务
前面编译make install后,移植编译的包至IMX6 /opt目录下,可以不配置密码等操作。
编译出的非X11 vnc版启动如下:
按如下命令运行:
./x11vnc -rawfb /dev/fb0 -pipeinput UINPUT:touch, tslib_cal=/etc/pointercal, direct_abs=/dev/input/event2, nouinput, dragskip=4 -clip 640x480+0+0
其中校准文件tslib_cal和触摸屏设备direct_abs的路径要换成自己设备中的路径。【tag:编译出的非X11版本客户端连接后鼠标键盘无响应,尝试过很多配置都没有解决】
编译出的X11版启动如下:
./x11vnc 可以啥也不用配置,然后PC端通过VNC-Viewer连接它,便可以看到arm板的界面、鼠标和键盘也可以操作了
PC通过vncviewer连接
在pc端通过vnc客户端工具如vncviewer连接设备,这时就能看到设备显示的内容了,而且可以通过鼠标操作设备了。
碰到的问题:
按上述操作,PC端确实可以看到imx6上的屏幕画面。但是PC端鼠标却无法点击。跟下文的类似:
嵌入式arm开发板上移植x11vnc成功,能够运行测试程序
此时在PC机上用VNCviewer访问arm上的程序,结果只能显示实时显示桌面,在客户端不能够用鼠标和键盘控制服务端
(./x11vnc -noipv6 -rawfb /dev/fb0 -pipeinput UINPUT:touch,tslib_cal=/etc/pointercal,direct_abs=/dev/input/event2,nouinput,dragskip=4 -clip 640x480+0+0 -usepw)这是我在arm上启动x11vnc 的代码
不能用鼠标键盘的原因:前面编译x11vn源码时,编译的模式选的是不支持x11模式的。X11模式下用到了x-server相关的内容,x-server可以跟鼠标、键盘进行操作,故X11版本是可以用键盘和鼠标。之前编译的是非x11模式的,只能用./x11vnc -rawfb显示arm板屏幕端的内容,鼠标和键盘是用不了的。上面的命令说是可以用键盘和鼠标,应该是tslib_cal和direct_abs支持所以才能用。而我的arm板目前没有移植tslib