嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 r$ Q0 U: p5 \0 x/ L核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 `5 }: ^8 {- L这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?$ h% r3 k" M* k3 V! Y( m

- b% N; P0 ?% Q* |/ Z2 w. D4 M; t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; V& S) Z$ C6 n5 P. s+ v- z+ W7 U* o) F) [) a4 j5 X& K9 X* b+ l% \

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:9 X2 w: l5 s8 t
/*
- t# F; I9 X) h7 g; _4 ~- v' d* Check memory range for valid RAM. A simple memory test determines5 F; _3 r: f; ~6 d' ]8 O
* the actually available RAM size between addresses `base' and* a8 B6 R4 }4 k3 ?( ?; B6 l
* `base + maxsize'.- D, |$ ^% n+ _4 K1 y; Q7 v* \0 E1 `
*/
' e1 ]8 j+ l& p/ N* blong get_ram_size(long *base, long maxsize)* m. E: @& R2 W& w* J
{5 G- z9 I: K# z# `) V* H6 V  {6 Y
        volatile long *addr;$ S! b' t; y9 n7 O/ [
        long           save[32];$ g1 C, O; W' W8 V; ~' H
        long           cnt;
" w1 [, A* a0 M5 p        long           val;- T# z* r  I$ G8 V0 J
        long           size;
( A. W, g- j* y0 z5 V- V6 _        int            i = 0;& g! O1 _" S$ E: r- Y$ T

! n0 F2 F2 x% U5 u$ }; k) _        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {8 g, l0 T  L5 N) Y9 Y
                addr = base + cnt;        /* pointer arith! */7 r2 v) ]: Z( `5 h# Q& R8 f
                sync ();' D' i0 u9 U" ?4 V" r
                save[i++] = *addr;; S" {3 d- @3 V5 K" ?0 K
                sync ();4 J0 l4 f: b$ I; i' ]- o5 Q
                *addr = ~cnt;6 T& b' q! C3 J) _: l8 v4 w( o
        }8 \3 r, j& `5 J& Q* Q  \8 h0 v
3 B1 `6 z; ?; t" s3 [5 H
        addr = base;
  p2 u7 n6 R, M; K4 R' I        sync ();
5 v- X) q2 V4 B0 ]3 o3 d, G8 q        save = *addr;. s; Q- ~' v, t" X: \
        sync ();6 a8 w9 v4 F6 P
        *addr = 0;3 Q1 l0 [% h! M3 R
* \8 {) U; E, X9 u: s8 _
        sync ();
7 j- X3 T( }4 ~( W; n3 o        if ((val = *addr) != 0) {1 B# v+ a+ Z8 G2 ~6 E9 O+ U3 R
                /* Restore the original data before leaving the function.
: t% }( ?) f- [% `                 */
! X4 V: f7 N* N) C                sync ();
$ [8 e- Y! k8 D; w2 u9 V1 I1 @: V                *addr = save;5 r  |3 I0 N1 a" \  N4 ?$ `0 Y: _% p
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ q" z- Z$ [5 I' B8 ]# d7 L) E: x. S
                        addr  = base + cnt;
( ]7 Y8 B# N+ H                        sync ();8 O; a4 X8 y5 R- g! b
                        *addr = save[--i];
8 e3 @8 e% X+ y- m                }
$ ^1 n. U& U- B: e  J. n                return (0);
, g2 m' D$ K# O% P+ K5 Z        }
6 M7 x" e2 ~2 k1 \7 ^0 g& I( s9 P7 k& p- }7 r* f# T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. a* ?! N6 S! d: N4 |7 `4 D4 _) j                addr = base + cnt;        /* pointer arith! */
% S- T$ Q/ r6 l* @% Z                val = *addr;
$ X6 `( a1 [8 G  L8 o                *addr = save[--i];. \+ _2 K( {" y/ j
                if (val != ~cnt) {
: P. v% ^; a% r; j: l1 g- T                        size = cnt * sizeof (long);
* m, R3 E" }" H' h                        /* Restore the original data before leaving the function.
  d; N+ y! D1 f                         */
' c/ Z7 P2 k+ P3 ?. {0 k7 E                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  U/ a/ m% f' h0 j
                                addr  = base + cnt;
' y3 N' V0 w( _( x" m8 ?! s2 x& t) L                                *addr = save[--i];
3 y9 Y/ r0 M2 S* g  ?% q$ p                        }
8 e3 j) q  q0 B7 C, [: f                        return (size);
1 A. }# `5 D' g; ~& g8 c/ H' N$ b                }) ^( f9 ~. A7 j% B
        }' A: B7 I$ c3 R. ]% H# H

% [2 a3 |: V3 \, X; M        return (maxsize);
7 t& E" m! r  Q}
* n) [+ Z5 [% i- V7 U7 hint dram_init(void)& y8 `. L7 W3 k. q7 A" G1 e
{5 X2 A" E& k' ?* p& Y7 l
        /* dram_init must store complete ramsize in gd->ram_size */
+ v1 i0 f0 C( R# f! p        gd->ram_size = get_ram_size(; \! Q: Q- G! \/ t% O6 J; k
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ b. `7 H& H4 H. H! w1 X                        CONFIG_MAX_RAM_BANK_SIZE);
0 e+ R6 b; d0 B+ g4 P        return 0;
3 ^8 E* l1 \$ w& R- A}
" @  X3 ?( ~$ Y# F& I+ ]; T$ @
4 o' p! ?) G5 i* B  d2 o' Y" Z4 Q; t" U! D! y

& f3 _% G2 B) p- I( s! i8 E2 ?, A# N' m% ^8 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 ^( x+ ?8 L+ t0 j9 [! v! C) @! b0 E

! a7 `6 K  Q7 q) a( F: q  w9 {
7 P" ^+ H4 H" N





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