嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 U; \) t# v9 w  t- O0 r0 R# y核心板2:DDR2 256M Byte   NAND FLASH 8G bit' L! ^$ l) l" F! p4 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: l6 G5 q; o- h% c, p; \4 h6 I- m5 r2 [1 \; s1 b8 A7 V. [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 u# m5 ?3 {0 f+ o/ Y

  B' g* [7 ?# u5 P: [
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 P# i1 Z! u/ w" D  }+ S
/*, c, @; b# o5 S% B0 ~& H! v
* Check memory range for valid RAM. A simple memory test determines
& L- f/ a& @' n1 V7 p* the actually available RAM size between addresses `base' and# e% I; N6 Z2 r, J1 w8 e/ S
* `base + maxsize'.
3 `7 B9 a* I5 w% N*/
$ u" R9 ?1 Z9 n% F$ O( olong get_ram_size(long *base, long maxsize)) d) o$ h8 ]; a; Y* C* j: U% f
{
$ {' s. u& q% B7 n        volatile long *addr;5 y, }8 C) e7 {* w9 C8 ^
        long           save[32];
7 q7 Y7 y5 \( l& Z3 L        long           cnt;
. S0 X2 c2 }% q8 s+ N& Y; g        long           val;
2 j0 R+ u( e) Y3 j; F        long           size;
- K6 g& f7 t# ~+ U1 R0 N6 Z        int            i = 0;+ ?; n) l$ k7 _2 I
5 v2 f# m& W: N+ g% @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 w  p7 z- S) a5 B+ E
                addr = base + cnt;        /* pointer arith! */
; I; R2 H0 V9 r& g# m+ B* A                sync ();
1 f! d$ h7 M4 E- a* J) b                save[i++] = *addr;
! f/ x4 t3 h8 p6 L4 O3 P                sync ();9 n) |; u0 m0 F% g0 N  T( M# [$ K
                *addr = ~cnt;' s$ k) [9 u! O- K6 ]( W" }1 Y2 ]5 ^
        }/ W3 N. a  I7 z+ \
: q) O; {9 ^% i% T* q0 s
        addr = base;
2 r, i9 m" H* V. b        sync ();5 h" b) ?, H2 j0 G$ U$ a) s, _
        save = *addr;
/ Q4 a0 `( P1 m9 f8 [/ @        sync ();
: W6 S2 P3 u" R1 j        *addr = 0;
) H7 }8 p/ H. k+ t+ x8 p7 m1 o, ~" Z9 b4 c2 F0 }* \
        sync ();8 B& r7 f5 ^' w0 g
        if ((val = *addr) != 0) {) V1 P6 z$ Q% }0 z. N) O! l& M
                /* Restore the original data before leaving the function.
4 h7 A7 g1 a  j" s                 */: i4 ~6 I  ?5 r8 C* l6 p* q0 X
                sync ();  I' M& S# [+ f8 c! U' f
                *addr = save;
9 m1 O" f% d% o$ B                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" g/ ], j% H& \, k/ W+ @8 ^! M0 x                        addr  = base + cnt;
! p' y  ^: |$ `2 P5 j                        sync ();4 e% _6 I* e! E7 T
                        *addr = save[--i];: J% ?% _5 ]2 o7 ?
                }
8 f: E7 E& C- n% p3 |. n; O5 d# t                return (0);9 N- M5 O* R; E0 h: E7 u
        }5 _  s/ n, q8 ~! b

9 ]7 u1 c- x% _) l. t& q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 |3 W2 N( V  q9 d+ l+ R
                addr = base + cnt;        /* pointer arith! */
# _1 _: F) |7 Y% x7 d  {4 t2 F3 Z/ _' @                val = *addr;
8 Z4 g, F6 M4 S# L, O                *addr = save[--i];
5 m2 W! i6 P" y- G# _3 ~                if (val != ~cnt) {
# k# X, Q. x( I2 I+ U1 S                        size = cnt * sizeof (long);
! j& _  u8 e* e' o                        /* Restore the original data before leaving the function.
$ I$ ?- a  W( F8 s( v8 Y4 F                         */3 t3 a$ E* n( F! ~; m
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) a% |8 x7 V: [5 g                                addr  = base + cnt;
3 J% M4 R, |, R3 ?4 R2 |                                *addr = save[--i];
4 Q$ b+ I7 S0 r5 P                        }
" G% j* f: k; X. `                        return (size);+ _+ {9 g+ A' c& G, F8 |
                }
( j" i7 q: r8 b        }
9 X# G/ F. }# l$ y2 D5 H' A9 W; I! ]2 [2 z& s
        return (maxsize);* n) z$ E& d* @* {
}
8 r/ H2 M! {( E6 M- Kint dram_init(void)
2 t7 ]5 c! R* J( ^  V( r{
9 l& j3 C2 ]! k        /* dram_init must store complete ramsize in gd->ram_size */
4 B5 @1 E4 s+ H+ {. J. [# e        gd->ram_size = get_ram_size(2 b% G5 m' a. c* N% b& U
                        (void *)CONFIG_SYS_SDRAM_BASE,3 N0 h. ^  _( a: i7 c
                        CONFIG_MAX_RAM_BANK_SIZE);! h; Q' X# K9 o1 k$ q
        return 0;
( p0 T0 z0 w5 V: z6 M! N  _% N, X}
8 ]- K' B/ ~+ [6 @# L3 I# H9 g; ~. U1 c  u6 j; j7 K( K& e: S% y3 U

, V$ U' O1 L  P" c& `3 l! z  d9 c0 B* B4 `' L; J; S
3 M, a* E8 L- y- x, u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 \5 V3 T( ^7 y& \4 S& j, i" i
" n+ x6 U9 @& x1 @- ^: T$ R

! E) k. Q& X/ F0 m

0 N6 w; M% K2 T5 ?+ Z% ]3 M




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