瑞芯微Rockchip开发者社区
直播中

ningkui

12年用户 831经验值
擅长:电源/新能源
私信 关注
[问答]

怎样去区分RK3288和RK3288W两者之间的型号呢

RK3288和RK3288W两者之间的型号是怎样获取的?
怎样去区分RK3288和RK3288W两者之间的型号呢?

回帖(1)

王境滨

2022-3-10 10:17:48
Platform:Android 5.1


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



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

封装丝印


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

RK3288


RK3288封装丝印


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, "%sn", soc);
}
该函数中共提供了两个功能:SoCType,且只提供了show方法。
SoC即为具体的芯片型号,而Type表示芯片系列。
比如在我的平台上分别获取SoC和Type,结果如下:

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


rk也提供了prop来获取CPU型号,可读取ro.rk.soc,如下:

getprop | grep soc
[ro.rk.soc]: [rk3288w]
总结


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

更多回帖

发帖
×
20
完善资料,
赚取积分