如何让搭载EM28XX芯片的摄像头在Android 7.1.1(Kernel 3.18)设备上工作?
针对EM28XX摄像头在Android 7.1.1(Kernel 3.18)上的适配方案
结合你在Linux系统上的成功适配经验,Android内核基于Linux架构,所以适配思路和Linaro有共通点,但要兼顾Android特有的系统机制,我给你梳理几个关键步骤和排查点:
一、内核驱动的移植与编译
Android 7.1.1的3.18内核大概率默认未开启EM28XX驱动支持,你可以按以下流程操作:
- 获取你设备对应的Android内核源码(定制设备需联系厂商获取对应分支,通用设备可找公开的内核镜像源码)
- 配置内核选项:
- 进入内核源码目录,执行
make menuconfig打开配置界面 - 依次展开
Device Drivers -> Multimedia support -> Media USB Adapters - 勾选
EM28XX USB Video Capture Devices(建议选模块编译M,方便调试;若需内置则选Y) - 确保依赖的V4L2视频框架选项也已开启
- 进入内核源码目录,执行
- 编译并刷入:
- 若编译为模块,将生成的
em28xx.ko推送到设备/system/lib/modules目录,执行insmod em28xx.ko加载驱动 - 若内置到内核,直接编译boot镜像并刷入设备
- 若编译为模块,将生成的
二、设备节点与权限配置
Android对设备节点的权限管控比普通Linux严格,即使驱动加载成功,也可能因权限问题无法访问:
- 驱动加载后,通过
ls /dev/video*检查是否生成摄像头节点(通常是/dev/video0) - 临时测试权限:执行
chmod 666 /dev/video0,然后尝试访问摄像头 - 永久配置:在设备的
init.rc文件中添加以下内容,重启后生效:chmod 666 /dev/video0 chown system:system /dev/video0 - 应用权限:确保测试应用已申请
CAMERA权限(Android 6.0+需动态申请),若需保存图像还需WRITE_EXTERNAL_STORAGE权限
三、用户空间测试与适配
Linux上的mplayer/xawtv无法直接在Android上使用,你可以用这些方式验证:
- 交叉编译Android版本的
v4l2-ctl工具,推送到设备后执行:v4l2-ctl --list-devices:确认摄像头被系统识别v4l2-ctl --stream-mmap --stream-to=/sdcard/test.yuv:测试捕获视频流
- 编写简易Android应用:
- 对于USB摄像头,需使用
UsbManager枚举设备并申请访问权限 - 可基于第三方USB摄像头库(如移植版
libuvc)快速开发测试代码
- 对于USB摄像头,需使用
四、常见坑点排查
- 内核兼容性:3.18内核的EM28XX驱动可能存在bug,可查看内核更新日志,或从更高版本内核中backport适配3.18的补丁
- USB供电:Android设备USB口供电可能不足,导致摄像头无法启动,可尝试使用带外接电源的USB hub
- SELinux限制:若设备开启SELinux,可能阻止驱动加载或节点访问,可临时执行
setenforce 0关闭测试,再针对性配置SELinux规则
内容的提问来源于stack exchange,提问作者Literator




