嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 \3 e3 \1 S2 f8 B0 ?, [
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
7 T/ G- k5 Z4 N. u; ^这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' }! f4 x* A+ I. ?- F; m3 E, ~: p' z- }; _" X* k" x* z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ u( a4 k7 s& y8 Z* j& Q, C3 _4 F: k# P, ?$ Z9 ?' F, k9 N+ y

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% t  u; ^# t2 k& `/*8 \0 @0 h; ?7 H: u: n6 C
* Check memory range for valid RAM. A simple memory test determines; K& K3 B3 \7 j' a7 G9 C2 `
* the actually available RAM size between addresses `base' and
) g% ^# j! T  T- @! D* `base + maxsize'.
; v+ u5 S% l- K4 k6 m- O- G0 k2 H*/9 r& U) v6 x% D# O, d
long get_ram_size(long *base, long maxsize)
4 k- h) q+ x( b; J{
0 o, {& e& |- d6 ?5 S9 g9 q        volatile long *addr;
/ q1 b# P  u$ y) J5 e2 I- i7 d, w        long           save[32];
$ g# Y/ r& j7 B4 |        long           cnt;
6 B- |7 W8 y8 w/ o3 P        long           val;
5 q0 P5 D0 K3 c7 z: ?2 d; D6 ?        long           size;
0 y1 R5 M/ y1 Y( m; K        int            i = 0;: D/ a  S1 j" ]7 M

7 e8 S. U% l2 Z# K* f3 }. c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% f! c/ a5 `, E$ ~                addr = base + cnt;        /* pointer arith! */' v" u/ H$ t5 e) d
                sync ();
' H8 w' ]% i. J. t/ f- w# F6 Y$ R                save[i++] = *addr;
7 I1 ~- V* s* Q                sync ();9 @2 U7 [& E  ]. ]
                *addr = ~cnt;- _0 i/ P8 F+ x5 ?1 }
        }
0 O9 K: b* P1 p' P# O$ U  g: l. R3 w  T, n
        addr = base;
2 ?) T' p* r7 n        sync ();0 K: d) W/ x4 [
        save = *addr;
, Z, G& W: A8 [4 [, @        sync ();
  o0 K+ [* c: J        *addr = 0;; u) Q: D7 l; W% D9 ~! w% N
8 x; f2 ~6 f  o/ ^
        sync ();& r0 S2 w1 y- G
        if ((val = *addr) != 0) {
1 D) m+ t$ ~5 B; O7 `                /* Restore the original data before leaving the function.9 O# c6 m9 Y6 z, u1 L1 |
                 */
8 \! e& z/ f4 _7 G                sync ();0 f7 Q7 `8 ]4 b' H1 @+ ?
                *addr = save;4 K  b5 l# \) p% p& T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {% C9 Z2 s. Y7 X$ S1 Q, ]
                        addr  = base + cnt;: l0 t9 A+ t: s+ M' K0 O. z) u
                        sync ();( T2 j* g$ y) ?/ i6 r0 F5 v% y
                        *addr = save[--i];) E; r4 D4 n# y1 g
                }8 o6 ~6 H. Y0 i0 J
                return (0);5 f/ c' u" L0 A1 H8 s) q1 o3 T
        }
0 U9 M9 V4 P$ V. J" f
7 r, D3 k8 l! L7 Q% S+ B: }; G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 P, u2 ^6 ~4 \                addr = base + cnt;        /* pointer arith! */
8 z$ x0 a7 h8 l* [# u                val = *addr;
$ O4 I- k! {% Z5 ?1 f                *addr = save[--i];
7 `& k3 n) D" N- p$ L* C2 a3 q                if (val != ~cnt) {/ ~2 [6 j7 L5 G# e
                        size = cnt * sizeof (long);
# i0 _4 Q5 v/ D$ ?' p' C                        /* Restore the original data before leaving the function.6 {' V; j& P- s7 B% M* W( c
                         */
9 @2 X$ H( Z1 C( @% x# b) L3 K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 l0 |4 U  X7 a, g4 H
                                addr  = base + cnt;. [- A' z; f! X4 f( o
                                *addr = save[--i];3 b# O8 R9 U$ r6 k- q, q4 ?! n5 V
                        }9 W, `# V& N- Z7 G  a. K/ h5 K
                        return (size);
" K' J4 V, G, n0 F: Y                }
3 d% v- d* l; a2 X( M* b* W$ O. r        }5 L* t; x. Y% O) M2 X' L
6 [2 k4 l2 R& `
        return (maxsize);
2 I" n7 c- O: i. p$ E- l/ N}
* }0 b0 n) s) E1 l) i- O: Dint dram_init(void)& _2 }* ?* S6 f8 ^7 ^7 t8 @
{% |( ^& {- H" t1 L! x
        /* dram_init must store complete ramsize in gd->ram_size */7 |7 S9 t6 f3 G! a# g  ~; Q: n) S
        gd->ram_size = get_ram_size(
& U: w! Y# e( v8 @: T                        (void *)CONFIG_SYS_SDRAM_BASE,7 H# i+ j$ b/ @# J, j, [9 A
                        CONFIG_MAX_RAM_BANK_SIZE);
  m/ k" i% p7 o% R        return 0;% n( w) y6 c4 [
}* |0 ]0 j, N/ n( b# I

  G  Y. a! ]6 [  v, T7 z4 }0 P/ \- `; j" b' M" d
1 z/ x/ C4 a/ P6 v, V6 v6 |: A: f
' Z/ P! Y8 b. K+ i7 `$ Q# b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ ~+ ^, I' w& R0 T* X
' f. }, C- G6 F% ], H0 Z; \7 U6 N5 i
1 ?5 N/ r- T" E1 N1 n





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