Rockchip RK3288型号获取


Platform:Android 5.1


Rockchip RK3288系列也分了好几个型号,这里主要区分:RK3288RK3288W
本文主要介绍两者之间型号的获取与区分,通过以下方式:

  • 封装丝印
  • 代码
  • adb或串口

封装丝印

RK3288和RK3288W的封装丝印是有区别的,主要通过丝印后缀来判断。

RK3288

RK3288封装丝印
RK3288

RK3288W

RK3288W封装丝印
RK3288W

两者区别在Subcontractor Code末尾有无W。有W的就是RK3288W。

代码

RK提供了API判断当前SoC型号,API如下:

bool soc_is_rk3288(void)
bool soc_is_rk3288w(void)

其原型位于include/linux/rockchip/cpu.h中,如下:

#ifdef CONFIG_ARM
#define ROCKCHIP_SOC(id, ID) \
static inline bool soc_is_rk##id(void) \
{ \
    return (rockchip_soc_id & ROCKCHIP_SOC_MASK) == ROCKCHIP_SOC_RK ##ID; \
}
#else
#define ROCKCHIP_SOC(id, ID) \
static inline bool soc_is_rk##id(void) { return false; }
#endif

ROCKCHIP_SOC(2926, 2926)
ROCKCHIP_SOC(2928g, 2928G)
ROCKCHIP_SOC(2928l, 2928L)
ROCKCHIP_SOC(3028a, 3028A)
ROCKCHIP_SOC(3026, 3026)
ROCKCHIP_SOC(3126, 3126)
ROCKCHIP_SOC(3126b, 3126B)
ROCKCHIP_SOC(3128, 3128)
ROCKCHIP_SOC(3036, 3036)
ROCKCHIP_SOC(3000, 3000)
ROCKCHIP_SOC(3066, 3066)
ROCKCHIP_SOC(3068, 3068)
ROCKCHIP_SOC(3066b, 3066B)
ROCKCHIP_SOC(3168, 3168)
ROCKCHIP_SOC(3028, 3028)
ROCKCHIP_SOC(3188, 3188)
ROCKCHIP_SOC(3188plus, 3188PLUS)
ROCKCHIP_SOC(3190, 3190)
ROCKCHIP_SOC(3288, 3288)
ROCKCHIP_SOC(3288w, 3288W)

这里有个宏ROCKCHIP_SOC,一个经典用法预处理宏##的拼接。
例如ROCKCHIP_SOC(3288w, 3288W),会将第一个参数3288w拼接到函数末尾soc_is_rk3288w,在其返回函数中,将第二个参数拼接,拼接为ROCKCHIP_SOC_RK3288W,一个完整的示例:

static inline bool soc_is_rk3288w(void) 
{ 
    return (rockchip_soc_id & ROCKCHIP_SOC_MASK) == ROCKCHIP_SOC_RK3288W; \
}

rockchip_soc_id:芯片ID。在kernel启动时I/O静态映射过程中指定,RK3288系列首先赋值为ROCKCHIP_SOC_RK3288,然后会读取HDMI Revision是否是0x1A,是的话将该值赋值为ROCKCHIP_SOC_RK3288W

#define ROCKCHIP_SOC_RK3288W    (ROCKCHIP_CPU_RK3288 | 0x01)
#define ROCKCHIP_CPU_RK3288     0x32880000

ROCKCHIP_SOC_MASK:

 #define ROCKCHIP_SOC_MASK  (ROCKCHIP_CPU_MASK | 0xff)
 #define ROCKCHIP_CPU_MASK       0xffff0000

总结

调用soc_is_rk3288(),返回true表示该soc是RK3288,返回false表示该soc不是RK3288。
调用soc_is_rk3288w(),返回true表示该soc是RK3288W,返回false表示该soc不是RK3288W。

adb或串口

RK提供了sys文件接口来获取soc型号,接口是:

/sys/devices/system/cpu/soc

在串口控制台或adb环境下cat该文件即可得到soc型号,例如返回”RK3288”,即表示该SoC是RK3288

该sys接口的实现位于arch/arm/mach-rockchip/cpu.c中:

static ssize_t soc_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    const char *soc;

    if (soc_is_rk3288())
        soc = "rk3288";
    else if (soc_is_rk3288w())
        soc = "rk3288w";
    else if (soc_is_rk3190())
        soc = "rk3190";
    else if (soc_is_rk3188plus())
        soc = "rk3188+";
    else if (soc_is_rk3188())
        soc = "rk3188";
    else if (soc_is_rk3168())
        soc = "rk3168";
    else if (soc_is_rk3028())
        soc = "rk3028";
    else if (soc_is_rk3066b())
        soc = "rk3066b";
    else if (soc_is_rk3028a())
        soc = "rk3028a";
    else if (soc_is_rk3026())
        soc = "rk3026";
    else if (soc_is_rk2928g())
        soc = "rk2928g";
    else if (soc_is_rk2928l())
        soc = "rk2928l";
    else if (soc_is_rk2926())
        soc = "rk2926";
    else if (soc_is_rk3066())
        soc = "rk3066";
    else if (soc_is_rk3068())
        soc = "rk3068";
    else if (soc_is_rk3000())
        soc = "rk3000";
    else if (soc_is_rk3126() || soc_is_rk3126b())
        soc = "rk3126";
    else if (soc_is_rk3128())
        soc = "rk3128";
    else
        soc = "";

    return sprintf(buf, "%s\n", soc);
}

该函数中共提供了两个功能:SoCType,且只提供了show方法。
SoC即为具体的芯片型号,而Type表示芯片系列。
比如在我的平台上分别获取SoC和Type,结果如下:

cat /sys/devices/system/cpu/soc
rk3288w
cat /sys/devices/system/cpu/type
rk3288

总结

通过这几种方式都可以获取主控型号,在驱动处理或者打补丁时可做区分。

猜你喜欢

转载自blog.csdn.net/u014770862/article/details/81411308