imx6 获取cpu型号
在imx6平台可以通过cpu_is_mx6q() 或者cpu_is_mx6dl()获取imx6的cpu型号
路径:kernel/arch/arm/mach-mx6/board-mx6q_sabresd.c 中的mx6_sabresd_board_init()
下面以imx6q为例
1.cpu_is_mx6q()跟CONFIG_SOC_IMX6Q和__mxc_cpu_type有关
路径:kernel/arch/arm/plat-mxc/include/mach/mxc.h
#ifdef CONFIG_SOC_IMX6Q
# define mxc_cpu_type __mxc_cpu_type
# define cpu_is_mx6q() (mxc_cpu_type == MXC_CPU_MX6Q)
# define cpu_is_mx6dl() (mxc_cpu_type == MXC_CPU_MX6DL)
# define cpu_is_mx6sl() (mxc_cpu_type == MXC_CPU_MX6SL)
#else
# define cpu_is_mx6q() (0)
# define cpu_is_mx6dl() (0)
# define cpu_is_mx6sl() (0)
# define mx6q_revision(void) (0)
# define mx6dl_revision(void) (0)
#endif
2.在config文件中定义 CONFIG_SOC_IMX6Q=y
路径:kernel_imx/arch/arm/configs/imx6_android_*****_defconfig
3.__mxc_cpu_type定义在下面路径
路径:kernel/arch/arm/plat-mxc/cpu.c
unsigned int __mxc_cpu_type;
EXPORT_SYMBOL(__mxc_cpu_type);
extern int mxc_early_serial_console_init(unsigned long base, struct clk *clk);
void (*set_num_cpu_op)(int num);
void mxc_set_cpu_type(unsigned int type)
{
__mxc_cpu_type = type;
}
从上可以看出是通过mxc_set_cpu_type设置cpu type的。
4.kernel/arch/arm/mach-mx6/mm.c
mx6_set_cpu_type 从寄存器(ANATOP_BASE_ADDR+0x260)中读出imx6q的型号
static void mx6_set_cpu_type(void)
{
u32 cpu_type = readl(IO_ADDRESS(ANATOP_BASE_ADDR + 0x280));
cpu_type >>= 16;
if (cpu_type == 0x60) {
mxc_set_cpu_type(MXC_CPU_MX6SL);
imx_print_silicon_rev("i.MX6SoloLite", mx6sl_revision());
return;
}
cpu_type = readl(IO_ADDRESS(ANATOP_BASE_ADDR + 0x260));
cpu_type >>= 16;
if (cpu_type == 0x63) {
mxc_set_cpu_type(MXC_CPU_MX6Q);
imx_print_silicon_rev("i.MX6Q", mx6q_revision());
} else if (cpu_type == 0x61) {
mxc_set_cpu_type(MXC_CPU_MX6DL);
imx_print_silicon_rev("i.MX6DL/SOLO", mx6dl_revision());
} else
pr_err("Unknown CPU type: %x\n", cpu_type);
}
找到以下定义
#define ANATOP_BASE_ADDR (AIPS1_OFF_BASE_ADDR + 0x48000)
#define AIPS1_OFF_BASE_ADDR (ATZ1_BASE_ADDR + 0x80000)
#define ATZ1_BASE_ADDR AIPS1_ARB_BASE_ADDR
#define AIPS1_ARB_BASE_ADDR 0x02000000
所以ANATOP_BASE_ADDR+0x260 = 0x020C8260.
从datasheet中得到值为0x00630100。右移16位就是0x63,就是imx6q,然后设置MXC_CPU_MX6Q。
在datasheet中搜索20C_8000h或者0x260比较容易搜到这个寄存器。
5.因为设置了__mxc_cpu_type=MXC_CPU_MX6Q,回到第1步。
# define cpu_is_mx6q() (mxc_cpu_type == MXC_CPU_MX6Q)
所以define cpu_is_mx6q() 为 1