高通RFC适配RFFE-配置RF

原文地址: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 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值