Platform:Android 5.1
Rockchip RK3288系列也分了好几个型号,这里主要区分:RK3288和RK3288W
本文主要介绍两者之间型号的获取与区分,通过以下方式:
- 封装丝印
- 代码
- 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, "%s\n", soc);
}
该函数中共提供了两个功能:SoC和Type,且只提供了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]
总结
通过这几种方式都可以获取主控型号,在驱动处理或者打补丁时可做区分。