需要的资料:
1、各个器件的datasheet
2、原理图
3、逻辑表(内容包含支持哪些制式、band,各个band用到哪些器件,需要哪些GPIO,GPIO配高还是配低等)
上述由RF同事提供
下面从几个方面介绍RF驱动modem部分的配置工作:
1、物理,逻辑列表的配置
2、PA ASM 文件的添加
3、各制式下的RX TX 配置
4、GPIO开关控制
一、物理,逻辑列表的配置
在配置物理逻辑列表前,首先需要确定几个问题。
rf_card的选择:和RF工程师一起确定选用那个RF_card,这需要根据是否支持CA,支持哪些band来做初步确定,当问题无法确定时,可以提case到高通请求协助确定。
相关器件的功能确定:有些器件的作用是即可作为PA又能作为ASM的,这时需要RF工程师提供相关器件的datasheet以便确定这些问题。
确定过上述问题后就可以配置物理逻辑列表了,下面以MSM8937平台为例,具体展示配置过程:
首先根据RF工程师和相关资料确定使用的rf_card为rfc_wtr2965_qrd_non_ca_4373_1,明显是不支持CA的,打开common\src\rfc_wtr2965_qrd_non_ca_4373_1_cmn_ag.cpp文件开始配置物理逻辑列表:
rfc_phy_device_info_type rfc_wtr2965_qrd_non_ca_4373_1_phy_devices_list[]=
{
{ /*Device: WTR2965 */
WTR2965, /* PHY_DEVICE_NAME */
0, /* PHY_DEVICE_INSTANCES */
RFC_NO_ALTERNATE_PART, /* PHY_DEVICE_ALT_PART_NUM_OF_INSTANCE */
RFDEVICE_COMM_PROTO_RFFE, /* PHY_DEVICE_COMM_PROTOCOL */
{ 4,0 /* 0 not specified */,}, /* PHY_DEVICE_COMM_BUS */
0x217, /* PHY_DEVICE_MANUFACTURER_ID */
0xCA, /* PHY_DEVICE_PRODUCT_ID */
0, /* PHY_DEVICE_PRODUCT_REV */
0x01, /* DEFAULT USID RANGE START */
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 */
{ /*Device: QFE2101 */
QFE2101, /* PHY_DEVICE_NAME */
1, /* PHY_DEVICE_INSTANCES */
RFC_NO_ALTERNATE_PART, /* PHY_DEVICE_ALT_PART_NUM_OF_INSTANCE */
RFDEVICE_COMM_PROTO_RFFE, /* PHY_DEVICE_COMM_PROTOCOL */
{ 0,0 /* 0 not specified */,}, /* PHY_DEVICE_COMM_BUS */
0x217, /* PHY_DEVICE_MANUFACTURER_ID */
0x31, /* PHY_DEVICE_PRODUCT_ID */
0, /* PHY_DEVICE_PRODUCT_REV */
0x4, /* DEFAULT USID RANGE START */
0x4, /* DEFAULT USID RANGE END */
0x4, /* PHY_DEVICE_ASSIGNED_USID */
0 /*Warning: Not specified*/, /* RFFE_GROUP_ID */
TRUE, /* INIT */
RFC_INVALID_PARAM, /* ASSOCIATED_DAC */
}, /* END - Device: QFE2101 */
{ /*Device: AP6716M for PA and ASM */
GEN_DEVICE , /* PHY_DEVICE_NAME */
2, /* PHY_DEVICE_INSTANCES */
RFC_NO_ALTERNATE_PART, /* PHY_DEVICE_ALT_PART_NUM_OF_INSTANCE */
RFDEVICE_COMM_PROTO_RFFE, /* PHY_DEVICE_COMM_PROTOCOL */
{ 0,0 /* 0 not specified */,}, /* PHY_DEVICE_COMM_BUS */
0x349, /* MANUFACTURER_ID */
0x2F, /* PRODUCT_ID */
0, /* PRODUCT_REV */
0xE, /* DEFAULT USID RANGE START */
0xE, /* DEFAULT USID RANGE END */
0xC, /* ASSIGNED_USID */
0 /*Warning: Not specified*/, /* RFFE_GROUP_ID */
FALSE, /* INIT */
RFC_INVALID_PARAM, /* ASSOCIATED_DAC */
}, /* END - Device: AP6716M */
如上;是截取了物理列表的部分器件信息:
1,WTR2965 和 QFE2101是原本就存在的,需要注意的是wtr2965的总线确定{ 4,0 /* 0 not specified */,}, /* PHY_DEVICE_COMM_BUS */
方法是:根据RF工程师提供的逻辑表中的信息确定或是根据原理图确定,找到RFFE5_DATA/CLK或类似RFFE数字_DATA/CLK,用数字减去1就是总线,如上配置的4,其他的一般不需要修改
2,配置新增的器件信息:这里以AP6716为例,如上配置,根据datasheet知道这个器件是即做PA有做ASM的,注释中最好写明,下面配置相关参数
2, /* PHY_DEVICE_INSTANCES */ 这里的2是指物理逻辑的器件排序,
{ 0,0 /* 0 not specified */,}, /* PHY_DEVICE_COMM_BUS */ 总线的确定和wtr2965一样。
0x349, /* MANUFACTURER_ID */MID根据datasheet计算
0x2F, /* PRODUCT_ID */ PID也是根据datasheet确定
如上,截取datasheet中的,可以看到PID是0x2F,MID是01001001和11相组合后转化为十六进制得到的,如上:二进制为1101001001转为十六进制得0x349.
USID一样计算,1110转化为十六进制为0xE。0xC, /* ASSIGNED_USID */这个自定义就可以,注意不要和其他器件一样。
其他器件也是如上这样添加就可。
逻辑列表相对就简单多了,
rfc_logical_device_info_type rfc_wtr2965_qrd_non_ca_4373_1_logical_devices_list[] =
{
{ /*Device: WTR2965 */
RFDEVICE_TRANSCEIVER, /* DEVICE_MODULE_TYPE */
WTR2965, /* DEVICE_MODULE_NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
0, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: WTR2965 */
{ /*Device: QFE2101 */
RFDEVICE_PAPM, /* DEVICE_MODULE_TYPE */
QFE2101, /* DEVICE_MODULE_NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
1, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: QFE2101 */
{ /*Device: AP6716M for ASM*/
RFDEVICE_ASM, /* DEVICE_MODULE_TYPE */
GEN_ASM, /* DEVICE_MODULE_NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
2, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: AP6716M */
{ /*Device: AP7219M for ASM*/
RFDEVICE_ASM, /* DEVICE_MODULE_TYPE */
GEN_ASM, /* DEVICE_MODULE_NAME */
1, /* DEVICE_MODULE_TYPE_INSTANCE */
3, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: AP7219M */
{ /*Device: AP6716M for PA*/
RFDEVICE_PA, /* DEVICE_MODULE_TYPE */
GEN_PA, /* DEVICE_MODULE_NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
2, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: AP6716M */
逻辑列表中器件作为PA和ASM 需要分开配,只要配两个参数就可
{ /*Device: AP6716M for ASM*/
RFDEVICE_ASM, /* DEVICE_MODULE_TYPE */
GEN_ASM, /* DEVICE_MODULE_NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
2, /* ASSOCIATED_PHY_DEVICE_INSTANCE */
}, /* END - Device: AP6716M */
第一个是作为ASM的器件在逻辑列表中的排序,第二个是对应物理列表中的PHY_DEVICE_INSTANCES。
列表这样就配好了,
另外,当前文件中需要注意的地方,
{ /* device_support */
{ /* Logical Device 0 */
/* bands_supported */
{
{
这里的内容要包含所有支持的band,包括没有贴出来的Device 1 ,Device 2等都要配置,不然注网会有问题。
二、PA ASM 文件的添加
1、在rfdevice_asm或rfdevice_pa 中添加相关文件,找类似的文件复制一份,修改文件名,修改内容即可,
需要注意的是
文件最下方需要修改为该器件的相关参数
else}
asm_on_data的内容按照datasheet配置,也可和FAE确定。其他按默认就可。
2、添加过 .cpp 和 .h 文件后,不要忘了在rfdevice_asm_factory_ag.cpp和rfdevice_pa_factory_ag.cpp中加入#include "rfdevice_asm_ap6716m_data_ag.h"和
else if ( mfg_id == 0x349 && prd_id == 0x2F && prd_rev == 0)
{
asm_data = rfdevice_asm_ap6716m_data_ag::get_instance();
}
注意MID和PID需要配置正确。
三,各制式下的RX TX 配置
配置Rx和TX时,
rfc_device_info_type rf_card_wtr2965_qrd_non_ca_4373_1_tx0_lte_b1_device_info =
{
RFC_ENCODED_REVISION,
RFC_TX_MODEM_CHAIN_0, /* Modem Chain */
0, /* NV Container */
0, /* Antenna */
5, /* 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_BAND1_THMLB4, /* PORT */---------》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 */
},
},
{
RFDEVICE_PA,
GEN_PA, /*AP7219M NAME */
1, /* DEVICE_MODULE_TYPE_INSTANCE */--------》和逻辑列表对应
0 /*Warning: Not specified*/, /* PHY_PATH_NUM */
{
0 /* Orig setting: */, /* INTF_REV */
(0x349 << 22)/*mfg_id*/ | (0x0F << 14)/*prd_id*/ | (6)/*port_num*/, /* PORT_NUM */-------和器件参数,port口一致,port口根据pa或asm的文件中的数据匹配。
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
},
},
{
RFDEVICE_PAPM,
QFE2101, /* NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */
0 /*Warning: Not specified*/, /* PHY_PATH_NUM */
{
0 /* Orig setting: */, /* INTF_REV */
(0x217 << 22)/*mfg_id*/ | (0x31 << 14)/*prd_id*/ | (9)/*port_num*/, /* PORT_NUM */
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
},
},
{
RFDEVICE_ASM,
GEN_ASM, /*AP6716M NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE */--------》和逻辑列表对应
0 /*Warning: Not specified*/, /* PHY_PATH_NUM */
{
0 /* Orig setting: */, /* INTF_REV */
(0x349 << 22)/*mfg_id*/ | (0x2F << 14)/*prd_id*/ | (1)/*port_num*/, /* PORT_NUM */-------和器件参数,port口一致,port口根据pa或asm的文件中的数据匹配
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
},
},
{
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 */
},
},
},
};
可以看到,上面有两个我们新增的器件和QFE2101、wtr2965,配置时需要注意的地方的已经标红,
1、器件总数量
2、wtr2965的port口
3、器件port口
四、GPIO开关控制
在LTE或其他制式下的band中有些会存在GPIO控制的开关,一般配置较简单,需要从原理图或者逻辑表中得到这些开关的配置信息,如:
rfc_sig_info_type rf_card_wtr2965_qrd_non_ca_4373_1_rx1_lte_b1_sig_cfg =
{
RFC_ENCODED_REVISION,
{
{ (int)RFC_WTR2965_QRD_NON_CA_4373_1_RF_PATH_SEL_06, { RFC_LOW, 0 }, {RFC_LOW, 0 } },
{ (int)RFC_WTR2965_QRD_NON_CA_4373_1_RF_PATH_SEL_20, { RFC_LOW, 0 }, {RFC_LOW, 0 } },
{ (int)RFC_WTR2965_QRD_NON_CA_4373_1_RF_PATH_SEL_05, { RFC_HIGH, 0 }, {RFC_LOW, 0 } },
{ (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } }
},
};
这是LTEband1的rx分级GPIO的配置内容
{ (int)RFC_WTR2965_QRD_NON_CA_4373_1_RF_PATH_SEL_06, { RFC_LOW, 0 }, {RFC_LOW, 0 } },
三部分;
1、(int)RFC_WTR2965_QRD_NON_CA_4373_1_RF_PATH_SEL_06 是根据原理图或逻辑表确定用的哪个开关,如果没有需要自己添加。
2、 { RFC_LOW, 0 } 配高还是配低需要从逻辑表确定。
3、 {RFC_LOW, 0 } 默认为低就可,不用改。
有几个开关就配几个,高低根据逻辑表确定即可。