]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/davinci/schmoogie/schmoogie.c
8b615a9929c4b5b5e94dbf03c36c3cc1cf03adc2
[karo-tx-uboot.git] / board / davinci / schmoogie / schmoogie.c
1 /*
2  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
3  *
4  * Parts are shamelessly stolen from various TI sources, original copyright
5  * follows:
6  * -----------------------------------------------------------------
7  *
8  * Copyright (C) 2004 Texas Instruments.
9  *
10  * ----------------------------------------------------------------------------
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  * ----------------------------------------------------------------------------
25  */
26
27 #include <common.h>
28 #include <i2c.h>
29 #include <asm/arch/hardware.h>
30 #include <asm/arch/davinci_misc.h>
31
32 DECLARE_GLOBAL_DATA_PTR;
33
34 int board_init(void)
35 {
36         /* arch number of the board */
37         gd->bd->bi_arch_number = MACH_TYPE_SCHMOOGIE;
38
39         /* address of boot parameters */
40         gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
41
42         /* Configure AEMIF pins (although this should be configured at boot time
43          * with pull-up/pull-down resistors) */
44         REG(PINMUX0) = 0x00000c1f;
45
46         davinci_errata_workarounds();
47
48         /* Power on required peripherals */
49         lpsc_on(DAVINCI_LPSC_GPIO);
50
51 #if !defined(CONFIG_SYS_USE_DSPLINK)
52         /* Powerup the DSP */
53         dsp_on();
54 #endif /* CONFIG_SYS_USE_DSPLINK */
55
56         davinci_enable_uart0();
57         davinci_enable_emac();
58         davinci_enable_i2c();
59
60         lpsc_on(DAVINCI_LPSC_TIMER1);
61         timer_init();
62
63         return(0);
64 }
65
66 int misc_init_r(void)
67 {
68         u_int8_t        tmp[20], buf[10];
69         int             i = 0;
70
71         /* Set serial number from UID chip */
72         const u_int8_t  crc_tbl[256] = {
73                         0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
74                         0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
75                         0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
76                         0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
77                         0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
78                         0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
79                         0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
80                         0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
81                         0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
82                         0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
83                         0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
84                         0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
85                         0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
86                         0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
87                         0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
88                         0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
89                         0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
90                         0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
91                         0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
92                         0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
93                         0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
94                         0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
95                         0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
96                         0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
97                         0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
98                         0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
99                         0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
100                         0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
101                         0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
102                         0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
103                         0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
104                         0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35
105                 };
106
107         /* Set serial number from UID chip */
108         if (i2c_read(CONFIG_SYS_UID_ADDR, 0, 1, buf, 8)) {
109                 printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
110                 setenv("serial#", "FAILED");
111         } else {
112                 if (buf[0] != 0x70) {
113                         /* Device Family Code */
114                         printf("\nUID @ 0x%02x read FAILED!!!\n", CONFIG_SYS_UID_ADDR);
115                         setenv("serial#", "FAILED");
116                 }
117         }
118         /* Now check CRC */
119         tmp[0] = 0;
120         for (i = 0; i < 8; i++)
121                 tmp[0] = crc_tbl[tmp[0] ^ buf[i]];
122
123         if (tmp[0] != 0) {
124                 printf("\nUID @ 0x%02x - BAD CRC!!!\n", CONFIG_SYS_UID_ADDR);
125                 setenv("serial#", "FAILED");
126         } else {
127                 /* CRC OK, set "serial" env variable */
128                 sprintf((char *)&tmp[0], "%02x%02x%02x%02x%02x%02x",
129                         buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);
130                 setenv("serial#", (char *)&tmp[0]);
131         }
132
133         return(0);
134 }