Android FM 外部播放功能(EZ FM),使用外部短天线搜台,默认FM是不支持外部功放播放功能的,因为硬件上需要FM天线低噪放大器的支持。
硬件原理
原理图:
默认使用耳机当做天线。
如果硬件上支持天线低噪放大器,原理图:
查找FM的代码,分析如何打开这个功能,因为在MTK平台只需要在projectconfig.mk中打开:MTK_FM_SHORT_ANTENNA_SUPPORT=yes就打开这个功能,在FM驱动中使能天线就可以了。
软件流程
展讯9820w配置方法肯定是不一样的,通过查找代码分析:
1、FM的APP使用到了FMPlay
Z:\project\hk811\idh.code\packages\apps\FMPlayer\src\com\thunderst\radio\FMPlay.java
2、FM的APP使用到了FMplayService
Z:\project\hk811\idh.code\packages\apps\FMPlayer\src\com\thunderst\radio\FMplayService.java
检索ro.device.support.antenna
所以可以大概领悟到,ro.device.support.antenna貌似是支持短天线的配置。
检索其他项目有没有使用该功能的项目:
仿照sp9820a_1c10_native.mk在sp9820w_6c10.mk增加ro.device.support.antenna=true
然后全部编译,下载开机,发现FM可以不插耳机打开,但是搜索不到电台,所以该功能已经是打开了的。下一步就是找到FM驱动在切换天线的位置增加是能操作。
在FMplayService.java中有切换天线的服务:
继续寻找
3、framework 层
Z:\project\hk811\idh.code\frameworks\base\core\java\android\hardware\fm\FmManager.java
4、找到JNI层的代码。
frameworks/base/core/jni/fm/android_hardware_fm.cpp
Z:\project\hk811\idh.code\frameworks\base\core\jni\fm\KTFmImpl.cpp
Z:\project\hk811\idh.code\device\sprd\scx35l\sp9820w_6c10\BoardConfig.mk
5.HAL层代码:
Z:\project\hk811\idh.code\vendor\sprd\partner\trout\libfm\Android.mk
Z:\project\hk811\idh.code\vendor\sprd\partner\trout\libfm\libfm_trout.c
6、下面进入内核层
Z:\project\hk811\idh.code\kernel\arch\arm\configs\sp9820w_6c10_defconfig
查找dts对FM配置:
在Z:\project\hk811\idh.code\kernel\drivers\media\radio\sprd2331\fmdrv_ops.c
在probe中申请gpio:
测试成功可以控制天线使能,插拔耳机FM都可以播放正常。拔掉耳机FM搜索台正常。
可以同步查看串口log查看系统状态。