高通msm8953平台射频调试

高通msm8953平台射频调试

最近需要调试一个RF, 初次接触漏洞百出,艰难调试完成,记录下自己踩的坑.
一.概述
射频调试需要具备一些基础知识这样能够更好的帮助理解.
首先仔细观察原理图,自己分清射频器件,包括PA(功率放大器),ASM(开关),TRANSCEIVER,mipi器件等.
一般发射通路是trancevier->PA->ASM,接受通路相反.
另外对于一些PA ASM器件既两者都是可以的.只是说主功能是这个.
另外天线的主集,分集.主机负责发送和接收,而分集只负责接收信号.
上面列举的只是一些非常基础的知识,能够帮助完成简单的射频模块的调试

二.调试步骤
对于新的RF-card调试我是分成三步去完成.(1)拷贝一个相近的RFcard重命名,然后将ASM,PA驱动放入代码,在编译文件中添加次RFCARD的编译控制.(2)配置射频通路.(3)tunner状态优化.

2.1 新增RF-card
(1)编译控制:
MPSS.TA.3.1/modem_proc/build/ms/dynrec.lst(可以不加)
MPSS.TA.3.1/modem_proc/rfc_tabasco/api/rfc_hwid.h

  • RF_HW_WTR2965_NON_CA_SAW_4320_XX = (uint8)XX, MPSS.TA.3.1/modem_proc/rfc_tabasco/build/modem_rfc.scons
    env.PublishProtectedApi:
  • RF_HW_WTR2965_NON_CA_SAW_4320_XX = (uint8)XX,
    (2)新增RF-card
    MPSS.TA.3.1/modem_proc/rfc_tabasco/rf_card/rfc_wtr2965_non_ca_saw_4320_XX

(3)重命名
替换RFcard的名字.后期会写个脚本来完成
注意大小写!!!
(4)增加ASM和PA
ASM:
MPSS.TA.3.1/modem_proc/rfdevice_asm/src/rfdevice_asm_factory_ag.cpp
+#include “rfdevice_asm_rr88643_21_data_ag.h”
rfdevice_asm_data* rfdevice_asm_data_create(){

  • else if ( mfg_id == 0x0134 && prd_id == 0x78 && prd_rev == 0)
  • {
  • asm_data = rfdevice_asm_rf1660_data_ag::get_instance();
  • }
    其中需要注意mfg_id和prd_id有没有相同的.mfg_id和prd_id查看datasheet.
    (5)新增port口
    #define RFDEVICE_ASM_RR88916_21_NUM_PORTS 46
    rfdevice_asm_rr88916_21_asm_on_data
    rfdevice_asm_rr88916_21_asm_off_data
    rfdevice_asm_rr88916_21_trigger_off_data

PA:
PA的方法参看ASM.

完成这些后建议保存一份在本地.后续调试的时候都在拷贝一份在本地修改后在拷贝到代码中编译.完成以上步骤后可以编译,查看能否编译通过,解决编译报错.

2.2.配置射频通路
配置射频通路是移植的难点.在开始配置之前需要找提供一份gpio对照表还有port口对应.最快速的方法是将这个表打印出来然后对着datasheet在对应band写好port.port口配置需要注意的有:新增port;PA做asm需要先使能,然后记得关闭;还有PA:B38/40/41经常需要做切换需要注意,ASM内部的开关切换等.
(1)RFCard子目录
build cdma common gnss gsm lte tdscdma wcdma
在build目录中
env.AddRfCard(‘RF_HW_WTR2965_NON_CA_SAW_4320_XX’, ‘rfc_wtr2965_non_ca_saw_4320_XX_cmn_ag.h’, ‘rfc_wtr2965_non_ca_saw_4320_XX_cmn_ag’)
可以用来删除RFcard,通常采用直接删除.
(2)common
我们需要在里面配置phy_devices_list;logical_devices_list;sig_info;logical_device_properties等几个大快.
2.1:phy_devices_list:
{ /*Device: WTR2965 /
WTR2965, /
PHY_DEVICE_NAME /
0, /
PHY_DEVICE_INSTANCES / 实际器件递增
RFC_NO_ALTERNATE_PART,
RFDEVICE_COMM_PROTO_RFFE, RFDEVICE_COMM_PROTO_VERSION_DEFAULT,
{ 4,0 /
0 not specified /,}, / PHY_DEVICE_COMM_BUS /
0x217, /
PHY_DEVICE_MANUFACTURER_ID / MID
0xCA, /
PHY_DEVICE_PRODUCT_ID / PID
0, /
PHY_DEVICE_PRODUCT_REV /
0x01, /
DEFAULT USID RANGE START / UID
0x01, /
DEFAULT USID RANGE END /
0x01, /
PHY_DEVICE_ASSIGNED_USID /
0 /Warning: Not specified/, /
RFFE_GROUP_ID /
FALSE, /
INIT /
RFC_TX_MODEM_CHAIN_0, /
ASSOCIATED_DAC /
}, /
END - Device: WTR2965 */

2.2:logical_devices_list[]:
逻辑设备是按照类来分的,asm属于asm,pa属于pa.
{ /Device: WTR2965 /
RFDEVICE_TRANSCEIVER, /
DEVICE_MODULE_TYPE /
WTR2965, /
DEVICE_MODULE_NAME /
0, /
DEVICE_MODULE_TYPE
/ 同一类的序号,同一类都是从0开始
0, /* ASSOCIATED_PHY_DEVICE_INSTANCE / 实际物理器件同一个器件相同
}, /
END - Device: WTR2965 /
2.3:rfc_signal_info_type
这个数组对应这需要用到的gpio口的生命,和target/msm8953/src/rfc_msm_signal_info_ag.c属于映射关系
Target:
{RFC_ANT_SEL, 100, 0, RFC_GRFC, 1, DAL_GPIO_OUTPUT , “grfc[0]”},
/
Signal: RFC_MSM_RF_PATH_SEL_01, MSM Pin Name: GPIO_100*/
例如在这里我们定义了GPIO100 是RFC_ANT_SEL类型,功能1,输出类型
Common:
{RFC_MSM_RF_PATH_SEL_01, RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /*RFC_WTR2965_NON_CA_SAW_4320_62_RF_PATH_SEL_01 /
2.4:logical_device_properties
这个主要是对应band的初始化
需要在对应的/
bands_supported / / preferred_bands_supported /中加上需要支持的band.没有载波聚合的一般需要添加三个分笔试device 0 PRX device 1 DRX 和device 2 TX
在配置中主要分成三部分/
Bit mask element 0 /,/ Bit mask element 1 /,/ Bit mask element 2 */
0:GSM和CDMA
1:WCDMA和lte的1~6
2:所有剩下的.
2.5:common/inc
这个文件可以简单理解成我们的头文件,我们需要将src中添加的GPIO映射在这个文件中也加上.注意顺序,顺序不对会导致拉不起来的情况

(3)lte
射频通路配置没有载波聚合的话分为三部分.PRX,DRX,TX. PRX:主集接受部分.一般有两个器件TRANSCEIVER和ASM; DRX:分集的接受TRANSCEIVER和ASM; TX:发射,TRANSCEIVER,ASM,PA和HDET(功率检测)
PRX:
RFC_ENCODED_REVISION,
RFC_RX_MODEM_CHAIN_0, /* Modem Chain /
0, /
NV Container /
0, /
Antenna /
2, /
NUM_DEVICES_TO_CONFIGURE / 总的器件数,0表示没有
{
{
RFDEVICE_TRANSCEIVER,
WTR2965, /
NAME /
0, /
DEVICE_MODULE_TYPE_INSTANCE / 需要和logical_list中的序号一直
0, /
PHY_PATH_NUM /
{
0 /
Warning: Not specified /, / INTF_REV /
(int)WTR2965_LTEFDD_PRXLGY1_BAND20_PLB2, /
PORT / 注意配置的RF是不是走的这个port
( RFDEVICE_RX_GAIN_STATE_MAPPING_INVALID ), /
RF_ASIC_BAND_AGC_LUT_MAPPING /
FALSE, /
TXAGC_LUT /
WTR2965_FBRX_ATTN_DEFAULT, /
FBRX_ATTN_STATE /
0, /
Array Filler /
},
},
{
RFDEVICE_ASM,
GEN_ASM, /
NAME /
1, /
DEVICE_MODULE_TYPE_INSTANCE /
0 /
Warning: Not specified /, / PHY_PATH_NUM /
{
0 /
Orig setting: /, / INTF_REV /
(0x3F3 << 22)/mfg_id/ | (0x96 << 14)/prd_id/ | (1)/port_num/, /
PORT_NUM / port_num是根据datashett算出的
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler /
},
},
},
DRX:
RFC_ENCODED_REVISION,
RFC_RX_MODEM_CHAIN_1, /
Modem Chain /
1, /
NV Container /
1, /
Antenna /
2, /
NUM_DEVICES_TO_CONFIGURE /
{
{
RFDEVICE_TRANSCEIVER,
WTR2965, /
NAME /
0, /
DEVICE_MODULE_TYPE_INSTANCE /
1, /
PHY_PATH_NUM /
{
0 /
Warning: Not specified /, / INTF_REV /
(int)WTR2965_LTEFDD_DRXLGY1_BAND25_DMB1, /
PORT /
( RFDEVICE_RX_GAIN_STATE_MAPPING_INVALID ), /
RF_ASIC_BAND_AGC_LUT_MAPPING /
FALSE, /
TXAGC_LUT /
WTR2965_FBRX_ATTN_DEFAULT, /
FBRX_ATTN_STATE /
0, /
Array Filler /
},
},
{
RFDEVICE_ASM,
GEN_ASM, /
NAME /
2, /
DEVICE_MODULE_TYPE_INSTANCE /
0 /
Warning: Not specified /, / PHY_PATH_NUM /
{
0 /
Orig setting: /, / INTF_REV /
(0x134 << 22)/mfg_id/ | (0x78 << 14)/prd_id/ | (9)/port_num/, /
PORT_NUM /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler */
},
},

TX:
RFC_ENCODED_REVISION,
RFC_TX_MODEM_CHAIN_0, /* Modem Chain /
0, /
NV Container /
0, /
Antenna /
4, /
NUM_DEVICES_TO_CONFIGURE /
{
{
RFDEVICE_TRANSCEIVER,
WTR2965, /
NAME /
0, /
DEVICE_MODULE_TYPE_INSTANCE /
0, /
PHY_PATH_NUM /
{
0 /
Warning: Not specified /, / INTF_REV /
(int)WTR2965_LTEFDD_TX_BAND25_THMLB4, /
PORT /
( RFDEVICE_PA_LUT_MAPPING_VALID | WTR2965_LP_LUT_TYPE << RFDEVICE_PA_STATE_0_BSHFT | WTR2965_HP_LUT_TYPE << RFDEVICE_PA_STATE_1_BSHFT | WTR2965_HP_LUT_TYPE << RFDEVICE_PA_STATE_2_BSHFT | WTR2965_HP_LUT_TYPE << RFDEVICE_PA_STATE_3_BSHFT ), /
RF_ASIC_BAND_AGC_LUT_MAPPING /
FALSE, /
TXAGC_LUT /
WTR2965_FBRX_LOW_ATTN_MODE, /
FBRX_ATTN_STATE /
0, /
Array Filler /
},
},
{
PA
},
{
ASM
},
{
RFDEVICE_HDET,
TRX_HDET, /
NAME /
0, /
DEVICE_MODULE_TYPE_INSTANCE /
0 /
Warning: Not specified /, / PHY_PATH_NUM /
{
0 /
Orig setting: /, / INTF_REV /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler /
0, /
Array Filler */
},
},
rfc_wtr2965_non_ca_saw_4320_62_lte_config_ag.cpp
需要配置对应band的配置.

(6)GSM/WCDMA/CDMA
这三个制式一般都没有分集,所以只需要将分集的配置换个主机设置成一样即可,其余配置都一样.
完成这些配置后就可以编译下载跑综测校准,修改直到没有问题.

3.tunner配置
Tunner状态配置属于射频的收尾,优化接受. 所以我们只需要配置PRX和DRX, 对于TX我们不需要关注.
需要在调通所有band后发给天线厂,天线厂调试完成会给我们一个状态表,根据此表配置即可.
Tunner首先需要从原理图找到对应的GPIO口,然后在target/msm8953/src/rfc_msm_signal_info_ag.c找到对应的gpio.在这个文件中会存在多个定义,可以将不需要的INVALID防止出现无法拉起的情况.
{ RFC_ANT_SEL , RFC_GPIO_INVALID, 0 , RFC_GRFC , 1, DAL_GPIO_OUTPUT ,“grfc[0]”}, /* Signal: RFC_MSM_RF_PATH_SEL_01, MSM Pin Name: GPIO_100*/

然后在lte/gsm/cdma/中配置状态
rfc_sig_info_type rf_card_wtr2965_non_ca_saw_4320_XX_rx_on_rfm_device_1_lte_b19_sig_cfg = 分集的
{
RFC_ENCODED_REVISION,
{
{ (int)RFC_WTR2965_NON_CA_SAW_4320_XX_RF_PATH_SEL_09, { RFC_LOW, 0/Warning: Not specified/ }, {RFC_CONFIG_ONLY, 0/Warning: Not specified/ } },
{ (int)RFC_WTR2965_NON_CA_SAW_4320_XX_RF_PATH_SEL_01, { RFC_HIGH, 0/Warning: Not specified/ }, {RFC_CONFIG_ONLY, 0/Warning: Not specified/ } },
{ (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } }
},
};

4.总结
1.注意大小写!!!,新增RFcard时候重名名忘记大小写,埋下巨坑,后期才发现结果浪费大量时间.考虑写个脚本完成这一步.
2.在配置通路的时候,lte的分集asm器件没有和logical_deviced对应起来.
3.GPIO拉不起来,在target/里面将不需要的重定义全部invaild掉.
4.注意asm内部开关切换.

5.由于本人也是初次接触,所以理解不够深入,此文档仅供参考.后期会深入整理.对于缩写不正确的地方欢迎留言批评.

你可能感兴趣的:(Android,射频,高通,android)