嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* k* D) R- m7 g核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. m" |% @$ N5 X1 g- T! r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  g0 [9 I: A: F1 O5 p/ r- p! Q6 N* y8 I% D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# p' H; ~0 f! O: k5 n
/ ]( w$ v7 ~& Y+ L& u# l
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 b7 e& h* N" u- g/*
$ p, ^& a# }6 Z* u8 P- y5 O% I- t* Check memory range for valid RAM. A simple memory test determines
1 G- W$ r9 s; n! M2 X) Y* the actually available RAM size between addresses `base' and
# v) W4 G6 Z2 p* q7 E4 s+ B2 W$ n: E5 @* `base + maxsize'., Y; T9 A" ~! P3 H6 ~9 g% x
*/- V% |' c/ V2 m, ~
long get_ram_size(long *base, long maxsize)
# ?) ~9 g2 C, E, q7 M5 f{- ]+ _7 S' n" c3 v1 J
        volatile long *addr;
8 m3 E7 M# |- u+ }7 U2 M5 M        long           save[32];" |, a/ k' a- A8 m- C  b
        long           cnt;/ k) W- b" P5 P/ I. n
        long           val;
* F% u  M& d' C5 E' [        long           size;' q7 R) }4 o9 e, i! E( r
        int            i = 0;
! {; J. n2 y9 }" e! n' f8 J/ c& Q& @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* E) W( l' R: A& V) P* N# y5 w                addr = base + cnt;        /* pointer arith! */7 U% x* {3 `3 r8 p: o0 p; n  L" ~
                sync ();
! Y2 f- q" V8 |( S: f* t                save[i++] = *addr;3 c+ |1 N$ }  b
                sync ();3 Z$ X2 l4 l, F  w- J* V1 }
                *addr = ~cnt;3 @, |' S# W+ N; f' g
        }
6 Z; A, s8 ?, y2 I; Y
1 ^' M* `  y0 j/ e        addr = base;
- r/ d( B, ^/ T0 ?/ ]+ t        sync ();5 Z& X- Y& r: ~3 I7 C, B
        save = *addr;
! Q9 w: H. h  b5 N" e        sync ();
2 x/ M/ }  Z9 o( g' ~        *addr = 0;9 H0 t! ]# `. E/ b0 X  {1 {

+ _; R0 e( X1 W% C% T; ^0 n' z        sync ();0 }3 {+ o) G- f: H. i6 V, d1 @
        if ((val = *addr) != 0) {
8 Z( s; J% Y/ H8 ~                /* Restore the original data before leaving the function.( [0 w( l4 x/ B9 R
                 */
" Z5 d; H8 t0 H7 J0 L. c                sync ();
& C4 t7 m! C" z% a0 a, l, T                *addr = save;, @5 f/ `( ^5 e# H, ?7 x) s, N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
( W4 o4 F4 B0 K                        addr  = base + cnt;8 H. ~4 S9 g2 |+ z! n
                        sync ();# S5 T! F! r5 s% S! y2 a6 t
                        *addr = save[--i];
; u) c4 u! W; }' N                }
9 r( h$ Q2 W& Z1 v                return (0);
& M( G2 n0 _( M+ M" V! }        }, X% K, F: \5 m8 j) v, W
9 u8 v$ b/ c( X  M0 k/ F* }
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 \7 E0 L+ n+ s# x                addr = base + cnt;        /* pointer arith! */
5 x8 c" @# Y$ ?                val = *addr;
" U6 U$ t3 B  \" n$ R# m  j                *addr = save[--i];7 B/ R/ K( G% B( a
                if (val != ~cnt) {
! L0 X/ a; W+ }                        size = cnt * sizeof (long);, w: _/ U+ m% A7 S
                        /* Restore the original data before leaving the function.
5 v/ C5 |, K2 ?! K% N4 @* y9 [                         */2 g+ V- w- ?" M; q3 ^
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, D3 s, A* s! @) m8 ]$ q# N. a8 T                                addr  = base + cnt;
# V: h% f8 t% i$ G  O: O* e" b) a                                *addr = save[--i];0 h: E* R9 I0 N: y2 s6 J. p: Z' D
                        }: |9 ^$ p3 z: N
                        return (size);2 q) i: @) z) Q4 U' f
                }
+ a) O; a7 z6 ?1 n9 V8 k( S: T) v        }3 O6 J' a6 y+ D& _$ _( T) z  h

9 S( B, W9 ?1 l0 A0 e) P        return (maxsize);
( L8 F$ X- b8 g% A& ]" d6 `: C}
" K1 v7 x0 _$ V1 a  u8 Hint dram_init(void)
# y/ H) T/ n' W  _+ _7 C, L2 K{
7 |( e- Z& O6 r4 I! ?        /* dram_init must store complete ramsize in gd->ram_size */8 v; K4 \. M# b! U6 T2 u
        gd->ram_size = get_ram_size(
3 E7 y6 Z) x1 f                        (void *)CONFIG_SYS_SDRAM_BASE,8 T9 W0 c( ^3 E# T" w0 [! l
                        CONFIG_MAX_RAM_BANK_SIZE);: q# D; g( A: j. n: ?, S: [$ |
        return 0;& u- ]5 U/ W1 m
}- z2 n8 l8 M$ Z9 r/ Q1 s% h( S( O* G

# l' E) w" K1 K9 h9 V2 i# j. ~! D7 W0 j- |
* L  ]  Q  d2 l- `1 i/ A

# d# z* p- A! H2 t! H) v; l7 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 V) e- V2 D1 T
7 T5 X+ |3 p+ w* M
- v# e4 y  L. z% b6 M7 r8 a
$ p  U# _, i( }: h" w





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