嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' K4 Q8 ?4 ~, y
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: L+ U! K" [' t$ u' U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, ^+ b" ?+ r5 t$ p1 W, G" Q
* R1 }8 V4 v' N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; G" K; d- j( s6 u  R, Y9 m

5 f! E1 m3 B0 ]! U' l7 e( b
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" J- v( z6 s  Y+ |/*
$ {; @4 O$ J1 s2 L- p, h2 E! M* Check memory range for valid RAM. A simple memory test determines
% E. }) a2 h) l4 A* the actually available RAM size between addresses `base' and5 I& e+ E$ T3 `4 X2 ~
* `base + maxsize'.
0 k6 L/ g* P, o8 |2 O, |*/1 N* t) X2 @- P& m) v5 }
long get_ram_size(long *base, long maxsize)
+ K8 l( U3 `3 n0 |- L$ \{
( _- A7 p2 u* x- L  t+ X) K/ n        volatile long *addr;; f5 q; q' A* H- z$ {* _
        long           save[32];
8 \2 W& M0 k. K8 e7 `/ j        long           cnt;
5 `* x9 `, v% E6 E" p8 z  ^        long           val;
8 A0 y* r) }5 N0 k2 ]9 _        long           size;
* I7 P6 [: u8 x        int            i = 0;. X" I/ O; Q! Z

& @$ O) ?1 T( }+ {9 c% [        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 R0 T9 X5 V( f+ U+ s: \. h& p2 H
                addr = base + cnt;        /* pointer arith! */
( }9 l) ?, Z9 i/ T/ v& Y                sync ();
( w, |6 n" w$ S( g/ F1 h1 ~2 q6 x# K/ L/ D                save[i++] = *addr;
6 |% h! u% j/ j# F2 |4 c7 O7 @4 S' I/ n                sync ();
/ F0 z$ ~5 P) W/ Z                *addr = ~cnt;5 C' w( t* V& a
        }
' b5 u; ?, @2 j# k7 J, l
1 A; T$ o+ K+ z; @1 }5 s) A$ p        addr = base;
9 m+ ~1 _% R0 D2 _        sync ();
0 |- Z+ \; w% J8 p        save = *addr;
3 J. U0 U5 U/ F9 L        sync ();9 A, F; R$ J9 c( p2 |
        *addr = 0;- D9 c1 \$ N  r7 l7 A$ a2 b

1 F, I# K4 S0 i* J! p7 @7 J' I5 T        sync ();
* [* F' h  ?& f        if ((val = *addr) != 0) {
# c; w0 E" P4 v3 Q8 O                /* Restore the original data before leaving the function.; P8 n5 X, s6 Z2 ?6 Q
                 */
+ L5 b7 Q- ~5 F1 T* S                sync ();. R  R0 i; X5 c2 N8 d
                *addr = save;
# t* w! L9 y5 c* C0 B; X                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 Z& C4 D/ ^% H6 A9 o# c                        addr  = base + cnt;9 _/ @; J& w2 |( c; l! E3 T4 l) x& `
                        sync ();
1 C5 M6 j" i9 }4 `# V% y8 y                        *addr = save[--i];: O( J3 F+ J) w7 `: \' L4 j
                }: c  k% z* L. r8 K# Z+ D2 _' A5 |- e
                return (0);
+ h5 V1 ]* s  U        }
% M9 t5 g: L8 x+ c
& L$ q' M% f/ C        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( B+ [9 j, y$ U( P
                addr = base + cnt;        /* pointer arith! */( Q  s3 g6 e. k6 U6 H4 W! m
                val = *addr;7 G/ E( b& r9 N; Q# L& @
                *addr = save[--i];: J6 W0 M% o- b
                if (val != ~cnt) {6 C1 p% d6 |$ l: M
                        size = cnt * sizeof (long);* E! o% s, y$ Y  |; n1 V3 j4 p
                        /* Restore the original data before leaving the function.0 J4 p! k3 d6 p4 z8 M
                         */
0 s# ^' p. C( E% A* i. \, m* x                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: o6 A, a! x( i' B0 q9 ]7 g                                addr  = base + cnt;' q0 R0 w; \7 o7 U* \. L( k; U6 Y3 f
                                *addr = save[--i];! ]) [; E( H5 \) c. ]0 r
                        }  W( A$ I5 ?: Z
                        return (size);) a8 O) X- [: G5 M& _" [
                }
& g' q# O/ n0 ]  v        }
+ l9 [7 d/ v  @" x/ }5 b7 v% }0 K' m( H
        return (maxsize);
- \; j. E. K- K: v# k}: |" Z; n! l' c: F3 {5 h
int dram_init(void)
9 k/ ^  A! P6 E, O5 z{2 K7 F3 {7 U- \* O4 W1 j
        /* dram_init must store complete ramsize in gd->ram_size */: }: q% B# P% v# h1 U/ f
        gd->ram_size = get_ram_size(3 F7 e; |4 O7 ~/ t. v) V
                        (void *)CONFIG_SYS_SDRAM_BASE,8 {7 N/ T: ]* Q) p, a3 X  t/ V
                        CONFIG_MAX_RAM_BANK_SIZE);
: z+ K, [& n7 B        return 0;
/ @2 T9 E) ~7 \1 V: v$ h}1 X5 t+ K8 C1 U0 S
# x# ?! x" r# W+ `$ J

7 A! @4 j/ W2 U4 E/ L$ e: g% b( }" P0 r. }; b

9 k1 ~, R! Y; V7 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 O/ p% K7 J+ \1 c
  R' w# D' K% j/ `" I6 u: P
" i5 s8 [6 s, b$ J  ^
; E  i- n; \6 @; _: S: E





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