如果硬件添加更改了一块FM芯片,而驱动往往是由芯片供应商提供,我们需要做的工作是移植。
假设供应商提供的驱动是:
Qndriver.c
Qndriver.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__
endif
endif
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.c
fm_drv/qndriver.c
fm_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)//没用,返回1
kal_bool FMDrv_WriteByte(kal_uint8 addr, kal_uint16 data)//没用,返回1
kal_uint8 FMDrv_Get_stereo_mono(void)//不知有什么用,直接返回0
void 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