1. 程式人生 > >高通RFC適配RFFE-配置RF

高通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