嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. E& e4 l. p! i核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 G5 ]% q: U4 ?7 {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* @  y! {6 X3 `

- M6 h/ n5 z6 ^/ Q' d; P; O; B是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- v) k- ~4 G) Z6 Z( n( C3 v% J* n# h: g9 q" {

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  O0 J6 n* Z& K) M- A% E/*+ x( ]  K( @6 \2 {! e( S
* Check memory range for valid RAM. A simple memory test determines
% ]* g: z+ \0 |2 ~( S* the actually available RAM size between addresses `base' and' k1 Z* Y5 }8 g$ J) k1 ]% |: U
* `base + maxsize'.
# A" b7 U& n: r$ U*/7 r9 x6 {+ Z! K6 N
long get_ram_size(long *base, long maxsize), x% ]3 }2 z0 O. e
{( L! j4 v4 Q! [4 ]: g
        volatile long *addr;
6 i( z* _4 l, a. k. e6 e8 q1 J4 J        long           save[32];1 `1 O. V+ W3 R
        long           cnt;& K, Z5 r! P- ?% c/ P' l
        long           val;" P9 i2 _! z3 S) D
        long           size;
4 c2 A# F* C. E2 |! z/ e        int            i = 0;5 R, v/ p+ z6 R  g' N, i- K

2 x( M- O0 `, u+ I  q( G: t        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- ^( F$ s% D0 {
                addr = base + cnt;        /* pointer arith! */; Y$ {1 P' d8 o. `
                sync ();! V3 ?7 b% Q. b6 ^3 H* y, B/ F( B3 P
                save[i++] = *addr;
# g" B0 R' [7 r* ?  ?8 }8 C/ F                sync ();9 E1 `5 g6 C! @0 D: A
                *addr = ~cnt;  S/ p5 v# Z6 }! _% Z, W
        }
" w* q4 }# G' z. p
/ A1 y8 h. B% S9 C6 a5 a) i        addr = base;
- C* o8 S# s% {1 D0 y% o        sync ();
- X" o$ e% S/ {; N6 o2 ]) ]        save = *addr;# \! [) v3 }7 U" t3 w* |7 \( v
        sync ();- p8 r& v# _/ ]: l9 J
        *addr = 0;" n- v$ b1 N1 |; H, i: M. H

; s2 ]9 W* ?1 q; k        sync ();
& X  |9 F" g* t, X/ {/ x  Z) Z! `        if ((val = *addr) != 0) {! N2 a2 g* _6 l% m: c  f
                /* Restore the original data before leaving the function.* W: h$ p& J4 A, d
                 */8 L* y- x! g1 P! B* K
                sync ();, c, \  @$ t7 N: m7 [# G9 _/ S
                *addr = save;
* T' y% O0 ~8 B% l% U& A                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" E$ f* p) x5 I( K1 U0 O1 L* w
                        addr  = base + cnt;3 D  P7 t1 h* g) j+ h
                        sync ();- D+ e9 A" {& m
                        *addr = save[--i];
7 Q+ h; u+ k% o9 w                }; S6 R  Y0 s, q+ E0 B2 Q  K
                return (0);( v9 B% U* e0 k+ K' k
        }
" B4 E6 |4 p8 t) ^* V) b- T, s/ j& v, t
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 l1 m  \/ k. J5 C' I8 r
                addr = base + cnt;        /* pointer arith! */
4 R+ U$ {6 o5 }; c' y; i( g: M, l                val = *addr;( y" X: A: E. @- c' G
                *addr = save[--i];
1 A9 m; p5 g' X" v9 a/ D" \                if (val != ~cnt) {/ x: K3 P( \! }
                        size = cnt * sizeof (long);, Z+ S$ |+ C9 {* ]. M4 \  B
                        /* Restore the original data before leaving the function.9 }" f4 ~! N: \
                         */
) @( n: r" w) I  M                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: ]. L2 B- k0 b$ }" @9 H' G7 |                                addr  = base + cnt;7 z, V' p2 ^" W: W' O" J) p& J, X
                                *addr = save[--i];" p/ ]; G) j4 S: R& F
                        }2 e/ s' m! n8 Q4 m5 ]$ o3 x  I
                        return (size);
2 {' S6 D/ |4 L! o                }
. ]# D2 \) y+ P  k" S. u7 {$ F9 x        }% d" G' `1 d' _7 b, _
, c3 X4 o" ~8 C  e/ f' u, f1 {- N( R
        return (maxsize);0 v$ c3 d" D1 V9 k1 Z# J9 a2 z
}
* {' @6 M, i# c+ A5 Iint dram_init(void)
1 Q; Y* L* T, i; [. e, O' i/ m* x/ j% i{4 Z9 W! X% `' C. w7 d
        /* dram_init must store complete ramsize in gd->ram_size */8 H1 P$ T' B5 O* T
        gd->ram_size = get_ram_size(: g  C( @% n3 k3 E  W; C6 j
                        (void *)CONFIG_SYS_SDRAM_BASE,
: J: n, B# B" |3 x                        CONFIG_MAX_RAM_BANK_SIZE);
$ e$ Y5 \/ r+ ^5 }: g0 ?6 t# I        return 0;
' X; Y) A3 _/ i6 D8 X3 T}' U0 `3 E1 k  g" \, W

2 S/ z6 L' U, V6 B
* N% Y0 H$ i9 C2 g$ C' L3 S. ?' _) O, c1 [) `

3 E# A$ u  ?! \; w7 M# }& qFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* K3 m( l! o+ X+ }' h  I* I
  d' [1 v8 C$ b/ r2 \" l+ P' r) @' {* E# J& M( f& a% h, W- ]
: h' f" n' V9 T( q9 @





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