嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit$ ~! l0 V4 P& Q) k7 L6 A" t7 J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. s' X3 h, ?5 e0 U  |1 y3 w这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?4 i, `. `: o2 H& L% D* [
$ B" i" d9 O0 s% r
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& g* e( a/ ^! _' m) Q
0 k7 G$ h- ~. |# E" [* T) n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; R6 ~% Y* b: `) `# Y
/*$ t: f: B  P  b6 ^) w7 _+ Q$ r
* Check memory range for valid RAM. A simple memory test determines- A: X, \+ h6 r! p7 W- b" `; n* X( p
* the actually available RAM size between addresses `base' and/ a0 q5 R) w( _& d% |4 k
* `base + maxsize'.
/ d# K7 u  J  Y6 T8 _3 {3 K& H*/
% o4 A- U2 s+ [long get_ram_size(long *base, long maxsize)
! I7 c/ ?- s) O* m4 _7 V% e. w{) x3 {* y! ?0 T
        volatile long *addr;: F% B2 |( s: @  p
        long           save[32];0 n; ^1 u$ T. W: P$ n5 r
        long           cnt;5 b. U! L' c0 F3 {, i
        long           val;
2 m+ Q/ E3 v) h+ I( `5 L7 H7 \        long           size;
, e- J3 I; l" i1 f$ B* R. w0 b        int            i = 0;
5 x* y2 u& W; J+ B2 K1 ]0 E$ V5 O: s0 w0 P
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* ?# t9 r: {/ R5 n0 t4 C5 u                addr = base + cnt;        /* pointer arith! */
1 W) I1 a6 C4 A) \4 k# ]                sync ();
5 C" R$ _4 _! u7 n% _                save[i++] = *addr;1 A2 y: A) G4 Z3 j
                sync ();
1 Z0 |$ d; T" Z( W5 L                *addr = ~cnt;) k" e/ q8 \7 S! H% s
        }  _+ ?' Q, O* T3 `

. {- \$ _. w  v/ v5 H0 q/ w        addr = base;
* {" e+ }% q: F- {2 B7 \( [        sync ();
4 ^7 I4 [/ x' y, o9 Q3 l; p        save = *addr;
1 i# q3 x+ l+ y( x2 }- ]        sync ();
8 v- ]. Q- `9 }: |. K/ x        *addr = 0;
/ h/ S% |/ Y0 D$ A$ O9 d2 J- s1 |) \' p" }1 r3 H
        sync ();/ B8 o! o" y& p+ N6 v) J
        if ((val = *addr) != 0) {- w) V) F3 G6 A8 W# s0 m# a
                /* Restore the original data before leaving the function.
* G  _! v% h' \6 s" B$ t                 */4 Q( g$ }1 O! J3 E* v2 |, b& T& l
                sync ();
! R/ U" _4 D, w- _0 t. [: o                *addr = save;
0 L3 x0 C& P3 F5 R( ^. t                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. y0 `5 J& |$ D; `9 s                        addr  = base + cnt;
& h8 z8 P8 ]) }3 z, U3 |                        sync ();$ c% f0 L* ~4 I) }7 P/ H" t
                        *addr = save[--i];
& q% j1 L' }* W$ D                }
7 \/ K& K# B" K/ n1 w' o) L5 k                return (0);4 }. j# d) G. ~+ J" x6 x8 t8 T
        }
' h7 O* t8 e" {: \( H1 e" v; {, C0 y7 u. I9 }6 [
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 r# ^  M" w( w! y                addr = base + cnt;        /* pointer arith! */
: z, P1 Z) b& m  j+ P1 u$ E                val = *addr;" u' x+ \+ ?# [
                *addr = save[--i];
$ W$ X) X: X) X! E) X* N6 W  z0 m4 s                if (val != ~cnt) {" x8 x3 I5 B4 s) _* ~1 s' Q/ |
                        size = cnt * sizeof (long);
+ m" ]9 l3 W1 A                        /* Restore the original data before leaving the function.
0 b, [5 ?0 |0 H- `& L6 ?, T, x/ z                         */
' F5 N; D+ N1 {4 y2 U( }8 `                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, m2 u7 s. p& }' _6 T! E; L; h
                                addr  = base + cnt;
5 A/ D8 E. v7 w. _4 P9 S                                *addr = save[--i];* v0 B1 d: j  ?) n' G
                        }
2 f+ X) \; {/ x- F8 p* J                        return (size);9 S3 G% v2 y$ q
                }5 B$ V9 e' h3 Y
        }$ Y8 S9 j' {9 Z( K1 a
5 u6 ]7 u9 L5 e& \$ `. N7 K7 w
        return (maxsize);
& c; X9 A+ v; c; e% }( p}9 Y" W# f7 C% P
int dram_init(void)
. C+ k! o6 Y4 y+ E" b{0 b; s! @8 {3 y
        /* dram_init must store complete ramsize in gd->ram_size */
( z& |9 ]$ F' [1 b3 }        gd->ram_size = get_ram_size(6 {; y: k) w; ]
                        (void *)CONFIG_SYS_SDRAM_BASE,' m5 o# b& P( K! G; e6 R
                        CONFIG_MAX_RAM_BANK_SIZE);
; g8 g: ^5 i- d# y8 ?3 d8 c6 ?        return 0;
5 j$ V, S* A2 v# _* E}( [- a" ^& X8 z/ U- E) _
, y8 ~6 b" S% ]9 U; I, V$ E( \

0 Q5 z+ K5 G' M* r2 C# y( J& x$ d2 V  ^  c$ L  s
# ?9 g' [1 _* C) v
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* s) u6 ~9 `0 c  j# ]% c

+ p" s8 ^8 p; z. Z& h/ ?( m
( n) x. p" A; |1 X" w

5 n6 H; p4 w; X% b9 |! g% s




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