高通RFC適配RFFE-配置RF
在上一篇文章中,已經添加了新的MIPI pa asm,那麼接下來就是要在RF driver中應用這些MIPI器件,以及使用GPIO的埠
首先需要rfc_jolokia/rfc_card/<rf-card>/common 下的<rfc_card>_cmn_ag.cpp檔案中的<rfc_card>_phy_devices_list中新增物理裝置和邏輯裝置
新增物理裝置和邏輯裝置
還是以sky77638為例,下面是新增的物理裝置
{ /*Device: SKY77638_11(U62) */ GEN_DEVICE, /* PHY_DEVICE_NAME */ 1, /* PHY_DEVICE_INSTANCE */ 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 */ 0x1A5, /* PHY_DEVICE_MANUFACTURER_ID */ 0x1C, /* PHY_DEVICE_PRODUCT_ID */ 2, /* PHY_DEVICE_PRODUCT_REV */ 0xF, /* DEFAULT USID RANGE START */ 0xF, /* DEFAULT USID RANGE END */ 0xF, /* PHY_DEVICE_ASSIGNED_USID */ 0 /*Warning: Not specified*/, /* RFFE_GROUP_ID */ FALSE, /* INIT */ RFC_INVALID_PARAM, /* ASSOCIATED_DAC */ }, /* END - Device: SKY77638_11 (U62)*/
PHY_DEVICE_NAME:對於PA來說,這個值應當是GEN_PA,這裡之所以是GEN_DEVICE,是因為這個PA是一個複合器件,包含了ASM的功能,那麼該器件還需要在ASM中新增其對應的驅動,那時這個值為GEN_ASM。
PHY_DEVICE_INSTANCE:物理器件的編號,每個裝置需要有唯一編號,該編號從0開始計算,數目依次增加,這裡是第二個物理裝置
PHY_DEVICE_COMM_BUS:表示該物理裝置接在哪根RFFE總線上,這裡是0 代表的是RFFE1。
PHY_DEVICE_MANUFACTURER_ID、PHY_DEVICE_PRODUCT_ID、PHY_DEVICE_PRODUCT_REV:這三個值與rfdevice_pa_XYZ_data_ag.cpp中的保持一致,參考的是datasheet
DEFAULT USID RANGE START DEFAULT USID RANGE END和PHY_DEVICE_ASSIGNED_USID一般相同,通常先選擇使用USID值,當然也可以使用其他值。文件中有地方說明在同一個RFFEbus上的器件的PHY_DEVICE_ASSIGNED_USID需要不同。
新增邏輯裝置
{ /*Device: SKY77638_11 (U62) */ RFDEVICE_PA, /* DEVICE_MODULE_TYPE */ GEN_PA, /* DEVICE_MODULE_NAME */ 0, /* DEVICE_MODULE_TYPE_INSTANCE */ 1, /* ASSOCIATED_PHY_DEVICE_INSTANCE */ }, /* END - Device: TRX_HDET */
DEVICE_MODULE_TYPE:應當是RFDEVICE_PA(asm 為RFDEVICE_ASM)
DEVICE_MODULE_NAME:對於第三方PA來說是GEN_PA(asm 為GEN_ASM)
DEVICE_MODULE_TYPE_INSTANCE:該型別裝置的第幾個器件,asm 和 pa是獨立的。這裡的0表示是PA中的第一個器件。
ASSOCIATED_PHY_DEVICE_INSTANCE:對應上面的物理器件 PHY_DEVICE_INSTANCE
配置RF driver至此所有器件都已準備完畢,接下來就要針對各個制式來進行配置,需要的程式碼路徑為rfc_jolokia/rfc_card/<rf-card>/tech/rf_cardrf_tech config_data_ag.c
在配置之前需要根據硬體的RF原理圖得到一份配置表,接下來以cat4為例,在lte b1 下,需要有1T2R,所以需要有如下的配置表
tx 部分:
1、首先是Transceiver ,之前我們也提到過一般使用高通的WTR系列,這裡看到WTR2965掛載在RFFE5,輸出埠為DA4
2、接下來是PA,sky77638接在RFFE1上,輸入為IN_M,輸出為MB1,從之前的datasheet 中看到是port 6
3、額外有一個asm的新增,也是掛載在RFFE1上,開關打在TRX10上
rfc_device_info_type rf_card_wtr2965_non_ca2_4320_saw_tx0_lte_b1_device_info =
{
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_BAND1_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 */
},
},
{
RFDEVICE_PA,//型別
GEN_PA, /* NAME */
0, /* DEVICE_MODULE_TYPE_INSTANCE *///第幾個邏輯裝置
0 /*Warning: Not specified*/, /* PHY_PATH_NUM */
{
0 /* Orig setting: */, /* INTF_REV */
(0x1A5 << 22)/*mfg_id*/ | (0x1C << 14)/*prd_id*/ | (6)/*port_num*/, /* PORT_NUM *///pid mid port——num、
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
0, /* Array Filler */
},
},
{
RFDEVICE_ASM,
GEN_ASM, /* NAME */
1, /* DEVICE_MODULE_TYPE_INSTANCE *///第幾個邏輯裝置
0 /*Warning: Not specified*/, /* PHY_PATH_NUM */
(0x1A5 << 22)/*mfg_id*/ | (0x45 << 14)/*prd_id*/ | (10)/*port_num*/, /* PORT_NUM *///MID PID PORT NUM
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 */
},
},
},
};
rfc_sig_info_type rf_card_wtr2965_non_ca2_4320_saw_tx0_lte_b1_sig_cfg =
{
RFC_ENCODED_REVISION,
{
//新增GPIO
{ (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } }
},
};
RX部分只說主接收PRx部分,副接受DRx修改rx1即可:
1、首先是Transceiver ,輸出埠為MB3
2、額外有一個asm的新增,開關打在TRX10上
rfc_device_info_type rf_card_wtr2965_non_ca2_4320_saw_rx0_lte_b1_device_info = { RFC_ENCODED_REVISION, RFC_RX_MODEM_CHAIN_0, /* Modem Chain */ 0, /* NV Container */ 0, /* Antenna */ 2, /* 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_PRXLGY1_BAND1_PMB3, /* PORT *///埠,對應MB3 ( RFDEVICE_PA_LUT_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 */ (0x1A5 << 22)/*mfg_id*/ | (0x45 << 14)/*prd_id*/ | (10)/*port_num*/, /* PORT_NUM *///pid mid port 0, /* Array Filler */ 0, /* Array Filler */ 0, /* Array Filler */ 0, /* Array Filler */ }, }, }, }; rfc_sig_info_type rf_card_wtr2965_non_ca2_4320_saw_rx0_lte_b1_sig_cfg = { RFC_ENCODED_REVISION, { //{ (int)RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_11, { RFC_HIGH, 0 }, {RFC_LOW, 0 } },//新增GPIO裝置 { (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } } }, };
從上文也看到其實除了MIPI裝置,一般還有GPIO裝置,下面講下GPIO的問題
涉及到的程式碼路徑有:
\modem_proc\rfc_jolokia\target\mdm9607\src\Rfc_msm_signal_info_ag.c
\modem_proc\rfc_jolokia\target\mdm9607\inc\Rfc_msm_signal_info_ag.h
\modem_proc\rfc_jolokia\rf_card\rfc_CARD_om\common\src\Rfc_CARD_om_cmn_ag.cpp
\modem_proc\rfc_jolokia\rf_card\rfc_CARD_om\common\inc\Rfc_CARD_om_cmn_ag.h
前兩個檔案可以看做將一部分GPIO與MSM訊號建立對映,將晶片的GPIO pin 腳對映為軟體上的符號,後兩個問題針對card 再將這些MSM訊號與RFC_<rf_card>_sig_info中的訊號建立對映。接下來詳細說下
配置GPIO對映訊號
rfc_msm_signal_info_ag.h中定義了列舉型別的rfc_msm_signal_type,如下程式碼所示。
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_SIG_NUM,//總個數
RFC_MSM_SIG_INVALID = 0xFFFFFFFF,
}rfc_msm_signal_type;
rfc_msm_signal_info_ag.c 檔案中定義了陣列rfc_msm9607_signal_info,每一行代表的就是上面每個signal,
rfc_msm_signal_info_type rfc_mdm9607_signal_info[RFC_MSM_SIG_NUM] =
{
{ RFC_ANT_SEL , 47 , 4 , RFC_GRFC , 1, DAL_GPIO_OUTPUT ,"grfc[4]"}, /* Signal: RFC_MSM_RF_PATH_SEL_04, MSM Pin Name: GPIO_47*/
{ RFC_ANT_SEL , 50 , 7 , RFC_GRFC , 1, DAL_GPIO_OUTPUT ,"grfc[7]"}, /* Signal: RFC_MSM_RF_PATH_SEL_05, MSM Pin Name: GPIO_50*/
{ RFC_ANT_SEL , 52 , 9 , RFC_GRFC , 1, DAL_GPIO_OUTPUT ,"grfc[9]"}, /* Signal: RFC_MSM_RF_PATH_SEL_06, MSM Pin Name: GPIO_52*/
{ RFC_SIG_TYPE_INVALID , RFC_GPIO_INVALID, RFC_GRFC_NUM_NA, RFC_GPIO_GRFC_INVALID, 0, DAL_PLACEHOLDER_DALGpioDirectionType ,"rf_gpio_invalid_name"}, /* Signal: RFC_MSM_RF_PATH_SEL_07, MSM Pin Name: MAX*/
...
};
如第一行就是RFC_MSM_RF_PATH_SEL_00這個MSM訊號的結構體,而這個結構體定義如下
typedef struct
{
rfc_signal_type signal_type;
uint32 msm_gpio;
uint8 grfc_num;
rfc_gpio_grfc_type output_type;
unit8 function_select;
DALGpioDirectionType direction;
} rfc_msm_signal_info_type;
我們主要關心前兩個配置:
1. signal_type 主要有RFC_ANT_SEL、RFC_PA_RANGE0、RFC_PA_RANGE1、RFC_PA_ON、RFC_TX_ON_AG、RFC_RX_ON_AG等型別,其中RFC_ANT_SEL表示的是該訊號是一個天線選擇訊號,RFC_PA_ON表示該訊號是用於控制PA的開關。
2. msm_gpio 指晶片的GPIO pin 腳number,看原理圖可知
第三個配置grfc_num 對應的是配置表裡的值,但是如果不修改也沒有問題。
那已第一行為例,就說明RFC_MSM_RF_PATH_SEL_00代表的是GPIO 47 grfc4
在實際配置過程中個,一般先檢視rfc_mdm9607_signal_info中是否存在所使用的GPIO,以及該GPIO對應的訊號型別是否是需要的,GRFC number可以不同。如果存在,可以直接利用已經定義好的訊號,如果沒有,需要在rfc_msm_signal_info_ag.c和rfc_msm_signal_info_ag.h中按照上述程式碼新增即可。
配置完msm 訊號後,需要針對card 來做配置
rfc_<rf_card>_cmn_ag.h定義了列舉型別的wtr2965_non_ca2_4320_saw_sig_type,程式碼如下
typedef enum
{
...
RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_06,
RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_11,
RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_04,
RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_17,
RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05,
...
RFC_WTR2965_NON_CA2_4320_SAW_SIG_NUM,
RFC_WTR2965_NON_CA2_4320_SAW_SIG_INVALID,
}wtr2965_non_ca2_4320_saw_sig_type;
在rfc_<rf_card>_cmn_ag.cpp中定義了一個數組,該陣列的元素都是rfc_signal_info_type型別
rfc_signal_info_type rfc_wtr2965_non_ca2_4320_saw_sig_info[RFC_WTR2965_NON_CA2_4320_SAW_SIG_NUM + 1] =
{
...
{ RFC_MSM_RF_PATH_SEL_06 , RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /* RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_06 */
{ RFC_MSM_RF_PATH_SEL_11 , RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /* RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_11 */
{ RFC_MSM_RF_PATH_SEL_04 , RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /* RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_04 */
{ RFC_MSM_RF_PATH_SEL_17 , RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /* RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_17 */
{ RFC_MSM_RF_PATH_SEL_05 , RFC_LOW, DAL_GPIO_PULL_DOWN, DAL_GPIO_2MA, (DALGpioIdType)NULL }, /* RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05 */
...
{ (rfc_msm_signal_type)RFC_SIG_LIST_END , (rfc_logic_type)RFC_ENCODED_REVISION, DAL_GPIO_NO_PULL, DAL_GPIO_2MA, (DALGpioIdType)NULL } /* LAST SIG INDICATOR */
};
rfc_signal_info_type定義在rfa/rfc/common/inc/rfc_common.h中
typedef struct
{
rfc_msm_signal_type msm_sig_name;
rfc_logic_type init_state;
DALGpioPullType gpio_pull;
DALGpioDriveType gpio_drive;
#if defined(FEATURE_DIMEPM_MODEM) || defined(FEATURE_JOLOKIA_MODEM) || defined(FEATURE_TABASCO_MODEM)
DALGpioSignalType dal_signal;
#else
DALGpioIdType gpio_id;
#endif
} rfc_signal_info_type;
那這個陣列設定了對應的MSM訊號以及訊號的初始狀態,比如RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05,其與RFC_MSM_RF_PATH_SEL_05存在對映關係,訊號初始狀態是低電平(RFC_LOW),GPIO下拉(DAL_GPIO_PULL_DOWN)等等。
在rfc_msm_sig_info中,設定了RFC_MSM_<signal_name>對映的GRFC 訊號型別、GPIO 埠和GRFC number,而在RFC_<RF_card>_sig_info中,定義了對應的RFC_MSM_<signal_name>訊號以及初始狀態等內容。這樣就完成了從GPIO到MSM訊號對映,以及MSM訊號和rfc訊號的對映。
配置檔案中新增該GPIO器件
配置表如下
這個PA使用的是GPIO50 pin腳,切換到RF2埠,那從上面我們就看到RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05 對應的MSM訊號RFC_MSM_RF_PATH_SEL_05 ,採用的PIN腳就是50,那麼我們不需要修改。檢視datasheet
而在RF配置檔案中,當band5 rx1工作的時候需要使用埠RF2,那麼就可以將RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05 拉高即可
rfc_sig_info_type rf_card_wtr2965_non_ca2_4320_saw_rx1_lte_b5_sig_cfg =
{
RFC_ENCODED_REVISION,
{
{ (int)RFC_WTR2965_NON_CA2_4320_SAW_RF_PATH_SEL_05, { RFC_HIGH, 0 }, {RFC_LOW, 0 } },
{ (int)RFC_SIG_LIST_END, { RFC_LOW, 0 }, {RFC_LOW, 0 } }
},
};
參考文件:
80-NE606-4_APPLICATION NOTE- GENERIC RF CONTROLS(GRFC) CUSTOMIZATION.pdf
80-NE606-3_MIPI PA CUSTOMIZATION.pdf
80-ne606-2_c_third-party_mipi_asm_customization.pdf
80-P2164-1 Brf_bringup_on_mpss.ta.2.0_and_mpss.th.2..pdf