【v4l2】在Android SDK中交叉编译v4l2-ctl
为调试Android设备中camera的相关功能,需要引入v4l2-ctl工具。由于厂商提供的Android SDK源码中未集成v4l2-utils(包含v4l2-ctl以及其它组件的工具包),故需要下载v4l2-utils源码,并在Android SDK中交叉编译生成v4l2-ctl可执行文件。本文讲述其过程步骤。
一、下载v4l2-utils源码
https://github.com/gjasny/v4l-utils
二、移植v4l2-ctl到自己的SDK中
# 1. 一般将外部工具包放到Android SDK/external目录下
cd your_android_sdk/external
mkdir v4l-utils
mkdir v4l-utils/utils
# 2. 切换到从github下载的v4l2-utils源码目录
cd v4l-utils
# 切换到stable-1.28分支
git checkout stable-1.28
cp android-config.h your_android_sdk/external/v4l-utils/
cp -r include your_android_sdk/external/v4l-utils/
cp -r utils/common your_android_sdk/external/v4l-utils/utils/
cp -r utils/v4l2-ctl your_android_sdk/external/v4l-utils/utils/
# 3. 移植后的目录结构如下
cd your_android_sdk/external/v4l-utils
tree -L 2
.
├── android-config.h
├── include
│ ├── compiler.h
│ ├── gettext.h
│ ├── linux
│ └── v4l-getsubopt.h
└── utils
├── common
└── v4l2-ctl
5 directories, 4 files
三、修改文件
一共五处修改,如下:
diff --git a/utils/v4l2-ctl/Android.mk b/utils/v4l2-ctl/Android.mk
old mode 100644
new mode 100755
index 3078c62..5987b3d
--- a/utils/v4l2-ctl/Android.mk
+++ b/utils/v4l2-ctl/Android.mk
@@ -6,7 +6,7 @@ LOCAL_MODULE := v4l2-ctl
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -DNO_LIBV4L2
-LOCAL_CFLAGS += -Wno-missing-field-initializers
+LOCAL_CFLAGS += -Wno-missing-field-initializers -Wno-unused-parameter
LOCAL_CFLAGS += -include ../../android-config.h
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../.. \
@@ -15,13 +15,13 @@ LOCAL_C_INCLUDES := \
bionic \
external/stlport/stlport
-LOCAL_SHARED_LIBRARIES := libstlport
+#LOCAL_SHARED_LIBRARIES := libstlport
LOCAL_SRC_FILES := \
- v4l2-ctl.cpp v4l2-ctl.h v4l2-ctl-common.cpp v4l2-ctl-tuner.cpp \
+ v4l2-ctl.cpp v4l2-ctl-common.cpp v4l2-ctl-tuner.cpp \
v4l2-ctl-io.cpp v4l2-ctl-stds.cpp v4l2-ctl-vidcap.cpp v4l2-ctl-vidout.cpp \
v4l2-ctl-overlay.cpp v4l2-ctl-vbi.cpp v4l2-ctl-selection.cpp v4l2-ctl-misc.cpp \
v4l2-ctl-streaming.cpp v4l2-ctl-sdr.cpp v4l2-ctl-edid.cpp v4l2-ctl-modes.cpp \
v4l2-ctl-meta.cpp v4l2-ctl-subdev.cpp v4l2-info.cpp media-info.cpp \
- v4l2-tpg-colors.c v4l2-tpg-core.c v4l-stream.c codec-fwht.c
+ v4l2-tpg-colors.c v4l2-tpg-core.c v4l-stream.c codec-fwht.c codec-v4l2-fwht.c
include $(BUILD_EXECUTABLE)
diff --git a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
old mode 100644
new mode 100755
index 48b7928..6fc3a6a
--- a/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-subdev.cpp
@@ -9,7 +9,7 @@ struct mbus_name {
static const struct mbus_name mbus_names[] = {
{ "Fixed", MEDIA_BUS_FMT_FIXED },
-#include "media-bus-format-names.h"
+//#include "media-bus-format-names.h"
{ nullptr, 0 }
};
四、编译
cd your_android_sdk
source ./build/envsetup.sh
lunch <product_name>-<build_variant>
cd your_android_sdk/external/v4l-utils/
mm
编译成功后会提示:
五、push到设备中运行
1. 列出设备的所有控制项
./v4l2-ctl -d /dev/v4l-subdev7 --list-ctrls
2. 查看 link_frequency、pixel_rate 这两个控制项的值:
./v4l2-ctl -d /dev/v4l-subdev7 --get-ctrl link_frequency
./v4l2-ctl -d /dev/v4l-subdev7 --get-ctrl pixel_rate
3. 设置 sensor_on_off 这一控制项的值为1
./v4l2-ctl -d /dev/v4l-subdev7 --set-ctrl sensor_on_off=1
有些ioctl设备不支持,没关系。
参考:android交叉编译v4l2-ctl_android v4l2-ctl-CSDN博客