4.12蓝牙
4.12.1蓝牙无线技术介绍
蓝牙技术是一种低成本、低功耗、短距离的无线技术。它被设计为电缆和其他短程技术如IrDA的替代品。蓝牙无线技术的个人区域范围通常可达10米。有关蓝牙无线技术的更多信息,请参见www.bluetooth.com/。
对于i.MX,蓝牙支持多个供应商。详细信息,请参见i.MX Linux®用户指南(IMXLUG)中的“蓝牙无线技术和Wi-Fi连接”章节。
4.12.2蓝牙驱动简介
i.MX使用开源蓝牙驱动程序。蓝牙软件分为以下四个部分:
•4线UART和TTY驱动程序:是与蓝牙模块的通信接口。
•蓝牙HCI设备驱动程序:UART (H4)是蓝牙设备和主机之间通信的串行协议。大多数具有UART接口的蓝牙设备都需要此协议。
•蓝牙内核栈:蓝牙框架和协议实现。
•蓝牙用户栈:提供几个用户空间实用程序,并集成许多用例配置文件。
4.12.3蓝牙驱动文件
蓝牙驱动程序源文件在内核源目录中。
•蓝牙HCI设备驱动:
— drivers/bluetooth/hci_h4.c
— drivers/bluetooth/hci_ldisc.c
•蓝牙内核栈:
——CONFIG_SERIAL_IMX
——CONFIG_TTY
•HCI接口:
——CONFIG_BT_HCIUART
——CONFIG_BT_HCIUART_H4
——CONFIG_BT_HCIUART_BCM
•蓝牙栈:
——CONFIG_BT
——CONFIG_BT_RFCOMM
——CONFIG_BT_RFCOMM_TTY
——CONFIG_BT_BNEP
——CONFIG_BT_BNEP_MC_FILTER
——CONFIG_BT_BNEP_PROTO_FILTER
——CONFIG_BT_HIDP
4.13 Wi-Fi
4.13.1介绍
通过板载芯片解决方案和外部硬件,i.MX支持蓝牙和Wi-Fi。对于各种板载芯片和外部解决方案,请参阅i.MX Linux®用户指南(IMXLUG)中的“蓝牙无线技术和Wi-Fi连接”章节。
4.13.2软件操作
BSP支持:
•从5.4.47-2.2.0版本开始,所有Linux BSP中可用的i.MX芯片组都支持NXP Wi-Fi驱动模块。有关支持的Wi-Fi芯片组列表,请参阅每个i.MX Linux BSP发行版的发行说明。
4.13.3驱动特性
NXP Wi-Fi驱动支持CFG80211、NL80211内核接口。驱动支持AP模式、STA模式和Wi-Fi直通模式。
NXP Wi-Fi soc需要在上电/复位时加载固件镜像。所支持的Wi-Fi soc的固件镜像位于以下rootfs目录:/lib/firmware/nxp.
4.13.4源代码结构
NXP onedrive的源代码文件可以在codeurora.org上找到。
4.13.5菜单配置选项
这个模块提供了以下Linux内核配置选项:
•CONFIG_MAC80211 = y
•COCONFIG_NL80211_TESTMODE = y
•CONFIG_CFG80211_WEXT = y
•CONFIG_HOSTAP = y
•CONFIG_CFG80211_INTERNAL_REGDB = y
4.13.6配置用户空间WLAN
以工作站模式连接AP
下面的命令组用于将WLAN连接到给定的SSID。
modprobe moal mod_para=nxp/wifi_mod_para.conf
head -n 4 /etc/wpa_supplicant.conf > /etc/wpa_supplicant.conf.tmp
wpa_passphrase ssid password >> /etc/wpa_supplicant.conf.tmp
mv /etc/wpa_supplicant.conf /etc/wpa_supplicant.conf.bak
mv /etc/wpa_supplicant.conf.tmp /etc/wpa_supplicant.conf
wpa_supplicant -B -i mlan0 -c /etc/wpa_supplicant.conf -D nl80211
下面是wpa_supplicant.conf的示例:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
network={
ssid="NETGEAR73"
#psk="freshbutter"
psk=eb0376fc14ee5d1e6ce129ad54da038adab……
}
获取IP地址
获取wlan0的IP地址的命令如下:
udhcpc -i mlan0
第五章 图形
5.1 图形处理单元(GPU)
5.1.1介绍
图形处理单元(GPU)是一款针对嵌入式2D/3D图形应用的图形加速器。GPU3D (3D graphics processing unit)是一款嵌入式引擎,用于对OpenGL ES 1.1、OpenGL ES 2.0、OpenGL ES 3.0和OpenCL 1.1 ep等用户级图形接口进行加速。2D图形处理单元(GPU2D)是针对图形用户界面(GUI)渲染加速的嵌入式2D图形加速器。
VG图形处理单元(GPUVG)是一种嵌入式矢量图形加速器,用于支持OpenVG 1.1图形API和特性集。GPU驱动内核模块源代码在内核源树中,但库仅以二进制形式下发。
注意:
•GC400T不支持OpenGL ES 3.0。
•GC880/GC400T不支持OpenCL 1.1EP。GC2000和GC2000+支持OpenCL 1.1 EP。
•GC7000XSVX支持OpenCL 1.2 FP、OpenVX 1.0.1和Vulkan 1.0。
5.1.2驱动特性
GPU驱动使该单板能够提供以下软硬件支持:
•EGL (EGL是Khronos渲染API(如OpenGL ES或OpenVG)和底层原生平台窗口系统之间的接口) 1.5 API,由Khronos集团定义。
•OpenGL ES(OpenGL®ES是一种免版税的跨平台API,用于嵌入式系统上的全功能2D和3D图形)1.1 API,由Khronos Group定义。
•Khronos Group定义的OpenGL ES 2.0 API。
•由Khronos Group定义的OpenGL ES 3.0/3.1/3.2 API。
•OpenVG (OpenVG是一个免版税的跨平台API,为Flash和SVG等矢量图形库提供底层硬件加速接口) 1.1 API,由Khronos集团定义。
•OpenCL (OpenCL是现代处理器的第一个开放的、免版税的跨平台并行编程标准。)1.1EP API,由Khronos集团定义。
•Khronos Group定义的openGL 2.1 API。
•自动3D内核减速,当热驱动的热通知激活时,3D内核将以1/64时钟运行。
•由Khronos Group定义的OpenCL1.1/1.2FP API。
•由Khronos Group定义的OpenVX 1.0.1 API。
•由Khronos Group定义的Vulkan 1.0 API。
5.1.3硬件操作
详细的硬件操作请参见《应用处理器参考手册》中SoC相关的GPU章节。
5.1.4软件操作
GPU驱动分为两层。第一层以内核模式运行,充当整个堆栈的基本驱动程序。
这一层提供了基本的硬件访问、设备管理、内存管理、命令队列管理、上下文管理和电源管理。第二层运行在用户模式,实现堆栈逻辑,向上层应用提供如下api:
•OpenGL ES 1.1, 2.0和3.0 API
•egl 1.5 API
•OpenGL ES11/20/30/31/32
•OpenCL 1.1/1.2 FP
•OpenVX 1.0.1
•Vulkan 1.0
•OpenGL 4.0
•WebGL 1.0.2
•OpenVG 1.1 API
•OpenCL 1.1 EP API
5.1.5源代码结构
GPU驱动内核模块源结构如下表所示:
drivers/mxc/gpu-viv
5.1.6库结构
GPU驱动用户模式库结构如下表所示:
/usr/lib
**SONAME用于libEGL.so, libGLESv2.so, libGLESv1_CM.so, libGLESv1_CL.so, libGL.so。
libOpenVG.so,OpenVG特性有两个库。libOpenVG.3d基于GC7000XSVX/GC2000+/GC2000/GC880/ gc400的OpenVG库也是如此。libOpenVG.2d基于gc355的OpenVG库也是如此。
•对于i.MX 6DualPlus/QuadPlus和i.MX 6Dual/Quad,都是libOpenVG.3d.so, libOpenVG.2d.so可以用。
•对于i.MX 6DualLite和i.MX 6SoloX,只有libOpenVG.3d.so可以用。
•如果没有SOC限制,对于x11后端,libOpenVG.3d.so默认情况下是链接的。
•如果没有SOC限制,对于framebuffer, directFB和Wayland后端,默认的openVG库链接到libOpenVG.2d.so。
这可以通过使用下面的命令序列来完成:
cd /usr/lib
sudo ln -s libOpenVG_355.so libOpenVG.so
5.1.7 API参考
有关详细规格,请参阅以下网站:
• OpenGL ES 1.1, 2.0, and 3.0 API: www.khronos.org/opengles/
• OpenCL 1.1 EP www.khronos.org/opencl/
• EGL 1.4 API: www.khronos.org/egl/
• OpenVG 1.1 API: www.khronos.org/openvg/
• OpenGL ES API: www.khronos.org/opengles/
• OpenCL API: www.khronos.org/opencl/
• OpenVX API: www.khronos.org/openvx/
• Vulkan API: www.khronos.org/vulkan/
• OpenGL API: www.khronos.org/opengl/
• WebGL API: www.khronos.org/webgl
5.1.8菜单配置选项
在菜单配置中为GPU驱动启用以下模块:
CONFIG_MXC_GPU_VIV是GPU驱动的配置选项。在菜单配置中,该选项在设备驱动程序下可用
MXC support drivers > MXC Vivante GPU support > MXC Vivante GPU support.
在弹出的界面中,选择“配置内核”,选择Device Drivers > MXC support drivers > MXC Vivante GPU support > MXC Vivante GPU support,,然后退出。进入下一界面时,请选择以下选项开启图形处理器驱动:
•Package list > imx-gpu-viv
•这个包提供专有的二进制库,以及从GPU构建的测试代码,用于帧缓冲区
5.2 Wayland
5.2.1介绍
Wayland是一种合成器与客户端通信的协议,也是该协议的C库实现。合成器可以是一个独立的显示服务器,运行在Linux内核模式设置和evdev输入设备上,一个X应用程序,或者一个Wayland客户端本身。客户机可以是传统应用程序、X服务器或其他显示服务器。
Wayland项目的一部分也是Wayland合成器的Weston参考实现。Weston合成器是一个最小和快速的合成器,适用于许多嵌入式和移动的用例。
本章介绍如何在i.MX系列设备上使能Wayland/Weston支持。
5.2.2软件操作
此版本基于Wayland 1.16版本和Weston 5.0.0版本。
5.2.3 Yocto构建说明
Yocto项目的构建说明如下:
$ MACHINE = DISTRO=fsl-imx-xwayland source imx-setup-release.sh -b build-wayland
3.建立一个映像。
$ bitbake imx-image-multimedia
5.2.4定制Weston
i.MX Weston包括两个合成器。一个是EGL3D合成器,它由3D内核加速。另一种是用2D BLT引擎加速的G2D合成。
Weston选项可以在文件“/etc/init.d/ Weston”中更新。
Weston支持多显示器
仅支持G2D合成器中支持多显示。添加以下选项来启动Weston:
weston --tty=1 --device=/dev/fb0,/dev/fb2 --use-g2d=1 &
Weston支持多缓冲区
Weston服务器支持单缓存和多缓存。在单一缓冲中,损坏区域被渲染到屏幕外表面,并被小块显示到前缓冲。屏幕外表面用于避免闪烁。默认情况下,Weston服务器以单个缓冲启动。
在多重缓冲中,不是渲染到屏幕外,而是将受损区域渲染到后台缓冲区并进行翻转,但帧率将受到显示率的限制。最多支持三个缓冲区。
在启动Weston服务器之前,导出FB_MULTI_BUFFER来控制要使用的缓冲区数量。
单个缓冲的环境变量:
export FB_MULTI_BUFFER=1
双缓冲的环境变量:
export FB_MULTI_BUFFER=2
5.2.5运行Weston
运行Weston需要执行如下操作:
Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "freetype"
Load "glx"
Load "dri"
EndSection
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
Option "XkbRules" "xorg"
EndSection
Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
EndSection
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
Driver "vivante"
Option "fbdev" "/dev/fb0"
Option "vivante_fbdev" "/dev/fb0"
Option "HWcursor" "false"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Your Accelerated Framebuffer Device"
DefaultDepth 24
EndSection
Section "DRI"
Mode 0666
EndSection
强制性的字符串
以下是Vivante X驱动程序识别的一些重要条目。
设备标识符和屏幕设备字符串
设备部分中的必选标识符条目指定与此图形设备相关联的唯一名称。
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
下面的条目将特定的图形设备绑定到屏幕上。设备标识符字符串必须与xorg.conf文件的屏幕部分中的设备字符串匹配。例如:
Section "Screen"
Identifier "Default Screen"
<other entries>
Device "Your Accelerated Framebuffer Device"
<other entries>
EndSection
设备驱动程序的字符串
必须的Driver条目指定可加载的Vivante X驱动程序的名称。
驱动“vivante”
设备fbdevPath字符串
必选条目fbdev和vivante_dev指定了要使用的帧缓冲区设备的路径。
Section "Device"
Identifier "Your Accelerated Framebuffer Device"
Driver "vivante"
Option "fbdev" "/dev/fb0"
Option "vivante_fbdev" "/dev/fb0"
<other entries>
EndSection
5.3.9在Yocto上设置X-Windows系统加速
先决条件:
•xserver-xorg-video-imx-viv-(ver).tar.gz,基于GPU驱动的Vivante EXA插件源代码
•drm-update-arm.patch添加了libdrm xf86drm.h的Arm锁实现。注意,来自libdrm的原始xh86drm.h头文件没有支持Arm架构的锁。该补丁位于社区Yocto Project layers Yocto build/sources/meta-freescale/recipes-graphics/drm/libdrm/mx6中,如下图所示:
drm-update-arm.patch:
+#elif defined(__arm__)
+ #undef DRM_DEV_MODE
+ #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
+
+ #define DRM_CAS(lock,old,new,__ret) \
+ do { \
+ __asm__ __volatile__ ( \
+ "1: ldrex %0, [%1]\n" \
+ " teq %0, %2\n" \
+ " strexeq %0, %3, [%1]\n" \
+ : "r" (__ret) \
+ : "r" (lock), "r" (old), "r" (new) \
+ : "cc","memory"); \
+ } while (0)
+
#endif /* architecture */
#endif /* __GNUC__ >= 2 */
构建和安装说明:
•在Yocto环境中,在适当的位置和正确的配方安装必备模块或补丁。
•使用正确的drm头文件(xf86drm.h)构建XServer。目的是创建正确的dri模块
•使用’ bitbake xf86-video-imxfb-vivante '命令构建GPU EXA模块。vivante_drv.so将与成功的构建一起生成,然后将其与xorg和libdri库一起安装在/usr/lib/xorg/modules中的目标板rootfs中/
•在目标板rootfs中安装预yocto构建的imx-gpu-viv二进制文件。为了加速X11,需要X11后端
•现在准备在目标板上运行X11应用程序。
注意:如果不使用Arm核心版本xf86drm.h, x11应用程序将关闭。
5.3.10 X Window系统加速设置
•安装适合您平台的任何软件包。
•检查设备文件/dev/galcore是否存在。
•检查/etc/X11/xorg.conf文件是否包含了上一节中描述的正确条目。
•假设上述步骤已经执行,执行以下操作来验证X Window系统加速确实在运行。
•检查日志文件/var/log/Xorg.0.log,确认存在以下行。
[ 41.752] (II) Loading /usr/lib/xorg/modules/drivers/vivante_drv.so
[ 41.752] (II) VIVANTE(0): using default device
[ 41.752] (II) VIVANTE(0): Creating default Display subsection in Screen section
"Default Screen" for depth/fbbpp 24/32
[ 41.752] (**) VIVANTE(0): Depth 24, (--) framebufferbpp 32
[ 41.752] (==) VIVANTE(0): RGB weight 888
[ 41.752] (==) VIVANTE(0): Default visual is TrueColor
[ 41.753] (==) VIVANTE(0): Using gamma correction (1.0, 1.0, 1.0)
[ 41.753] (II) VIVANTE(0): hardware: DISP3 BG (video memory: 8100kB)
[ 41.753] (II) VIVANTE(0): checking modes against framebuffer device...
[ 41.753] (II) VIVANTE(0): checking modes against monitor...
[ 41.753] (--) VIVANTE(0): Virtual size is 1920x1080 (pitch 1920)
[ 41.753] (**) VIVANTE(0): Built-in mode "current": 148.5 MHz, 67.5 kHz, 60.0 Hz
[ 41.753] (II) VIVANTE(0): Modeline "current"x0.0 148.50 1920 2008 2052 2200 1080
1084 1089 1125 +hsync +
vsync -csync (67.5 kHz)
[ 41.753] (==) VIVANTE(0): DPI set to (96, 96)
[ 41.753] (II) Loading sub module "fb"
[ 41.753] (II) LoadModule: "fb"
[ 41.754] (II) Loading /usr/lib/xorg/modules/libfb.so
[ 41.755] (II) Module fb: vendor="X.Org Foundation"
[ 41.755] compiled for 1.10.4, module version = 1.0.0
[ 41.755] ABI class: X.Org ANSI C Emulation, version 0.4
[ 41.755] (II) Loading sub module "exa"
[ 41.755] (II) LoadModule: "exa"
[ 41.756] (II) Loading /usr/lib/xorg/modules/libexa.so
[ 41.756] (II) Module exa: vendor="X.Org Foundation"
[ 41.756] compiled for 1.10.4, module version = 2.5.0
[ 41.756] ABI class: X.Org Video Driver, version 10.
[ 41.756] (--) Depth 24 pixmap format is 32 bpp
[ 41.797] (II) VIVANTE(0): FB Start = 0x33142000 FB Base = 0x33142000 FB Offset = (nil)
[ 41.797] (II) VIVANTE(0): test Initializing EXA
[ 41.798] (II) EXA(0): Driver allocated offscreenpixmaps
[ 41.798] (II) EXA(0): Driver registered support for the following operations:
[ 41.798] (II) Solid
[ 41.798] (II) Copy
[ 41.798] (II) Composite (RENDER acceleration)
[ 41.798] (II) UploadToScreen
[ 42.075] (==) VIVANTE(0): Backing store disabled
[ 42.084] (==) VIVANTE(0): DPMS enabled
5.3.11故障排除