嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit; \* ~# y' d( \/ C/ B) p2 Y8 J- W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# L+ B3 ?+ G, N5 P  O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ k& n1 T' I/ ]3 n4 z1 t' ?" n2 J  R7 X
( i4 m( K2 r1 `. i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
  }# Y9 v# T: e
. K+ B& m2 S- i; y8 n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: X  ?! `1 V) Y; `; @  E/*: o3 Y. S$ i% w8 p: c- i& z' M
* Check memory range for valid RAM. A simple memory test determines- u: Y; r- L/ m% e7 c" e0 w
* the actually available RAM size between addresses `base' and
3 C$ E9 _; X  j0 ^, M/ L4 N& F* `base + maxsize'.
5 d9 }+ n; i% _" @. A*/
4 h$ h0 r9 \8 {6 o" s- E+ c! M0 y5 Tlong get_ram_size(long *base, long maxsize)
+ w9 s- a4 o  _0 K; t0 y{
( U' T% k+ }  O1 b4 {        volatile long *addr;$ W. c0 m" ]# ^0 x7 c
        long           save[32];
6 r/ i3 |3 e/ \# v        long           cnt;
4 Z! K# G$ i( d4 ]2 J2 b        long           val;! W4 V) B0 e0 {3 M2 y8 S! l8 {
        long           size;% H6 l. g# ~1 [, g. M  e( M7 p
        int            i = 0;
3 {; M5 J6 x7 Y# h
  R0 V2 ]" y) [2 \$ t* k! C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 p$ J4 J3 ^$ k+ D) I5 W, U                addr = base + cnt;        /* pointer arith! */! N0 v) ~5 }/ r% ^. ]
                sync ();
" m% L7 F9 `4 r- m$ R0 ~                save[i++] = *addr;
& [7 ^: ]5 N9 C                sync ();
$ D+ J+ C! l  u" e* d' W0 O                *addr = ~cnt;
8 i) h% h8 o% ^8 r5 \% j( H        }
0 |+ A' |. u# t8 G3 u3 s. J3 M
. q' z1 G4 A: K, t: y        addr = base;
9 v" C. l/ |* k  {5 d$ j4 O        sync ();
1 G* C' ^- W& m& N        save = *addr;( v1 O8 o# y! M/ c
        sync ();$ A4 g6 i" z* f6 c3 ~* I# N
        *addr = 0;
4 D2 u5 t! l  V! K) w0 r$ M  E& s/ X' e  ^  S7 N
        sync ();
2 u) U8 Q/ p! M        if ((val = *addr) != 0) {  I+ `# x1 X7 Z) B& [# X
                /* Restore the original data before leaving the function.' ^. m$ F# w0 h; D; i8 }
                 */2 @2 Y9 H# H* O" ?# f9 V6 f. ]
                sync ();
9 V9 [' c9 t6 F7 T; b0 t/ c  X                *addr = save;' f5 J* ^7 }" P7 [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 o( A4 [+ I, ^1 Z/ x% Q6 N, `                        addr  = base + cnt;
8 F5 s" A/ q0 A                        sync ();/ N" r( G; P+ d& y* m0 q
                        *addr = save[--i];
& H- n, |; @! j; O. h0 I                }
9 y1 x( M' f1 C5 n/ T7 T/ ?& S' }* k                return (0);
6 Y& _' h4 J. @        }
; q( W7 D6 X  L  q
1 [% l* x* l2 O/ q/ `* ~, z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* k" a9 e8 T* o! l  \
                addr = base + cnt;        /* pointer arith! */
# n- X" f' ~# m2 {0 f8 {- u7 R                val = *addr;5 ]* b) F: ]! Q9 Q! J; |
                *addr = save[--i];
; M$ |7 {. G; B. L  Q; e  K  K                if (val != ~cnt) {; H9 _, t0 m+ R6 {
                        size = cnt * sizeof (long);% o6 F8 S+ Z; F
                        /* Restore the original data before leaving the function.
8 W* {2 D; l; p/ N2 M                         */- u" S& D* T  _8 U; ~2 o3 L4 }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 t) Z% Z. @! X% q8 P6 r                                addr  = base + cnt;2 b: K  z1 ?; M, F4 E! j
                                *addr = save[--i];
+ B1 ^/ W: V$ v, D1 [! m( Z$ u# b8 A2 w                        }
* C& W2 M- _) {1 P                        return (size);% c, p0 t3 K/ b- {, j5 |5 m6 y, ^8 @
                }4 M% w) c# p" Q* }( I
        }* x- @/ y( ]4 n( h

6 j- ^2 u5 @. Z& u$ r# d( d        return (maxsize);: {$ S7 {% K8 ?3 T: O
}
2 A0 x9 v9 v& w  B. i" @$ ~int dram_init(void)
( Y6 m% N, H, K3 ?; U{) q; h$ X3 b$ G2 b9 D, |: ~
        /* dram_init must store complete ramsize in gd->ram_size */
- |5 i  r2 x6 j5 B7 m6 w$ z; K; i6 Z        gd->ram_size = get_ram_size(7 E% R7 X# y2 K- K
                        (void *)CONFIG_SYS_SDRAM_BASE,4 ]$ u1 x4 c3 e' J
                        CONFIG_MAX_RAM_BANK_SIZE);  o' g% ^. W6 j' }: v3 u
        return 0;
2 l7 _$ J4 |  M! q. Y6 o; h  \8 {/ H% y}- C1 R  g, S3 q. d* ~3 X
$ |' o$ L! Z+ y' ?" L9 Y- N

4 D1 g. w1 U0 m! s! l8 ]: h' O! t2 g' @, F$ T
8 f! {$ p4 ?  D$ R, _, U. X# @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; v8 [/ X3 f$ S* b7 e! ?- @

4 @5 \/ I/ S2 k- c: s5 Y# v% B& ~
$ f  j. b$ G( I# b) ^, e
7 M/ D* ~) f: q8 N7 B! J





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