MTK fm驱动移植

    技术2022-05-20  29

      MTK fm驱动移植 收藏 如果硬件添加更改了一块FM芯片,而驱动往往是由芯片供应商提供,我们需要做的工作是移植。假设供应商提供的驱动是:Qndriver.cQndriver.h以下分4个步骤完成,看好

    1.更改芯片ID

     在文件XXX_GPRS.mak (make目录下,XXX与平台有关)中找到FM_RADIO_CHIP = AR1000   # NONE, MT6189A1, MT6188A1, AR1000

    更改为我们的芯片ID,如QN8035A1,不要紧,随便定义:FM_RADIO_CHIP = QN8035A1 # NONE, MT6189A1, MT6188A1, AR1000

    注意:目录(build/sangfei36_10a)下也有文件XXX_GPRS.mak,这个不需要改,make编译之后,它会被上面

    的覆盖。

    2.添加编译路径

    在文件Option.mak (make目录)中添加下面的代码:ifeq ($(strip $(FM_RADIO_CHIP)),QN8035A1)  ifneq ($(strip $(FM_RADIO_HW_SEARCH)),TRUE)    $(call DEP_ERR_SETA_OR_ONB,FM_RADIO_CHIP,non QN8035A1,FM_RADIO_HW_SEARCH)    DEPENDENCY_CONFLICT = TRUE  else    COM_DEFS  += __FM_RADIO_HW_SEARCH__  endifendif

    3.添加和配置驱动文件  MTk的fm驱动有别,是放在(fm_drv)目录下,我们把Qndriver.c和Qndriver.h放进这个目录下,再创建一个文件QN8035A1.c(随便命名)。然后转移到(make/fm_drv)目录:(1)打开fm_drv.pth,在结尾添加fm_drv

    (2)打开文件fm_drv.inc ,在结尾添加fm_drv

    (3)打开文件fm_drv.lis 在结尾添加fm_drv/QN8035A1.cfm_drv/qndriver.cfm_drv/qnio.c

    4.编写mtk的fm接口函数

     fm使用的是I2C协议,要看看sda和scl引脚是否对了,还有一个32K频率的引脚.fm的接口函数是固

    定的,所以要添加开关QN8035A1(刚才命名的芯片ID)来控制,也就是说选择哪个芯片就编译哪个文件。打开刚才创建的文件QN8035A1.c,添加下面的代码,这些函数都可参考已有的编写:

    #include "l1audio_def.h"#include "qndriver.h"#include "qnio.h"

    #if defined(QN8035A1)

    typedef struct{   void (*callback)( kal_int16 wFreq, kal_uint8 wSignal_Lv, kal_bool is_vlaid );   kal_bool bHWsearchStop;   kal_bool is_preset;   kal_bool is_searching;}FMR_data;extern FMR_data *pstFMR_data;static uint16 qn_FreqSt = 987;static bool qn_HWSearch_flag = 0;static bool qn_Valid_flag = 0;

    void SerialCommInit(void)//打开I2C协议void SerialCommRelease(void)//关闭I2C协议void SerialCommCryClkOn(void)/打开fm的32k波形void SerialCommCryClkOff(void)//关闭fm的32k波形

    void FMDrv_SetFreq( int16 curf )//定位到指定的频道,要自己写void FMDrv_HWSearch(int16 freq, bool is_step_up, int16 space, bool is_preset)//用于自动搜索,

    要写uint8 FMDrv_HWSpolling(uint16 *curf, uint8 *is_valid)//用于自动搜索,要写uint8 FMDrv_ValidStop(int16 freq, int8 signalvl, bool is_step_up)//用于自动搜索,要写void FMDrv_SetVolumeLevel(UINT8 level)//设置fm音量,要自己写void FMDrv_Mute(UINT8 mute)//设置fm静音,要自己写void FMDrv_PowerOnReset(void)//复位,要自己写void FMDrv_PowerOffProc(void)//关闭fm,要自己写

    kal_uint16 FMDrv_ReadByte(kal_uint8 addr)//没用,返回1kal_bool FMDrv_WriteByte(kal_uint8 addr, kal_uint16 data)//没用,返回1kal_uint8 FMDrv_Get_stereo_mono(void)//不知有什么用,直接返回0void FMDrv_radio_item_info(kal_uint16 group_idx, kal_uint16 item_idx, kal_uint32

    item_value)//不知有什么用,空着它uint16 FMDrv_GetSigLvl( int16 curf )//没见用到,不想写uint16 FMDrv_GetIF( int16 curf)//return 120;不懂,随便返回一个数void FMDrv_EvaluateRSSIThreshold(void)//没用void FMDrv_ChipInit(void)//没用bool FMDrv_IsChipValid( void )//返回true

    #endif

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/menghnhhuan/archive/2011/04/11/6316210.aspx


    最新回复(0)