基于iTop4412的FM收音机系统设计(二)

发布者:钱币之歌最新更新时间:2022-02-09 来源: eefocus关键字:iTop4412  收音机系统 手机看文章 扫描二维码
随时随地手机看文章

说明:第一版架构为:APP+JNI(NDK)+Driver(linux),优点是开发简单,周期短,也作为自己的毕业设计


现在更新第二版,FM服务完全植入Android系统中,成为系统服务,架构为:APP+Frameworks+JNI+HAL+Driver


整个系统设计,大致分为三篇文章介绍完毕,包括:


一、驱动设计篇


二、系统API接口篇


三、APP功能实现篇


---------------------------------------------------(二)系统接口篇-----------------------------------------------------------------


说明:关于系统接口,在FM系统中完全用不到这么复杂的流程,我这里是想把整个系统调用流程捋顺,所以使用了Frameworks(AIDL)->JNI->HAL


1.Frameworks


1.1.首先我们需设计好暴露给APP端的API接口,这里我们采用aidl的机制实现


进入到frameworks/base/core/java/android/os目录下,新建IFMService.aidl文件


 1 package android.os;  

 2    

 3 interface IFMService {  

 4     int getADC();

 5     int getFreq();

 6     void setFreq(int freq);

 7     void searchNextorPreFreq(int enable);

 8     void setNextorPreFreq(int enable);

 9     void enableMute(int enable);

10     int getIsMute();

11     void startAutoSearch();

12 }  


1.2.回到frameworks/base目录,编写编译规则,生成Stub接口文件


打开Android.mk文件,在LOCAL_SRC_FILES属性中添加


1 LOCAL_SRC_FILES +=

2 ...

3 core/java/android/os/IFMService.aidl

4 ...


1.3.在frameworks/base目录下,使用mm命令编译IFMService.aidl生成IHelloService.Stub,在使用mm目录之前需要lunch系统的编译环境


Stub实质上就是binder通信,client<-->proxy<-->stub<-->service


1.4.进入到frameworks/base/services/java/com/android/server,新建FMService.java文件,继承IHelloService.Stub并实现接口函数


 1 package com.android.server;  

 2 

 3 import android.content.Context;  

 4 import android.os.IFMService;  

 5 import android.util.Slog; 

 6  

 7 public class FMService extends IFMService.Stub {  

 8 

 9     private static final String TAG = "FMService";  

10 

11     FMService() {  

12         Slog.d(TAG,"FM init...");

13         init_native();

14     }

15 

16     public int getADC(){

17         

18         return getADC_native();

19     }

20 

21     public int getFreq(){

22         return getFreq_native();

23     }

24 

25     public void setFreq(int freq){

26         

27         setFreq_native(freq);

28         return ;

29     }

30 

31     public void searchNextorPreFreq(int enable){

32         

33         searchNextorPreFreq_native(enable);

34         return ;

35     }

36       

37     public void setNextorPreFreq(int enable){

38         

39         setNextorPreFreq_native(enable);

40         return ;

41     }

42 

43     public void enableMute(int enable){

44         

45         enableMute_native(enable);

46         return ;

47     }

48 

49     public int getIsMute(){

50         return getIsMute_native();

51     }

52 

53     public void startAutoSearch(){

54         

55         startAutoSearch_native();

56         return ;

57     }

58 

59     private static native boolean init_native();  

60     private static native int getADC_native();

61     private static native int getFreq_native();  

62     private static native void setFreq_native(int freq);

63     private static native void searchNextorPreFreq_native(int enable);  

64     private static native void setNextorPreFreq_native(int enable);

65     private static native void enableMute_native(int enable);  

66     private static native int getIsMute_native();

67     private static native void startAutoSearch_native(); 

68 

69 };  


在这个文件中,我们把函数调用传递到了JNI


1.5.最后在Frameworks中我们需要启动我们的FMservice


进入frameworks/base/services/java/com/android/server目录,在SystemServer.java文件中添加


 1 class ServerThread extends Thread {

 2     @Override

 3     public void run() {

 4         if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

 5             try {

 6                 Slog.i(TAG, "DiskStats Service");

 7                 ServiceManager.addService("diskstats", new DiskStatsService(context));

 8             } catch (Throwable e) {

 9                 reportWtf("starting DiskStats Service", e);

10             }

11             try {

12 

13                   Slog.i(TAG, "FM Service");

14 

15                   ServiceManager.addService("fm5767", new FMService());

16 

17             } catch (Throwable e) {

18 

19                   Slog.e(TAG, "Failure starting FM Service", e);

20 

21             }  

22         }

23     }

24 }


1.6.编译service(若修改了service的实现方法可模块编译service模块)


进入frameworks/base/services/java,使用命令mm进行编译,在out目录下的system/frameworks下生成services.jar,使用adb直接cp到板子上重启即可生效


2.JNI


2.1.实现JNi函数,函数传递到HAL层


进入frameworks/base/services/jni目录,新建com_android_server_FMService.cpp文件


  1 #define LOG_TAG "FMService_jni"  

  2 #include "jni.h"  

  3 #include "JNIHelp.h"  

  4 #include "android_runtime/AndroidRuntime.h"  

  5 #include   

  6 #include   

  7 #include   

  8 #include   

  9 #include  

 10 

 11 namespace android  

 12 {  

 13     /*在硬件抽象层中定义的硬件访问结构体,参考*/  

 14     struct tea5767_device_t* tea5767_device = NULL;  

 15 

 16     //访问硬件的接口

 17     static jint tea5767_getADC(JNIEnv* env, jobject clazz){

 18         int adc = 0;

 19         if(!tea5767_device){

 20             LOGE("FM jni is not open..");

 21             return adc;

 22         }

 23         adc = tea5767_device->getADC(tea5767_device);

 24         LOGI("get fm adc = %d",adc);

 25 

 26         return adc;

 27     }

 28 

 29     static jint tea5767_getFreq(JNIEnv* env, jobject clazz){

 30         int freq = 0;

 31         if(!tea5767_device){

 32             LOGE("FM jni is not open..");

 33             return freq;

 34         }

 35         freq = tea5767_device->getFreq(tea5767_device);

 36         LOGI("get fm freq = %d",freq);

 37 

 38         return freq;

 39     }

 40 

 41     static void tea5767_setFreq(JNIEnv* env, jobject clazz, jint freq){

 42 

 43         if(!tea5767_device){

 44             LOGE("FM jni is not open..");

 45             return ;

 46         }

 47         tea5767_device->setFreq(tea5767_device,freq);

 48         LOGI("set fm freq = %d",freq);

 49 

 50         return ;

 51     }

 52 

 53     static void tea5767_searchNextorPreFreq(JNIEnv* env, jobject clazz, jint enable){

 54 

 55         if(!tea5767_device){

 56             LOGE("FM jni is not open..");

 57             return ;

 58         }

 59         tea5767_device->searchNextorPreFreq(tea5767_device,enable);

 60         LOGI("searchNextorPreFreq state = %d",enable);

 61 

 62         return ;

 63     }

 64 

 65     static void tea5767_setNextorPreFreq(JNIEnv* env, jobject clazz, jint enable){

 66 

 67         if(!tea5767_device){

 68             LOGE("FM jni is not open..");

[1] [2] [3] [4]
关键字:iTop4412  收音机系统 引用地址:基于iTop4412的FM收音机系统设计(二)

上一篇:基于iTop4412的FM收音机系统设计(一)
下一篇:基于iTop4412的FM收音机系统设计(三)

推荐阅读最新更新时间:2024-11-17 02:53

使用STM32调试FMSDR模块及解调FM电台(3)
3. 调试8027使其发出单音FM信号 3.1 输出24Mhz和验证I2C接口 1. 硬件连接 将FM_SDR板卡和STM32H750开发板连接。 本文中所有例子中我们都仅给MSI001使用天线,因为QN8027离得很近,发射端不需要使用天线 本程序中操作的管脚如下描述: 2. PWM输出24MHz QN8027芯片需要输入24MHz的时钟作为参考信号,在这里通过STM32H750的TIMER2产生24M的方波,提供给QN8027作为输入参考信号。 PWM信号的关键参数是频率和占空比,我们分别看一下如何设定TIM2来确定输出PWM的频率和占空比: PWM的输出频率=计数器计数频率/(计数器的计数上限+1),计数器计数频
[单片机]
使用STM32调试FMSDR模块及解调<font color='red'>FM</font>电台(3)
苹果砍掉FM功能惹众怒:你还会听电台吗?
话又说回来,大家现在还会用手机上的FM功能吗? 关于智能手机上FM功能的去留争议其实由来已久,在移动互联网和数据流量的利益驱使下,智能手机厂商和网络营运商早已联手禁用手机中的FM功能,虽然仍有不少手机搭载FM调频功能,但其中也有不少默认禁用该功能的机型。 事实上,手机上的FM调频功能并不是靠一个独立的芯片实现的,而是通过内置的一个通用无线通讯芯片,同时兼顾WiFi、蓝牙和FM调频收音接收功能。 不过现在手机内部空间寸土尺金,为了腾出更多空间,元器件的大小可能会进一步压缩,去掉多余的功能以换取更高的空间利用率也就无可厚非了。 除了少数的电台爱好者,以及开车的时候会偶尔调开电台解解闷外,AM/FM这两个词真的离我们的生
[手机便携]
FM20L08型铁电存储器的原理及应用
1 引言 在一些需要下位机单独工作的场合(如汽车行驶记录仪、高速存储测试设备等),其数据的高速存储和掉电不丢失尤为重要,Ramtron公司推出的FM20L08型非易失性铁电存储器除具有其他铁电存储器的一般特点外,弥补了已有铁电存储器存储量小的缺点,其数据存储量达1MB,可完全代替标准异步静态随机存储器(SRAM)。 2 FM20L08的特点和引脚功能 FM20L08型非易失性铁电存储器的存储容量为128K×8位,和无限次擦写,掉电后数据可保存10年,工作电压为3V,最大功耗电流为22mA,采用32引脚TSOP型封装,图1示出FM20L08的引脚排列,表1示出FM20L08的主要引脚功能。 ? FM
[应用]
CDMA/FM接收AGC和解调器芯片RF9957及其应用
    摘要: RF9957是RF Micro Device公司生产的带接收AGC的CDMA/FM解调器芯片。该芯片中集成了完整的中频自动增益控制(AGC)放大器和正交解调器,可用于双模式CDMA/FM蜂窝移动通信系统和PCS系统中。文中介绍了RF9957的原理、特点和典型应用电路。     关键词: 解调器 移动通信 CDMA AGC RF9957 1 概述 RF Micro Device公司在其生产的芯片RF9957中集成了完整的中频自动增益控制(AGC)放大器和正交解调器。这使得RF9957可用于双模式的CDMA/FM蜂窝移动通信系统和PCS系统中。该芯片在对接收IF信号进行放大时,可提供
[应用]
FM2822采用16引脚DIP封装,调光采用相位检测方案
FM2822是具有自主产权的可调光荧光灯电子镇流器专用集成电路(ASIC)。采用16引脚DIP封装,调光采用相位检测方案,通过改变脉宽和频率实现灯功率调节,从而改变灯亮度,达到节能目的。 电路如下图所示,L1和C1、C2组成EMI 滤波器 ,IC的⑨脚(G1)与(11)脚(G2)内部的栅极驱动器和外部变压器T1及半桥开关V1、V2等组成半桥逆变器电路,T2的初级电感L2-1和C13组成LC串联谐振电路,R12、R13、R14和D7、C12组成灯电压检测电路,T3、R16、R17与R18、R7分别组成灯电流相位采样和灯电流采样电路,R1、R2和R3、R4、RP1、C4组成调光电路。 电路的工作原理如下: 1.启动     在系统
[模拟电子]
Cortex突破日系MCU阵营防线,富士通FM3欲抢占电机控制应用先机
11月初,富士通半导体继东芝半导体之后也正式宣布采用ARM Cortex-M3内核的FM3系列MCU面市,并一口气推出44款产品型号。与东芝不同的是,富士通对新款Cortext-M3 MCU的宣传显得更为高调。一贯以专用内核为主的日系MCU供应商阵营是否会由此转向通用RSIC微控制器内核,引发业界广泛关注。 ARM内核一贯以其良好的产业生态系统(在全球拥有700多家第三方供应商)和低功耗而着称,而随着32位Cortex MCU不断向“亚1美元”价位逼近,它们在替代8位、16位MCU的战役中捷报频传。这正是富士通半导体开始布局通用内核MCU的主要原因之一。“我们看到了市场对Cortex的需求,随着产品研发周期日益缩短,客户希望采
[工业控制]
AM/FM汽车天线的一个参考设计(RD)介绍
引言 本应用笔记介绍AM/FM汽车天线的一个参考设计(RD)。设计采用了适用于有源天线模块的高度集成AM/FM低噪声放大器(LNA) MAX2180。LNA在AM和FM信号通路上均集成了Maxim的自动增益控制技术,带有用户可选设置点。AM和FM信号通路的最大增益亦可变,以满足各种各样的用户需求。RD详尽展示了该集成式汽车解决方案的灵活性和性能。 概述 汽车天线要求更小、集成度更高的解决方案,并同时保证现代AM/FM无线通信装置所需的高性能。有些解决方案需要自动增益控制(AGC),而有些则采用固定增益LNA,以获得最低成本。有些解决方案为有源天线提供一个稳压电源电压,但是大多数仍然采用电池供电。对天线方案提供商的挑战是
[嵌入式]

推荐帖子

晒晒我昨天做的万年历
首先感谢一下版主和管理员给我提供的帮助,谢谢!昨天忙了一天终于把电子万年历做出来了,传上来和大家分享。做了花时间嘻嘻收大家1芯币 晒晒我昨天做的万年历赞一个不错加油加油回复楼主08221034的帖子谢谢管理员夸奖速度还是很快滴HOHO回复板凳08221034的帖子呵呵管理员您是女孩还是男孩我想你的单片机一定很厉害顶顶,加油。用的DS-18B20数字温度传感器阿不错不错。顶顶。不错啊,继续努力啊不错的设计,加油。是的呵呵
08221034 单片机
DSP 的图像显示放大
如何将一定区域内的图像放大在标准PAL576*720下请问有相关代码么DSP的图像显示放大
maxcio DSP 与 ARM 处理器
竞赛中会用到的封装大全哦
本帖最后由paulhyde于2014-9-1509:04编辑竞赛中会用到的封装大全哦本帖最后由paulhyde于2014-9-1509:04编辑已经有了,还是本帖最后由paulhyde于2014-9-1509:04编辑不错画pcb的时候挺有用本帖最后由paulhyde于2014-9-1509:04编辑恩,谢谢楼主本帖最后由paulhyde于2014-9-1509:04编辑
dtcxn 电子竞赛
ATMEGA8数控电源制作资料
ATMEGA8数控电源制作资料ATMEGA8数控电源制作资料能简单介绍一下更好,或上个图资料还算全,就是没介绍。资料还算全,就是没介绍。收下,谢谢资料还算全,就是没介绍。A东西不错好东西,呵呵下来参考参考谢谢惨没有币···············再顶一下····真是不好意思在支持下···终于下到了那个辛苦啊惨没有币···············资料还算全,就是没介绍。给个图吧。支持dingyige~
ahshan Microchip MCU
找做C/C++嵌入式的朋友
有谁作C/C++嵌入式的,大家一起聊聊,MSN:japan-soft@hotmail.com天天在线!找做C/C++嵌入式的朋友最讨厌小日本,LZ自己聊吧!!!LZ的ID实在不讨好。是个雌的想L聊可以先看看样貌,公的就不要聊了。友情Up!
醉清风 嵌入式系统
基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门
一、简介TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核。本文要介绍的就是其中的一款低功耗处理器OMAPL138。OMAPL138包括一个主频300M的ARM9处理器内核和一个300M的C6748DSP内核(均是32位处理器)。此外还有大量外设在此不做说明,与通用的ARM与DSP内核相比有如下一些不同点:1.内存映射,该处理器的外设与内存统一编址,DSP与ARM共享4G内存空间。但其中有一部分DSP仅可见(如DSP的数
Aguilera DSP 与 ARM 处理器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved