OpenIPC开源FPV之重要源码启动配置
1. 源由
在计算机上,程序安装不等于程序启动使用。通常应用软件使用需要通过启动菜单找到程序的启动图标,通过点击操作,打开应用程序。
FPV摄像头默认就是要上电工作,无需过多的人工启动操作。
接下来,我们了解下这些默认源代码都是如何安装和被启动的。
2. 安装
在前面《OpenIPC开源IPC之重要源码包》,已经了解固件最重要的源代码是哪些。
那么接下来就是围绕这个角度,看看软件是如何安装的。
2.1 wfb-ng
define WIFIBROADCAST_INSTALL_TARGET_CMDS
$(INSTALL) -m 0755 -D $(@D)/wfb_tx $(TARGET_DIR)/usr/bin
$(INSTALL) -m 0755 -D $(@D)/wfb_tx_cmd $(TARGET_DIR)/usr/bin
$(INSTALL) -m 0755 -D $(@D)/wfb_rx $(TARGET_DIR)/usr/bin
$(INSTALL) -m 0755 -D $(@D)/wfb_keygen $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
cp $(WIFIBROADCAST_PKGDIR)/files/wfb_$(WIFIBROADCAST_UNIT).conf $(TARGET_DIR)/etc/wfb.conf
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
cp $(WIFIBROADCAST_PKGDIR)/files/wifibroadcast $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
cp $(WIFIBROADCAST_PKGDIR)/files/$(WIFIBROADCAST_UNIT).key $(TARGET_DIR)/etc/$(WIFIBROADCAST_UNIT).key
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
cp $(WIFIBROADCAST_PKGDIR)/files/setmcs $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -d $(TARGET_DIR)/lib/firmware/ath9k_htc
cp $(WIFIBROADCAST_PKGDIR)/files/htc_9271.fw.1 $(TARGET_DIR)/lib/firmware/ath9k_htc
$(INSTALL) -m 755 -d $(TARGET_DIR)/lib/firmware/ath9k_htc
cp $(WIFIBROADCAST_PKGDIR)/files/htc_9271.fw.3 $(TARGET_DIR)/lib/firmware/ath9k_htc
endef
-
可执行文件安装:
$(INSTALL) -m 0755 -D $(@D)/wfb_tx $(TARGET_DIR)/usr/bin $(INSTALL) -m 0755 -D $(@D)/wfb_tx_cmd $(TARGET_DIR)/usr/bin $(INSTALL) -m 0755 -D $(@D)/wfb_rx $(TARGET_DIR)/usr/bin $(INSTALL) -m 0755 -D $(@D)/wfb_keygen $(TARGET_DIR)/usr/bin
- 这里将
wfb_tx
、wfb_tx_cmd
、wfb_rx
、wfb_keygen
这些可执行文件安装到目标系统的/usr/bin
目录。 -m 0755
设置文件权限为可执行,-D
确保创建所需目录。
- 这里将
-
配置文件安装:
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc cp $(WIFIBROADCAST_PKGDIR)/files/wfb_$(WIFIBROADCAST_UNIT).conf $(TARGET_DIR)/etc/wfb.conf
- 这里创建了
/etc
目录,并复制了配置文件wfb_$(WIFIBROADCAST_UNIT).conf
到/etc/wfb.conf
。 - 注意:
cp
替代$(INSTALL)
,可能导致没有自动处理目标目录不存在的情况,可以优化为使用$(INSTALL)
完成复制操作。
- 这里创建了
-
额外可执行文件安装:
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin cp $(WIFIBROADCAST_PKGDIR)/files/wifibroadcast $(TARGET_DIR)/usr/bin cp $(WIFIBROADCAST_PKGDIR)/files/setmcs $(TARGET_DIR)/usr/bin
- 这些命令将
wifibroadcast
和setmcs
文件复制到目标的/usr/bin
。
- 这些命令将
-
密钥文件安装:
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc cp $(WIFIBROADCAST_PKGDIR)/files/$(WIFIBROADCAST_UNIT).key $(TARGET_DIR)/etc/$(WIFIBROADCAST_UNIT).key
- 该命令将密钥文件复制到
/etc/
目录中。
- 该命令将密钥文件复制到
-
固件安装:
$(INSTALL) -m 755 -d $(TARGET_DIR)/lib/firmware/ath9k_htc cp $(WIFIBROADCAST_PKGDIR)/files/htc_9271.fw.1 $(TARGET_DIR)/lib/firmware/ath9k_htc cp $(WIFIBROADCAST_PKGDIR)/files/htc_9271.fw.3 $(TARGET_DIR)/lib/firmware/ath9k_htc
- 这里是将固件文件
htc_9271.fw.1
和htc_9271.fw.3
复制到固件目录lib/firmware/ath9k_htc
。
- 这里是将固件文件
2.2 datalink
define DATALINK_INSTALL_TARGET_CMDS
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
$(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(DATALINK_PKGDIR)/files/datalink.conf
$(INSTALL) -m 644 $(DATALINK_PKGDIR)/files/telemetry_$(DATALINK_UNIT).conf $(TARGET_DIR)/etc/telemetry.conf
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d
$(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(DATALINK_PKGDIR)/files/S98datalink
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(DATALINK_PKGDIR)/files/telemetry
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(DATALINK_PKGDIR)/files/tweaksys
endef
-
创建
/etc
目录并安装配置文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(DATALINK_PKGDIR)/files/datalink.conf $(INSTALL) -m 644 $(DATALINK_PKGDIR)/files/telemetry_$(DATALINK_UNIT).conf $(TARGET_DIR)/etc/telemetry.conf
- 创建
/etc
目录:-d
选项确保目标目录存在,权限为755
。 - 安装
datalink.conf
:将datalink.conf
文件从指定目录复制到目标/etc
目录,权限为644
。 - 安装
telemetry.conf
:将telemetry_$(DATALINK_UNIT).conf
文件复制到目标/etc
,并重命名为telemetry.conf
,权限为644
。
- 创建
-
创建
/etc/init.d
目录并安装启动脚本:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(DATALINK_PKGDIR)/files/S98datalink
- 创建
/etc/init.d
目录:为放置启动脚本准备目录,权限为755
。 - 安装启动脚本:将
S98datalink
文件复制到/etc/init.d
目录,权限为755
。
- 创建
-
创建
/usr/bin
目录并安装可执行文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(DATALINK_PKGDIR)/files/telemetry $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(DATALINK_PKGDIR)/files/tweaksys
- 创建
/usr/bin
目录:为安装可执行文件创建目录,权限为755
。 - 安装可执行文件:将
telemetry
和tweaksys
文件复制到目标/usr/bin
目录中,权限为755
,允许所有用户执行。
- 创建
2.3 *mavfwd
define MAVFWD_INSTALL_TARGET_CMDS
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
$(INSTALL) -m 0755 -D $(@D)/mavfwd $(TARGET_DIR)/usr/bin/mavfwd
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/sbin
cp $(MAVFWD_PKGDIR)/files/channels.sh $(TARGET_DIR)/usr/sbin
endef
-
创建
/usr/bin
目录并安装可执行文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 0755 -D $(@D)/mavfwd $(TARGET_DIR)/usr/bin/mavfwd
- 创建
/usr/bin
目录:使用-d
选项确保目标目录存在,权限为755
(所有者可以读、写、执行,其他用户可以读和执行)。 - 安装可执行文件:
mavfwd
可执行文件被复制到目标/usr/bin
目录,权限为0755
(所有者可以读、写、执行,其他用户可以读和执行)。-D
选项会自动创建目标目录(在这里是冗余的,因为目录已创建)。
- 创建
-
创建
/usr/sbin
目录并安装脚本:$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/sbin cp $(MAVFWD_PKGDIR)/files/channels.sh $(TARGET_DIR)/usr/sbin
- 创建
/usr/sbin
目录:使用-d
选项确保目标目录存在,权限为755
。 - 安装
channels.sh
脚本:通过cp
命令将channels.sh
文件从指定目录复制到目标/usr/sbin
目录,权限在这里没有指定,默认保留原文件的权限。
- 创建
2.4 *mavlink-router
define MAVLINK_ROUTER_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) DESTDIR=$(TARGET_DIR) ninja -C $(@D)/build install
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
cp $(MAVLINK_ROUTER_PKGDIR)/files/mavlink_$(MAVLINK_ROUTER_UNIT).conf $(TARGET_DIR)/etc/mavlink.conf
# $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d
# cp $(MAVLINK_ROUTER_PKGDIR)/files/S97mavlink $(TARGET_DIR)/etc/init.d
endef
-
构建和安装 MAVLink Router:
$(TARGET_MAKE_ENV) DESTDIR=$(TARGET_DIR) ninja -C $(@D)/build install
- 使用 Ninja 构建系统:这条命令使用 Ninja 工具来构建和安装 MAVLink Router。
- 设置环境变量:
$(TARGET_MAKE_ENV)
是一个可能定义了构建环境的变量,用于指定目标系统的环境。 - 目标目录:
DESTDIR=$(TARGET_DIR)
指定安装路径。 - 构建目录:
-C $(@D)/build
表示切换到构建目录,并执行install
命令。
-
创建
/etc
目录并安装配置文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc cp $(MAVLINK_ROUTER_PKGDIR)/files/mavlink_$(MAVLINK_ROUTER_UNIT).conf $(TARGET_DIR)/etc/mavlink.conf
- 创建
/etc
目录:使用-d
选项确保目标目录存在,权限为755
。 - 安装配置文件:将
mavlink_$(MAVLINK_ROUTER_UNIT).conf
文件从指定目录复制到目标/etc
目录,并重命名为mavlink.conf
,权限没有指定(将保持原文件权限)。
- 创建
-
注释的启动脚本安装:
# $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d # cp $(MAVLINK_ROUTER_PKGDIR)/files/S97mavlink $(TARGET_DIR)/etc/init.d
- 注释的代码:这部分代码是被注释掉的,表示原本计划安装一个启动脚本
S97mavlink
到/etc/init.d
目录,但目前未执行。
- 注释的代码:这部分代码是被注释掉的,表示原本计划安装一个启动脚本
2.5 majestic
define MAJESTIC_INSTALL_TARGET_CMDS
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
$(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/majestic.yaml
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d
$(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(MAJESTIC_PKGDIR)/files/S95majestic
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/majestic
endef
-
创建
/etc
目录并安装配置文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/majestic.yaml
- 创建
/etc
目录:-d
选项确保目标目录存在,权限为755
(所有者可以读、写、执行,其他用户只读、执行)。 - 安装配置文件:
majestic.yaml
被复制到目标目录/etc
,权限为644
(所有者可以读、写,其他用户只读)。-t $(TARGET_DIR)/etc
表示将目标路径作为目录。
- 创建
-
创建
/etc/init.d
目录并安装启动脚本:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(MAJESTIC_PKGDIR)/files/S95majestic
- 创建
/etc/init.d
目录:为放置启动脚本准备目录,权限为755
。 - 安装启动脚本:
S95majestic
文件被复制到/etc/init.d
目录中,权限为755
,允许所有用户执行该脚本。
- 创建
-
创建
/usr/bin
目录并安装可执行文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/majestic
- 创建
/usr/bin
目录:为安装可执行文件创建目录,权限为755
。 - 安装可执行文件:
majestic
可执行文件被复制到/usr/bin
目录中,权限为755
,使得任何用户都可以执行该文件。
- 创建
2.6 *vdec-openipc
define VDEC_OPENIPC_INSTALL_TARGET_CMDS
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d
$(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(VDEC_OPENIPC_PKGDIR)/files/S98vdec
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
$(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(VDEC_OPENIPC_PKGDIR)/files/vdec.conf
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/vdec/vdec
endef
-
创建
/etc/init.d
目录并安装启动脚本:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(VDEC_OPENIPC_PKGDIR)/files/S98vdec
- 创建
/etc/init.d
目录:使用-d
选项确保目标目录存在,权限为755
(所有者可以读、写、执行,其他用户可以读和执行)。 - 安装启动脚本:将
S98vdec
文件从指定目录复制到目标/etc/init.d
目录,权限为755
(所有者可以读、写、执行,其他用户可以读和执行)。
- 创建
-
创建
/etc
目录并安装配置文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(VDEC_OPENIPC_PKGDIR)/files/vdec.conf
- 创建
/etc
目录:使用-d
选项确保目标目录存在,权限为755
。 - 安装配置文件:将
vdec.conf
文件从指定目录复制到目标/etc
目录,权限为644
(所有者可以读和写,其他用户可以读)。
- 创建
-
创建
/usr/bin
目录并安装可执行文件:$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/vdec/vdec
- 创建
/usr/bin
目录:使用-d
选项确保目标目录存在,权限为755
。 - 安装可执行文件:将
vdec
可执行文件从源目录复制到目标/usr/bin
目录,权限为755
。
- 创建
3. 启动
Linux系统启动过程是比较复杂的,这里不是专门针对Linux启动过程的,大家可以去网上搜索,大致可以分几个阶段:
- BIOS/UEFI:硬件初始化并加载引导加载器。
- 引导加载器:如 GRUB,加载内核并传递启动参数。
- 内核加载:内核初始化硬件并挂载根文件系统。
- init 进程:启动用户空间的第一个进程,管理服务启动。
- 服务启动:init 系统(如 systemd)根据配置文件启动所有必需的系统服务。
- 用户登录:提供登录界面,允许用户进入系统。
- 用户会话启动:加载用户配置文件,启动用户空间应用。
不过OpenIPC是嵌入式小系统,所以并没有这么复杂的过程,大体上就是U-Boot + Kernel load + init + 服务(如果配置的话)
而这里所讨论的主要开源软件包的启动,基本上都是在init阶段。
init
└──> etc/inittab
└──> etc/init.d/rcS
└──> etc/init.d/S*
3.1 init配置文件
# Run rc scripts
::sysinit:/etc/init.d/rcS
3.2 rcS启动脚本
for i in /etc/init.d/S??*; do
[ ! -f "$i" ] && continue
case "$i" in
*)
$i start
;;
esac
done
4. 总结
注:主要将重点的摘录出来,一般的就不再展开。
预设条件:
- IMX415
- SSC338Q
- Hi3536DV100
4.1 天空端启动
天空端主要是FPV摄像头,负责视频采集,飞控数据链路。
/etc/init.d/rcS
├──> S30customizer
│ ├──> /usr/share/openipc/customizer.sh
│ └──> sh /usr/share/openipc/wireless.sh
├──> S98datalink
│ ├──> tweaksys ssc33x // configure majestic, h265, 1080p, udp://127.0.0.1:5600
│ └──> wifibroadcast start
│ ├──> [video] // udp_port == 5600
│ │ └──> wfb_tx -p "$stream" -u "$udp_port" -R "$rcv_buf" -K "$keydir/$unit.key" -B "$bandwidth" \
│ │ -M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
│ │ -T "$pool_timeout" -i "$link_id" -f "$frame_type" -C 8000 "$wlan" > /dev/null &
│ └──> telemetry start // telemetry_rx == wfb_rx, telemetry_tx == wfb_tx, port_rx == 14551, port_tx == 14550
│ ├──> mavfwd --channels "$channels" --master "$serial" --baudrate "$baud" -p 100 -t -a "$aggregate" \
│ │ --out 127.0.0.1:$port_tx --in 127.0.0.1:$port_rx > /dev/null &
│ ├──> telemetry_rx -p "$stream_rx" -u "$port_rx" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
│ └──> telemetry_tx -p "$stream_tx" -u "$port_tx" -K "$keydir/$unit.key" -B "$bandwidth" \
│ -M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
│ -T "$pool_timeout" -i "$link_id" -f "$frame_type" "$wlan" > /dev/null &
└──> S95majestic
4.2 地面端启动
地面端主要是视频显示,以及OSD数据显示。
/etc/init.d/rcS
├──> S30customizer
│ ├──> /usr/share/openipc/customizer.sh
│ └──> sh /usr/share/openipc/wireless.sh
├──> S98datalink
│ └──> wifibroadcast start
│ ├──> [video] // udp_port == 5600
│ │ └──> wfb_rx -c "$udp_addr" -u "$udp_port" -p "$stream" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
│ └──> telemetry start // telemetry_rx == wfb_rx, telemetry_tx == wfb_tx, port_rx == 14551, port_tx == 14550
│ ├──> mavlink-routerd -c /etc/mavlink.conf > /dev/null 2>&1 &
│ ├──> telemetry_tx -p "$stream_tx" -u "$port_tx" -K "$keydir/$unit.key" -B "$bandwidth" \
│ │ -M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
│ │ -T "$pool_timeout" -i "$link_id" -f "$frame_type" "$wlan" > /dev/null &
│ └──> telemetry_rx -p "$stream_rx" -u "$port_rx" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
└──> S98vdec
├──> [simple] vdec -p ${port} -d ${format} -c ${codec} -m ${mode} --mavlink-port ${mavlink_port} ${osd_variant} ${extra} > /dev/null 2>&1 &
└──> [custom] osd > /dev/null 2>&1 &
4.3 OSD配置
OSD界面可以配置两种类型:
注:默认simple情况是vdec。
5. 参考资料
【1】Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考
【2】OpenIPC开源FPV之工程编译
【3】OpenIPC开源FPV之工程框架
【4】OpenIPC开源FPV之重要源码包
6 附录
在 $(INSTALL) -m 755 -D $(@D)/majestic $(TARGET_DIR)/usr/bin/majestic
中,$(@D)
是 GNU Make 中的自动变量。
$@
:代表规则中目标文件的完整名称(即,Makefile 中目标的名字)。$(@D)
:表示$@
所在的目录部分,等效于dirname $@
。它提取出目标文件的目录路径,不包括文件名。
因此,$(@D)
是将当前目标的路径部分取出,用于定位源文件所在的目录。在这个上下文中,$(@D)/majestic
可能指向构建过程中的某个中间目录,majestic
可执行文件就位于该目录下。
举例:
假设 Makefile 目标是 /path/to/output/majestic
,则:
$@
:代表/path/to/output/majestic
。$(@D)
:代表/path/to/output
,即目标文件的目录路径。
因此,$(@D)/majestic
指的是 /path/to/output/majestic
,用于安装可执行文件。