原文地址:https://blog.csdn.net/u011212816/article/details/80917199
在上一篇文章中,已经添加了新的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, { <strong>RFC_HIGH,</strong> 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
---------------------
作者:shawn4096
来源:CSDN
原文:https://blog.csdn.net/u011212816/article/details/80917199
版权声明:本文为博主原创文章,转载请附上博文链接!