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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值