1 From a0e1ec967f99d08ce0a48c45a509959453e5f3a7 Mon Sep 17 00:00:00 2001
2 From: Jason Liu <r64343@freescale.com>
3 Date: Fri, 14 May 2010 16:08:22 +0800
4 Subject: [PATCH] ENGR00123488 MX53 Board Identification
6 The CPU_ID0 analog voltage level is obtained by reading ADC
7 channel 12 of the LTC2495 and the CPU_ID1 analog voltage
8 level is obtained by reading ADC channel 13.
10 The ADC data register value read from the LTC2495 is a 24 bit value.
11 For example, an ADC value that reads between 0xB3CF3E and 0xB9E79E
12 indicates a 130k ohm resistor is populated on the daughtercard,
13 which corresponds to ID level 20
15 By using CPU_ID0, CPU_ID1 to identify the board for example:
16 CPU_ID0 = 21, CPU_ID1 = 15, MX53-EVK with DDR2 1GByte RevB
18 Signed-off-by:Jason Liu <r64343@freescale.com>
20 board/freescale/mx53_evk/mx53_evk.c | 170 ++++++++++++++++++++++++++++++++++-
21 1 files changed, 167 insertions(+), 3 deletions(-)
23 diff --git a/board/freescale/mx53_evk/mx53_evk.c b/board/freescale/mx53_evk/mx53_evk.c
24 index 9526b2d..6be0b37 100644
25 --- a/board/freescale/mx53_evk/mx53_evk.c
26 +++ b/board/freescale/mx53_evk/mx53_evk.c
27 @@ -282,6 +282,168 @@ void setup_core_voltages(void)
28 /* Raise the core frequency to 800MHz */
29 writel(0x0, CCM_BASE_ADDR + CLKCTL_CACRR);
32 +static int __read_adc_channel(unsigned int chan)
34 + unsigned char buf[4] = { 0 };
36 + buf[0] = (0xb0 | ((chan & 0x1) << 3) | ((chan >> 1) & 0x7));
38 + /* LTC2495 need 410ms delay */
41 + if (i2c_write(0x14, chan, 0, &buf[0], 1)) {
42 + printf("%s:i2c_write:error\n", __func__);
46 + /* LTC2495 need 410ms delay*/
49 + if (i2c_read(0x14, chan, 0, &buf[0], 3)) {
50 + printf("%s:i2c_read:error\n", __func__);
54 + return buf[0] << 16 | buf[1] << 8 | buf[2];
57 +static int __lookup_board_id(int adc_val)
61 + if (adc_val < 0x3FFFC0)
63 + else if (adc_val < 0x461863)
65 + else if (adc_val < 0x4C30C4)
67 + else if (adc_val < 0x524926)
69 + else if (adc_val < 0x586187)
71 + else if (adc_val < 0x5E79E9)
73 + else if (adc_val < 0x64924A)
75 + else if (adc_val < 0x6AAAAC)
77 + else if (adc_val < 0x70C30D)
79 + else if (adc_val < 0x76DB6F)
81 + else if (adc_val < 0x7CF3D0)
83 + else if (adc_val < 0x830C32)
85 + else if (adc_val < 0x892493)
87 + else if (adc_val < 0x8F3CF5)
89 + else if (adc_val < 0x955556)
91 + else if (adc_val < 0x9B6DB8)
93 + else if (adc_val < 0xA18619)
95 + else if (adc_val < 0xA79E7B)
97 + else if (adc_val < 0xADB6DC)
99 + else if (adc_val < 0xB3CF3E)
101 + else if (adc_val < 0xB9E79F)
103 + else if (adc_val < 0xC00000)
111 +static int __print_board_info(int id0, int id1)
119 + printf("MX53-EVK with DDR2 1GByte RevB\n");
123 + printf("MX53-EVK with DDR2 2GByte RevA1\n");
127 + printf("MX53-EVK with DDR2 2GByte RevA2\n");
130 + printf("Unkown board id1:%d\n", id1);
140 + printf("MX53 1.5V DDR3 x8 CPU Card, Rev. A\n");
144 + printf("MX53 1.8V DDR2 x8 CPU Card, Rev. A\n");
148 + printf("Unkown board id1:%d\n", id1);
156 + printf("Unkown board id0:%d\n", id0);
164 +int identify_board_id(void)
167 + int bd_id0, bd_id1;
169 +#define CPU_CHANNEL_ID0 0xc
170 +#define CPU_CHANNEL_ID1 0xd
172 + ret = bd_id0 = __read_adc_channel(CPU_CHANNEL_ID0);
176 + ret = bd_id1 = __read_adc_channel(CPU_CHANNEL_ID1);
180 + ret = bd_id0 = __lookup_board_id(bd_id0);
184 + ret = bd_id1 = __lookup_board_id(bd_id1);
188 + ret = __print_board_info(bd_id0, bd_id1);
195 void spi_io_init(struct imx_spi_dev_t *dev)
196 @@ -520,10 +682,12 @@ int board_late_init(void)
200 - printf("Board: MX53 EVK ");
205 +#ifdef CONFIG_I2C_MXC
206 + identify_board_id();
208 + printf("Boot Reason: [");
210 switch (__REG(SRC_BASE_ADDR + 0x8)) {