本文转载自:https://blog.csdn.net/u011212816/article/details/80828625

RF driver主要设计到的器件

1、Transceiver

2、RFFE(RF Front End)

(1)PA

(2)ASM

(3)PAPM

其中Transceiver基本是以高通参考设计采用的芯片为主,为WTRXXX系列,但是RFFE由于成本问题,往往不采用参考设计中的芯片,RFFE这边只讨论PA 和ASM,一般分为MiPi 和GRFC

MIPI 设备通过寄存器配置PA以及ASM,GRFC则是通过GPIO配置。

这里涉及的代码为MDM9607芯片的Jolokia版本
关于RFC 涉及到的代码目录有

1、modem_proc/rfc_jolokia//核心目录,存放参考设计的RF driver ,我们自己添加的也在这里

2、modem_proc/rfcdevice_pa//存放MIPI pa 设备

3、modem_proc/rfcdevice_asm//存放MIPI asm 设备

4、modem_proc/rfctarget_jolokia//存放RF硬件部分的nv

5、modem_proc/rfcnv//存放modem版本下定义nv项的文件nvdefintion.xml

如何添加一个新的MIPI pa 芯片

如果RF前端采用了一款新的MIPI 的pa,需要在modem_proc/rfcdevice_pa新建一个PA设备,在添加之前我们需要查看pa的datasheet,主要有两部分需要着重查看:端口结构图,寄存器,以sky77638为例,这款芯片复用了PA 以及ASM

结构图

该器件的输入端口主要有RFIN_HB,RFIN_MB,RFIN_LB,RFIN_VLB,输出端口有HB1、HB2、HB3、MB1、MB2、MB3、MB4、LB1、LB2、LB3、LB4、LB5

ASM部分包括HBRX1和HBRX2。

寄存器

寄存器表比较重要的有:0x00 0x02 0x1d 0x1e 0x1f

0X00:输出端口,输入端口,以及PA模式

0X02 ASM的端口

0X1D 0X1E 0X1F pid mid

看完datasheet,我们需要修改目录下modem_proc/rfcdevice_pa/src

1. Create the rfdevice_pa_XXX_data_ag.h.复制已有的文件,修改类的名称

2. Create the rfdevice_pa_XXX_data_ag.cpp

填加PA_SET_BIAS_REG/DATA

填加PA_set_range_REG/DATA

填加 PA_ON_REG/DATA

填加PA_OFF_REG/DATA

填加 PA_TRIGGER/DATA

填写PID MIDPRO_REV

#define RFDEVICE_PA_SKY_XXX_NUM_PORTS 16//查看reg0x00中port口为16(0000-1111)
#define RFDEVICE_PA_SKY_XXX_PA_SET_BIAS_NUM_REGS 2//reg中有primary bias 和 second bias 在0x01 和0x03,前面没有列出来
static uint8 rfdevice_pa_sky_XXX_pa_set_bias_regs[RFDEVICE_PA_SKY_XXX_PA_SET_BIAS_NUM_REGS] =  {0x01, 0x03};寄存器
static int16 rfdevice_pa_sky_XXX_pa_set_bias_data[RFDEVICE_PA_SKY_XXX_NUM_PORTS][4][RFDEVICE_PA_SKY_XXX_PA_SET_BIAS_NUM_REGS] =
{
......具体值没有通用性
};
#define RFDEVICE_PA_SKY_XXX_PA_SET_RANGE_NUM_REGS 1//pa range
static uint8 rfdevice_pa_sky_XXX_pa_set_range_regs[RFDEVICE_PA_SKY_XXXX_PA_SET_RANGE_NUM_REGS] =  {0x00, };
static int16 rfdevice_pa_sky_XXX_pa_set_range_data[RFDEVICE_PA_SKY_XXXX_NUM_PORTS][4][RFDEVICE_PA_SKY_XXX_PA_SET_RANGE_NUM_REGS] =
{
  { /* PORT NUM: 0 *//* PA's Disable */
    { 0x00, },  /* PA Range: 0 */HPM
    { 0x00, },  /* PA Range: 1 */LPM
    { 0x00, },  /* PA Range: 2 */LPM
    { 0x00, },  /* PA Range: 3 */LPM
  },
.......
};
#define RFDEVICE_PA_SKY_XXX_PA_ON_NUM_REGS 1//一般不设置
static uint8 rfdevice_pa_sky_XXX_pa_on_regs[RFDEVICE_PA_SKY_XXX_PA_ON_NUM_REGS] =  {RFFE_INVALID_REG_ADDR /*Warning: Not Specified*/, };
static int16 rfdevice_pa_sky_XXX_pa_on_data[RFDEVICE_PA_SKY_XXX_NUM_PORTS][RFDEVICE_PA_SKY_XXXPA_ON_NUM_REGS] =
{
  { /* PORT NUM: 0 */
    RF_REG_INVALID,
  },
  .....
};
#define RFDEVICE_PA_SKY_XXX_PA_OFF_NUM_REGS 1
static uint8 rfdevice_pa_sky_XXX_pa_off_regs[RFDEVICE_PA_SKY_XXX_PA_OFF_NUM_REGS] =  {0x00, };
static int16 rfdevice_pa_sky_XXX_pa_off_data[RFDEVICE_PA_SKY_XXX_NUM_PORTS][RFDEVICE_PA_SKY_XXX_PA_OFF_NUM_REGS] =
{
  { /* PORT NUM: 0 */
    0x02, //需要将PA disable PA 改为LOW POWER,所以0X00寄存器设置为2

},
.........
};
#define RFDEVICE_PA_SKY_XXX_PA_TRIGGER_NUM_REGS 1
static uint8 rfdevice_pa_sky_XXX_pa_trigger_regs[RFDEVICE_PA_SKY_XXX_PA_TRIGGER_NUM_REGS] =  {0x1C, };
static int16 rfdevice_pa_sky_XXX_pa_trigger_data[RFDEVICE_PA_SKY_XXX_NUM_PORTS][RFDEVICE_PA_SKY_XXX_PA_TRIGGER_NUM_REGS] =
{
  { /* PORT NUM: 0 */
    0x07, //默认都打开,所以为7
  },
............
};
boolean rfdevice_pa_sky_XXX_v3_data_ag::device_info_get( rfdevice_pa_info_type *pa_info )
{
  {
    pa_info->mfg_id = 0x01A5;//MID
    pa_info->prd_id = 0x1C;//PID
    pa_info->prd_rev = 2;//自定义
    pa_info->num_ports = RFDEVICE_PA_SKY_XXX_NUM_PORTS;
    pa_info->num_pa_ranges = 4;    
    ret_val = TRUE;

}

对以上的代码PA RANGE的配置,值得一提的是,一般虽然设置为4个range,但是其实用不到,具体参考NV #2029 NV_WCDMA_PA_RANGE_MAP_I ,一般设置为{1,0,0,0},如下图,所以我们在PA RANGE中其实第一个是HPM,后面是LPM

3. Modify the rfdevice_pa_factory.cpp file.

#include"rfdevice_pa_XXX_data_ag.h"     // 添加器件XYZ的头文件
.....
   else if ( mfg_id ==  0x01A5 && prd_id == 0x1C  &&prd_rev == 0)
    {//填加这款PA的mid pid prd_rev
        pa_data = rfdevice_pa_XXX_data_ag::get_instance();

}

如何添加一个新的MIPI asm 芯片

mipi asm 配置比pa简单很多,毕竟只是一个单刀多掷的开关,首先依然查看datasheet

结构图

寄存器
0X00是开关真值表

001D 001E 001F 依然是 pid mid

接下来修改目录下modem_proc/rfcdevice_asm/src

1、Create therfdevice_asm_XXX_data_ag.h //复制已有的文件,修改类的名称

2、Create therfdevice_asm_XXX_data_ag.cpp file

ASM_ON_REG

ASM_OFF_REG

ASM_TRIGGER_REG

填写PID MIDPRO_REV

#define RFDEVICE_ASM_XXX_NUM_PORTS 11//真值表个数

#define RFDEVICE_ASM_XXX_ASM_ON_NUM_REGS 1
static uint8 rfdevice_asm_XXX_asm_on_regs[RFDEVICE_ASM_XXX_ASM_ON_NUM_REGS] =  {0x00, };//寄存器地址
static int16 rfdevice_asm_XXX_asm_on_data[RFDEVICE_ASM_XXX_NUM_PORTS][RFDEVICE_ASM_XXX_ASM_ON_NUM_REGS] =
{
  { /* PORT NUM: 0 *//* Isolation*/
    0x00,
  },
  { /* PORT NUM: 1 *//* TRX1 */查看真值表
    0x02,
  },
  { /* PORT NUM: 2 *//* TRX2 */
    0x0A,
  },
  { /* PORT NUM: 3 *//* TRX3 */
    0x0E,
  },
.....
};

#define RFDEVICE_ASM_XXX_ASM_OFF_NUM_REGS 1
static uint8 rfdevice_asm_XXX_asm_off_regs[RFDEVICE_ASM_XXX_ASM_OFF_NUM_REGS] =  {0x00, };
static int16 rfdevice_asm_XXX_asm_off_data[RFDEVICE_ASM_SXXX_NUM_PORTS][RFDEVICE_ASM_XXX_ASM_OFF_NUM_REGS] =
{
  { /* PORT NUM: 0 */
    0x00, //第一个port为关
  },
  ....
};

#define RFDEVICE_ASM_XXX_ASM_TRIGGER_NUM_REGS 1
static uint8 rfdevice_asm_XXX_asm_trigger_regs[RFDEVICE_ASM_XXX_ASM_TRIGGER_NUM_REGS] =  {0x1C, };//trigger寄存器
static int16 rfdevice_asm_XXX_asm_trigger_data[RFDEVICE_ASM_SXXX_NUM_PORTS][RFDEVICE_ASM_XXX_ASM_TRIGGER_NUM_REGS] =
{
  { /* PORT NUM: 0 */
    0x07, //默认为7
  },
......
};
boolean rfdevice_asm_sky_XXX_data_ag::device_info_get( rfdevice_asm_info_type *asm_info )
{
    asm_info->mfg_id = 0x1A5;//PID
    asm_info->prd_id = 0x45;//MID
    asm_info->prd_rev = 0;
    asm_info->num_ports = RFDEVICE_ASM_XXX_NUM_PORTS;
    ret_val = TRUE;
}

3、Modify the rfdevice_asm_factory.cpp file

#include"rfdevice_asm_XXX_data_ag.h"     // 添加器件XYZ的头文件
.....
   else if ( mfg_id ==  0x01A5 && prd_id == 0x1C  &&prd_rev == 0)
    {//填加这款ASM的mid pid prd_rev
        pa_data = rfdevice_asm_XXX_data_ag::get_instance();

}
https://blog.csdn.net/u011212816/article/details/80828625

高通RFC适配RFFE-添加MIPI设备【转】的更多相关文章

  1. 高通(QCOM)sensor bring up

    高通7150平台 1.添加驱动文件 2.添加编译 3.配置json文件 4.高通默认配置 5.部分sensor外挂电源 6.遇到的问题 1.添加驱动文件 路径:adsp_proc/ssc/sensor ...

  2. Linux加载DTS设备节点的过程(以高通8974平台为例)

    DTS是Device Tree Source的缩写,用来描述设备的硬件细节.在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码, ...

  3. 最新内核3.4)Linux 设备树加载I2C client adapter 的流程(内核3.4 高通)【转】

    转自:https://blog.csdn.net/lsn946803746/article/details/52515225 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转 ...

  4. 高通方案的Android设备几种开机模式的进入与退出

    高通方案的Android设备主要有以下几种开机模式,Android.EDL.Fastboot.Recovery和FFBM,其进入及退出的方式如下表. 开机模式 屏幕显示 冷启动 热启动 按键退出 命令 ...

  5. 高通移植mipi LCD的过程LK代码

    lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...

  6. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  7. 高通安卓调试LCD几方面总结

    来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...

  8. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  9. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

随机推荐

  1. 开启 NFS 文件系统提升 Vagrant 共享目录的性能

    Vagrant 默认的 VirtualBox 共享目录方式读写性能表现并不好,好在 Vagrant 支持 NFS 文件系统方式的共享,我们可以启用 NFS 提升性能 开启方法 首先要把虚拟机的网络设置 ...

  2. Windows server 2016 安装及ORACLE 12C 安装

    首先创建虚拟机,选择windows server 2016 启动虚拟机,进入安装界面,语言默认中文,选择下一步 选择标准安装(桌面) 选择接受条款 选择自定义安装 进行分区,如下图所示 进行安装 设定 ...

  3. Effective Java 目录

    <Effective Java>目录摘抄. 我知道这看起来很糟糕.当下,自己缺少实际操作,只能暂时摘抄下目录.随着,实践的增多,慢慢填充更多的示例. Chapter 2 Creating ...

  4. Android(八) HandlerThread

    1.Looper Looper used to run a message loop for a thread. Threads by default do not have a message lo ...

  5. Idempotent --------幂等

    1.在某二元运算下,幂等元素是指被自己重复运算的结果等于它自己的元素.例如,乘法下唯一两个幂等实数为0和1.

  6. getContextPath、getServletPath、getRequestURI、request.getRealPath的区别

    1 区别 假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 1.1 System.o ...

  7. android 网络监测

    public class NetWorkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Contex ...

  8. Scala系统学习(五):Scala访问修辞符

    本章将介绍Scala访问修饰符.包,类或对象的成员可以使用私有(private)和受保护(protected)的访问修饰符进行标注,如果不使用这两个关键字的其中一个,那么访问将被视为公开(public ...

  9. [py]处理文件的3个方法

    file处理的3个方法: f和f.readlines效果一样 # f.read() 所有行 -> 字符串 # f.readline 读取一行 -> 字符串 # f.readlines 所有 ...

  10. (转)Elasticsearch 的坑爹事——记录一次mapping field修改过程

    Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...