GRFC (generic rf control)
1 gpio的配置(结构体)
关于GRFC相关的很重要的四个文件,下边笔记会说到他们的作用:
\modem_proc\rfc_jolokia\target\mdm9609\src\Rfc_msm_signal_info_ag.c
\modem_proc\rfc_jolokia\target\mdm9609\src\Rfc_msm_signal_info_ag.h
\modem_proc\rfc_jolokia\rf_card\rfc_wtr4905_om\common\src\Rfc_wtr4905_om_cmn_ag.cpp
\modem_proc\rfc_jolokia\rf_card\rfc_wtr4905_om\common\inc\Rfc_wtr4905_om_cmn_ag.h
Rfc_msm_signal_info_ag.c的中跟MSM_RF_GPIO相关的结构体如下
- rfc_msm_signal_info_type rfc_mdm9609_signal_info[RFC_MSM_SIG_NUM] =
- {
- { RFC_ANT_SEL , 75 , 1 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 74 , 0 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 76 , 2 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 79 , 5 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 78 , 4 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 93 , 19 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 83 , 9 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 85 , 11 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 89 , 15 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 92 , 18 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 80 , 6 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 88 , 14 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- { RFC_ANT_SEL , 91 , 17 , RFC_GRFC , 1, DAL_GPIO_OUTPUT },
- ...............................................
相关的gpio的配置必须在这个结构体里加一项,但是如何找到某个作用的gpio呢,当然使用enum项了,代码如下 在Rfc_msm_signal_info_ag.h中- typedef enum
- {
- RFC_MSM_RF_PATH_SEL_00,
- RFC_MSM_RF_PATH_SEL_01,
- RFC_MSM_RF_PATH_SEL_02,
- RFC_MSM_RF_PATH_SEL_03,
- RFC_MSM_RF_PATH_SEL_04,
- RFC_MSM_RF_PATH_SEL_05,
- RFC_MSM_RF_PATH_SEL_06,
- RFC_MSM_RF_PATH_SEL_07,
- RFC_MSM_RF_PATH_SEL_08,
- RFC_MSM_RF_PATH_SEL_09,
- ................................
- RFC_MSM_SIG_NUM,
- RFC_MSM_SIG_INVALID = 0xFFFFFFFF,
- }rfc_msm_signal_type
比如使用到 { RFC_ANT_SEL , 75 , 1 , RFC_GRFC , 1, DAL_GPIO_OUTPUT }, 这一项的时候,rfc_mdm9609_signal_info[RFC_MSM_RF_PATH_SEL_00]这种格式就可以很轻松的找到它来配置gpio了,下边的调用过程一节就是使用此方法
RFC_MAM相关的gpio(上图中),在代码中的结构体为rfc_mdm9609_signal_info
MSM所有的gpio(上图左)
RF_CARD 相关的gpio(上图右),代表某款RF card使用到的gpio,比如结构体rfc_wtr4905_om_sig_info
RFC_MSM_gpio是总的MSM_gpio的一部分, 但是在相关的RF_CARD_GPIO用到的是GPIO_MSM的一部分
配置wtr4905 RF card的gpio的文件为Rfc_wtr4905_om_cmn_ag.cpp
- rfc_signal_info_type rfc_wtr4905_om_sig_info[RFC_WTR4905_OM_SIG_NUM + 1] =
- {
- { RFC_MSM_TIMING_PA_CTL , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
- { RFC_MSM_TIMING_PA_RANGE , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
- { RFC_MSM_TIMING_ASM_CTL , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
- { RFC_MSM_TIMING_PAPM_CTL , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
- { RFC_MSM_TIMING_TX_TX_RF_ON0 , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
- { RFC_MSM_TIMING_TX_RX_RF_ON0 , RFC_LOW, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL },
第一排如RFC_MSM_TIMING_PA_CTL来自于rfc_msm_signal_type的enum结构体中,通过RFC_MSM_TIMING_PA_CTL就能在rfc_mdm9609_signal_info中找到对应gpio(必须有对应项),这样就能跟某个gpio相关联。
如果想在rfc_wtr4905_om_sig_info中定位某个成员,要通过enum变量: 在Rfc_wtr4905_om_cmn_ag.h中
- typedef enum
- {
- RFC_WTR4905_OM_TIMING_PA_CTL,
- RFC_WTR4905_OM_TIMING_PA_RANGE,
- RFC_WTR4905_OM_TIMING_ASM_CTL,
- RFC_WTR4905_OM_TIMING_PAPM_CTL,
- RFC_WTR4905_OM_TIMING_TX_TX_RF_ON0,
- RFC_WTR4905_OM_TIMING_TX_RX_RF_ON0,
- RFC_WTR4905_OM_TIMING_ASM_TRIGGER,
- RFC_WTR4905_OM_TIMING_PAPM_TX_TX_TRIGGER,
- RFC_WTR4905_OM_TIMING_PAPM_OFF_TX_RX_TX_TRIGGER,
- RFC_WTR4905_OM_TIMING_PA_TRIGGER,
- RFC_WTR4905_OM_TIMING_PAPM_OFF_TX_RX_TX_CTL,
- RFC_WTR4905_OM_TIMING_PAPM_TX_TX_CTL,
- RFC_WTR4905_OM_RF_PATH_SEL_01,
- ....................................
- }wtr4905_om_sig_type;
定义gpio初始化端口电平时会用到以上enum(如下代码),通过以上的对应关心就能找到对应的gpio管脚
- rfc_sig_info_type rf_card_wtr4905_om_tx0_lte_b4_sig_cfg =
- {
- RFC_ENCODED_REVISION,
- {
- { (int)RFC_WTR4905_OM_PA0_R0_ALT1, { RFC_CONFIG_ONLY, 0 }, {RFC_LOW, 0 } },
- { (int)RFC_WTR4905_OM_PA0_R1_ALT1, { RFC_CONFIG_ONLY, 0 }, {RFC_LOW, 0 } },
- { (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } }
- },
- };
2 调用过程分析,过程中就会用到通过enum定位rfc_mdm9609_signal_info和rfc_wtr4905_om_sig_info的方法(用到enum的原因)
- rfc_common_init
- rfc_msm_signals_num=rfc_msm_sig_info_table_get(&rfc_msm_signal_info_table);
- *msm_info_table = &rfc_msm8952_signal_info[0];
- for (i = 0; (i < rfc_signals_num) && (api_status == TRUE) ; i++)
- msm_signal = rfc_signal_info_table[i].msm_sig_name;
-
- ommon_set_grfc(rfc_msm_signal_info_table[msm_signal].grfc_num, rfc_signal_info_table[i].init_state);
-
两者联系的核心是msm_sig_name,即enum rfc_msm_signal_type
3 添加一个RF GPIO的流程如图:
相关参考文档在我上传的文件中可以找到:GENERIC RF CONTROLS (GRFC) CUSTOMIZATION.pdf
原著:http://blog.csdn.net/sq336/article/details/47298137