嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ x! w" |/ e0 d7 S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 F; k* s. y. N( m1 L  g& F- }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?9 _0 B; @3 g+ A0 I# m

8 r  z1 G% ~. B0 t是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% O3 H" W& E5 [+ t8 k& }8 x
' f6 M0 C% A* N0 ]. P
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, t/ N  H& o' }  ~- C
/*
! K; k" K0 s. R5 \& t8 ?+ _* Check memory range for valid RAM. A simple memory test determines
: P( ]! C2 p) Q& n# U* the actually available RAM size between addresses `base' and
0 E: E0 `( i5 a5 J* t$ T0 P! T4 p. o* `base + maxsize'.
! \# ^2 n- j! e1 w) d; r*/
% T# _8 t+ @" I9 B2 }9 Flong get_ram_size(long *base, long maxsize)2 G" T! w$ S0 O
{( ?' f$ x, O4 a4 U% }/ G* m7 W
        volatile long *addr;
! l* W4 i9 X5 X: G3 S/ U        long           save[32];9 q9 R% R1 N" t& A+ e% ?' o
        long           cnt;
1 [! ^- i- Q8 y4 H3 U        long           val;
1 K" s6 e6 }0 C1 A        long           size;
# M' |8 c1 I7 u' I        int            i = 0;
/ C; Q! Z, H$ L& Y. O! ^/ }  m3 w$ k9 c% }
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- `* ~+ a1 W: s  i& X2 B3 d, ]
                addr = base + cnt;        /* pointer arith! */
- H! M! \. l: W- e" o5 {6 T                sync ();
* p' J" t# O' U; D  A: U8 I/ K                save[i++] = *addr;$ o- z$ Y$ }* U' _
                sync ();, o2 q. q( i" {6 O7 u& p
                *addr = ~cnt;
/ i# ?3 Z& {1 H! y. t        }
) t9 S# S+ l. O% l+ P, W
' S4 Q! L, }) z$ x; `: a/ B        addr = base;- B2 n$ b6 J9 e; v
        sync ();1 m. w; M/ Z* S6 e& H2 H
        save = *addr;- y: r4 I- O. c% F8 P
        sync ();
3 @# i7 V4 ~$ n3 [& z' K        *addr = 0;6 \2 \( A& b: U+ K: T
( a% m0 }5 z) j$ B$ N
        sync ();
0 y! N8 ~7 Z  \# w' g0 r2 r' U        if ((val = *addr) != 0) {
5 s; v2 `5 U3 p7 r                /* Restore the original data before leaving the function.
! p8 ^3 M4 E3 `% k5 c                 */2 S. b7 S& Z# d1 Z3 x+ N: M( w. g6 F! |
                sync ();
: h# F0 u+ ]- H, Q                *addr = save;/ ?5 x* l: J6 J7 a3 i; m
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {+ A$ ^' M2 p( l9 U6 K0 p' c
                        addr  = base + cnt;
! ?" M/ w( H& I  _& B7 o; B                        sync ();
/ u8 K3 `! @- k$ o                        *addr = save[--i];
' t5 H  N4 q8 A: T                }$ h7 X; N6 [8 W0 e5 _. d4 R
                return (0);: I5 m5 _, ?) G! `4 E; G" i
        }
7 Z6 E, y$ u) o& j
7 B' `8 W4 m& e2 y: m" X! f! u        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% N0 V8 U3 m- C- N! w( P1 Z% ~                addr = base + cnt;        /* pointer arith! */
: c; Z4 E7 W7 [( Q! c* G$ A                val = *addr;
4 Y7 H/ N( P( D$ X  ]7 X, l                *addr = save[--i];
1 F& E4 b3 ?3 m8 j                if (val != ~cnt) {* u" V- f: q: f4 e: v
                        size = cnt * sizeof (long);
" L7 g5 U/ z* {; n/ V; x                        /* Restore the original data before leaving the function.' x8 ?5 r; [* I/ }9 I8 R- T
                         */
+ J) O* `. r6 N' z' T4 n  m- E; B                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, ^6 l6 u" A" p
                                addr  = base + cnt;4 _9 ?' G; J4 N4 T5 j) D
                                *addr = save[--i];) r# u- z/ o: z7 z0 F" G" n. T
                        }
9 ]# v6 k. }+ F1 z& b                        return (size);
/ O. V& D% i1 d9 t9 H" `                }; x+ K; `! X  M8 y: D5 T
        }* h) W9 U' e0 c8 }
, a/ u# _$ e$ ]" R* F& i1 e& F
        return (maxsize);# k6 o. k- T( O4 C& X
}) w# w( f% j, B' `# `6 p. K
int dram_init(void)
3 _; ]/ m/ a- a1 ^' K{; I6 \8 r4 C4 ~  b. S
        /* dram_init must store complete ramsize in gd->ram_size */) n7 g5 S1 B' e# U
        gd->ram_size = get_ram_size(
/ a" T1 ~& m" ~: b. o$ B                        (void *)CONFIG_SYS_SDRAM_BASE,; C; T% B( a0 e
                        CONFIG_MAX_RAM_BANK_SIZE);
, g# V% b) x# z) v: o  y/ W' w        return 0;
3 J( x, ~. s/ w  ~4 I}
: g5 Z# F! W# h4 |: c# B7 s' r6 e* e2 r5 e9 O/ V0 k
1 D% ^" Q7 j, @) S

" Y7 w- v9 ?! q* l1 w' n! L
" _8 A$ Y  I* @. l5 p. {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& P; S  g5 X, b3 k9 o4 Q0 h* R
4 E7 W' T, ~0 c7 x3 t% ]

4 ~% {! e! Y9 N; `




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