文 | GentlemanTsao
前言
RFFE driver中的GRFC配置是十分重要却容易不被重视的部分。
重要性在于:
常见的modem crash、逻辑通路不通等问题很可能是GRFC配置错误引起的。
不被重视是因为:
配置代码改动量不大;
错误比较隐蔽(例如映射顺序错误、冗余定义等)。
因此,为了避免出现错误,深入理解GRFC是必要的。
文章目录
- 前言
- 1.什么是GRFC
- 2.GRFC的配置流程概览
- 3.msm_sig_info的配置与分析
- msm_sig_info Table位置:
- msm_sig_info Table示例:
- Table元素解读:
- rfc_msm_sig_info_type结构体
- signal type
- msm_gpio |grfc_num:GPIO到GRFC的映射
- output_type
- function_select
- 4._sig_cfg的配置与分析
- _sig_cfg table位置:
- _sig_cfg table 示例:
- Table元素解读:
- _sig_cfg table 与msm_sig_info Table的关系
- 5.各频段的sig_cfg配置
- 6.TDD GRFC timing配置
- 7.配置准则、常见错误及避免方法
- 准则1:【强制】:
- 准则2:【强制】
- 准则3:【推荐】
- 准则4:【推荐】
- 准则5:【强制】
1.什么是GRFC
GRFC是连接内部或外部组件的专用信号,通过在特定时间开/关,达到控制功能的作用。例如控制ASM。
下面的例子是GPIO75用于控制ASM的通路。
如下的控制逻辑表定义了,GPIO 75不同的取值对应的通路。
可以看出,拉高时,PRX_B1连通;拉低时,PRX_B4连通。
有了以上基本认识,接下来先了解GRFC配置的基本流程。
2.GRFC的配置流程概览
基本流程图:
上面的流程图列出了配置GRFC的主要步骤。其中涉及三个重要的table:
Band_sig_cfg:
指个频段的sig_cfg, 在逻辑配置表中会标注该band有几个GPIO以及对应的值,我们只需按照逻辑配置表的标注填写。在第5节5.各频段的sig_cfg配置有详细介绍。
<rf_card>_sig_cfg:
该table列出了RF card用到的所有GRFC,以及它们和MSM signals的对应关系。详细内容在第4节4.<rf_card>_sig_cfg的配置与分析中介绍。
msm_sig_info:
该table列出了GPIO和GRFC的对应关系。详细内容在第3节3.msm_sig_info的配置与分析介绍。
3.msm_sig_info的配置与分析
msm_sig_info Table位置:
fc_msm_signal_info.ag.c
msm_sig_info Table示例:
Table元素解读:
首先,以第二个元素为例,注意右侧的注释:
红圈部分标注了该table的下标。实际上,这个下标在fc_msm_signal_info.ag.h文件中,定义了如下的枚举类型:
所以注意:table中元素的顺序和枚举的顺序必须是一一对应的。
上面的元素主要表示了三个含义:
- GPIO 100 映射到了GRFC 0上;
- 用于天线控制;
- 它的元素下标是RFC_MSM_RF_PATH_SEL_01——换句话说,当我们指定RFC_MSM_RF_PATH_SEL_01时,指的即是GPIO 100.
通常了解这个含义就可以配置大部分GPIO了。接下来我们还需看看各个参数的具体含义。
rfc_msm_sig_info_type结构体
每个元素是一个rfc_msm_signal_info_type类型,包含如下的几个参数:
signal type
下表列出了signal type对应的功能:
msm_gpio |grfc_num:GPIO到GRFC的映射
目的:告诉modem某个RF操作对应控制哪个GPIO。
两者是一一映射的关系。注意该映射关系已经预定义,我们不能自行修改。
如下是GPIO和GRFC的映射关系:
output_type
所有GRFC signal都需设置为RFC_GRFC.
function_select
对于GRFC signal,通常设为1. 该参数用于某些特别的GRFC允许输出不同的类型。
4.<rf_card>_sig_cfg的配置与分析
<rf_card>_sig_cfg table位置:
Rfc_xxx_cmn_ag.cpp
<rf_card>_sig_cfg table 示例:
Table元素解读:
仍然以GPIO 100为例,右侧也有一个标注:
同样的,红圈标注的是该元素的下标,它也是在RF card头文件中定义的枚举,如下所示:
上述元素主要表示三个含义:
- RFC_MSM_RF_PATH_SEL_01(即GPIO 100)需要在该RF card中使用;
- RFC_MSM_RF_PATH_SEL_01的初始值是RFC_LOW;
- RFC_MSM_RF_PATH_SEL_01(即GPIO 100)在RF card sig table的下标是RFC_WTR2965_NON_CA_SAW_4320_SIG_GPIO_100——换句话说,在该RF card各band设置GPIO时,当我们指定RFC_WTR2965_NON_CA_SAW_4320_SIG_GPIO_100,它指的即是GPIO 100.
<rf_card>_sig_cfg table 与msm_sig_info Table的关系
msm_sig_info Table中列出了所有的RF
GPIO;
<rf_card>_sig_cfg table列出了用到的RF GPIO,并且映射到msm_sig_info
Table。如下图所示:
5.各频段的sig_cfg配置
上面两节主要介绍的是GPIO与GRFC的映射关系,该映射是在RF初始化阶段执行的。GPIO的最终设置(高或低),是在各频段的sig_cfg中配置。
仍然以GPIO 100为例,如下是B38 rx0的sig_cfg:
这里我们将GPIO 100 设为0. (RFC_LOW)
注意到这里{ RFC_LOW, 0/Warning: Not specified/ }的第二个参数“0”,表示time_offset,具体的作用在下一节中讨论。
6.TDD GRFC timing配置
TDD频段的sig_cfg会带有时序参数。例如GSM的sig_cfg:
每个signal都带有一个starting time和ending time。
除非必要,我们不应修改高通预设的timing参数。
7.配置准则、常见错误及避免方法
为了避免出错,在配置GRFC过程中坚持下面几个准则是有益的:
准则1:【强制】:
描述:
msm_sig_info table的元素顺序必须和元素下标枚举的顺序一致。
举例:
GPIO 100 在table中的下标是1:
则RFC_MSM_RF_PATH_SEL_01在枚举中的值也必须是1.
违反该准则将导致msm_sig_info table的映射关系错乱,出现modem crash或GPIO无效。
准则2:【强制】
描述:
<rf_card>_sig_cfg table的元素顺序必须和元素下标枚举的顺序一致。
举例:
GPIO 100 在<rf_card>_sig_cfg table的下标是31,如下:
则RFC_WTR2965_NON_CA_SAW_4320_SIG_GPIO_100在枚举中的值也必须是31:
违反该准则会出现GPIO实际值与设置不符。
准则3:【推荐】
描述:
新增GRFC项添加在table的最后。
举例:
假如需要在rfc_wtr2965_non_ca_saw_4320_sig_info中新增一项GPIO 111,在table中添加在RFC_SIG_LIST_END之前:
在下标枚举中添加到RFC_WTR2965_NON_CA_SAW_4320_SIG_NUM之前:
准则3实际上保证了在新增GRFC时,满足了准则1和2的要求。
准则4:【推荐】
描述:
同一个msm signal不要映射到多个<rf_card> sig。
举例:
下面的例子中,RFC_MSM_RF_PATH_SEL_01(GPIO 100)映射到两个<rf_card> sig,分别是
RFC_WTR2965_NON_CA_SAW_4320_SIG_GPIO_10;
RFC_WTR2965_NON_CA_SAW_4320_RF_PATH_SEL_01
同一个GPIO有多个别名没有任何好处,反而容易产生冲突,特别是当你在不同的地方使用不同的名字时。
准则5:【强制】
描述:
去掉没用到的GRFC
举例:
参考下面的流程:
band sig cfg中部分GRFC有预设值,如果不去掉,会影响正确的设置。