嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 g1 b% ^" R! ~6 h) \; M( M核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 C8 l- y% z, G  l2 J  W/ `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* x3 H, a8 I7 R; C% n) Z5 w5 _
: G( h- d: K; y; ~6 U/ }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 B, F# I2 A+ }
; A# I3 @, o2 k% ]
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. S- B& ?) n5 w& Y; [/*+ ?& B- e6 ?3 M! d. R
* Check memory range for valid RAM. A simple memory test determines0 i1 F4 B$ E' k3 y* r# W
* the actually available RAM size between addresses `base' and& a" l8 L( s5 }9 C
* `base + maxsize'.
% m! m$ V- R# K' ~0 b) |* V4 x*/9 E- ~3 n( E% y% v9 q* X) J
long get_ram_size(long *base, long maxsize)
, z0 x  d9 j6 w$ j' N5 J& G/ U" ^{
8 b: X& }4 @5 g) I4 r" ]        volatile long *addr;! F. l  u4 F3 q' Z3 x
        long           save[32];) A7 L0 T' q1 w% L" C0 |6 k
        long           cnt;1 u& i2 m9 ~1 a: ^' E$ ^
        long           val;
! [9 T' U! [+ i) }        long           size;, z& N: |/ ^2 ~
        int            i = 0;
& m6 G- H" M; F4 a6 u; w8 z2 H0 q6 c! }2 m
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {  w4 B: x7 F( B' g
                addr = base + cnt;        /* pointer arith! */
6 b# f: q7 G5 @" |                sync ();
; Y5 ?! p6 J) o4 y, d3 _$ P                save[i++] = *addr;
' O6 d$ y! Q! k2 ?1 k* h                sync ();$ ?5 O3 A$ C' c. u+ i# {
                *addr = ~cnt;- e' X! p+ l, u- J' i4 c
        }: k$ C/ [. ]8 [5 ]8 H$ T

7 R$ a0 b5 f( Z- f, \. @        addr = base;3 Q/ W$ m! ]6 \5 g/ {0 k
        sync ();! C9 B* @' E  {" t
        save = *addr;
  a9 {1 ?. B  m+ `6 R2 L! `7 k        sync ();  k7 B" ^1 }4 N, k% d9 K5 E
        *addr = 0;( |1 e* u/ L, t& Y5 M7 k# g9 S

5 Y  e3 E2 U# D6 _1 D; }  C: W! m        sync ();2 h% s' ]0 M4 m& V' d# [: f
        if ((val = *addr) != 0) {
, k4 N  F5 W6 S6 @; H4 I                /* Restore the original data before leaving the function.4 S/ L: r; k" t/ l0 f! r
                 */
; O3 `  A1 n9 u; C* g5 _7 E                sync ();
4 V3 K' S2 j5 a+ k- v% I                *addr = save;
3 p/ v7 @5 `' Y7 n, @0 V& l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ u: Y! [+ \- m! [
                        addr  = base + cnt;' o% ~) I/ Z. x3 R  B: o* \- F: M6 B
                        sync ();% f' l! G8 F( b0 o* o% z, e
                        *addr = save[--i];' s( `0 A$ q8 v3 z/ Q! A2 a
                }
. r7 V! O. ~: s( J  F/ B                return (0);
9 T8 ~% r, n& u+ E9 n5 j( U8 |        }% k' O6 x3 [% R0 R/ M
3 D+ a( R# c0 J4 x" A7 o
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 W, ]( l( w: \1 d/ N) J- w                addr = base + cnt;        /* pointer arith! */0 R. D4 n+ I$ O7 M. |7 c
                val = *addr;
5 I9 t& |" E- _2 c                *addr = save[--i];# H8 a& T3 t, W3 H) T* r2 ?0 _
                if (val != ~cnt) {3 j/ i! f4 l/ W6 w9 p
                        size = cnt * sizeof (long);
: k( X% O2 U3 I- o/ R                        /* Restore the original data before leaving the function.
7 x- L0 E! z$ n9 J* @                         */
4 @7 C) c9 V# w' R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. Y; I( U# N/ c7 i8 R                                addr  = base + cnt;
- ?; _( f, K. H! _" R5 X                                *addr = save[--i];6 v/ D/ P& T8 M
                        }5 r4 [; l0 u) J
                        return (size);3 P/ G& {: i' s+ ^( |
                }5 h9 M' {$ P  f7 L/ l4 A: Z; m
        }
# P! e5 k" S7 d, f
" f0 R* p  R* t+ K        return (maxsize);
' S( c8 ^9 Z$ `* O" a) q4 r, ~$ O}
3 U" h0 ]& ?" d# s* G$ zint dram_init(void)2 P6 k/ k) J" q+ [: O# M# d
{+ O$ n7 N9 l! b4 z" k
        /* dram_init must store complete ramsize in gd->ram_size */6 o8 ~! C7 w* I" r0 l- s: G3 ^3 w* U9 O
        gd->ram_size = get_ram_size(
3 ~: {& h3 m" O                        (void *)CONFIG_SYS_SDRAM_BASE,
7 M: a5 F" f7 `: d: {( ?4 E9 `                        CONFIG_MAX_RAM_BANK_SIZE);+ k3 P& \0 j$ j8 v& A
        return 0;) h2 V4 I. f+ @4 j
}" S' i2 q0 o4 R

! ~) E9 G2 G8 `% m  f* _# @+ ?& O1 y( w' }
6 T, T& ]5 q( w1 n3 f1 u
$ u( R+ h- M/ M. N
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" l( ~/ p% b  I- {

+ u0 l- F& N. W8 g+ i# y+ f! ?( m9 c. B# r
9 }# ?$ Z' u' X* I





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