嵌入式开发者社区

标题: TL138 uboot是怎么区分配置两款核心板的 [打印本页]

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: f  K6 b. t: `4 S0 R9 c9 [) K核心板2:DDR2 256M Byte   NAND FLASH 8G bit
  }6 a' T2 A; H8 d- |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% O, d1 J3 L) ^. D  L0 g0 [8 K# [% i% p) `! f! Y/ O
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?% k  A$ l# @( H- s3 d; S
8 o: c; w8 Q- E& B6 ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 @/ h) S# w: e7 x, K, T! }+ M. J. P/*; j* d3 Q% n5 F( {) @( x
* Check memory range for valid RAM. A simple memory test determines8 s/ l5 Y' H" ^3 }# ]
* the actually available RAM size between addresses `base' and8 b# _! \9 D% q9 B
* `base + maxsize'.$ Q9 R) [( r  |: D$ |' q, Y
*/% w9 l( z% q) Y! K# R0 G9 i
long get_ram_size(long *base, long maxsize)
9 _  f) V! P9 o2 Q5 Q& b/ \8 r{, T- m* p  c. i7 T8 I# G- T
        volatile long *addr;$ [. `  ^- T6 N3 O8 A$ u! z0 L* ?
        long           save[32];
: O' n1 ]8 T$ q: t: @        long           cnt;
1 C& |, K" t: }  t. ~; E        long           val;& [: D5 U, s3 ^" V
        long           size;8 g- M5 U  t' R8 U+ v# P+ p: s
        int            i = 0;
1 t0 Q, e. o6 e: Z* v
% O3 r( Y1 p) s% c/ X) }. D# E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 g) M) _  Q. y! A; Z: d# b                addr = base + cnt;        /* pointer arith! */9 h' M6 ^8 J9 p7 x5 E
                sync ();) z2 z0 O+ Q- J2 _/ Y$ c8 J; Q
                save[i++] = *addr;
5 Y% k+ }% D& y. j8 y& B                sync ();! j( m) a- i3 I0 H! M
                *addr = ~cnt;
) L( R, i( k# y5 E+ r        }
" w- [. O2 ?  s* W4 a3 {' }" L, ]. \1 p- z: E( P! G: H+ u
        addr = base;
1 ?7 m1 M; q6 f! Z8 \6 b# Y        sync ();
+ T$ A4 S- T& |. z  N$ Q        save = *addr;
# s4 f: i5 Y' l" Y  m5 k- o7 F        sync ();( I6 j; \$ e& w9 W0 Z$ q# m7 k) i* D
        *addr = 0;
. r& \9 R. [" A( L0 ]/ g3 H  W" `+ B+ N( o" m3 `  U$ _* G4 H; i
        sync ();
! M  |6 S  Y( O! B% G4 m) p) p        if ((val = *addr) != 0) {1 _  g! R# K, M8 N) c
                /* Restore the original data before leaving the function.
  Y! N! S4 G/ {                 */! K8 j4 c5 t+ A  a: T
                sync ();. o; t( _$ h. g) m) U6 o" R3 O
                *addr = save;& a/ |) c2 Z  ~1 x
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ C. K$ s1 i" o6 _7 e4 E* L
                        addr  = base + cnt;
) L0 m3 e' b8 ^8 i                        sync ();2 H0 g7 H8 i$ f% L
                        *addr = save[--i];) X- }& ^7 _, D2 z' h
                }
$ `( o: b6 a# U/ l; M* f; ]1 Y+ y                return (0);& d+ y% W9 |- E. u
        }% {. \0 \! X2 O0 x9 D  p) _

- v% k  [# u7 X        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* ^& ^* P9 V' K1 h( G
                addr = base + cnt;        /* pointer arith! */
% J+ u8 z8 K. h0 _" o1 _( ?                val = *addr;; }* T- i+ F/ X
                *addr = save[--i];
. {6 G3 s2 F  o                if (val != ~cnt) {
$ L; g  m# c- F: \1 A                        size = cnt * sizeof (long);
: e6 m6 s8 o$ z: B, V# _& _; C, y                        /* Restore the original data before leaving the function.
6 Y- N6 d9 ^. u+ X& M! N+ O                         */
" {7 T9 u* u( P+ O, [+ S                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 X1 E5 `; O! n7 _- J
                                addr  = base + cnt;
) _. S( a. o/ @. L$ ^, D" U# t' m                                *addr = save[--i];; {! s+ K3 m$ x, a' c
                        }
% g1 G0 F) p2 p/ n/ W                        return (size);9 _6 Y/ w  L/ N; S2 E+ V
                }, c1 O8 c) ?8 ~: Y- e
        }7 U4 d* J; J& u' P5 \0 p* B

8 L" ~7 v% H& @2 j. A        return (maxsize);
$ ^$ K3 d" I" Q}7 |  K& Y  g2 v, X% P) l
int dram_init(void)
+ e4 B" p3 _7 y# `0 U# ?{
2 c6 R; f" E7 e3 G        /* dram_init must store complete ramsize in gd->ram_size */
0 O' q  Z. x! O' |( n        gd->ram_size = get_ram_size(9 M9 v, j3 K1 J
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 A+ M; V% ~3 T3 N: [7 q                        CONFIG_MAX_RAM_BANK_SIZE);
9 D1 g+ x% p! }4 o- \        return 0;
2 f4 S) J9 b: @}& J5 i8 l" V- w' `1 x

" I8 m2 P* \: x( e2 {; R" |/ q9 ]0 o7 j3 b# L3 x9 O* G$ L
. H5 Z/ @  b& D0 k

2 z3 m: z" Y$ _8 k0 LFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ G$ o3 m+ l" d0 k" \/ a

. F+ Z+ W- y: r4 l4 U# h, h2 C! k8 E% G
2 u8 R1 B: b/ w/ X0 S- S





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4