嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 s0 N, ~' L5 q% t
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 h2 _1 t2 r" ?! M# }9 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, i$ A# B. `  r* s. Q( ~: W8 x% f. ~0 u3 d2 F1 Q* o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 b2 s1 f* ^/ A+ Q9 x

$ K" [5 m' n9 Q, d! V0 N
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* J7 {+ N  j5 S2 \+ L6 c/*9 M* X* h8 i2 \3 g- t, y
* Check memory range for valid RAM. A simple memory test determines
/ E% U9 R. e! g# B* X4 L* the actually available RAM size between addresses `base' and
: |9 o0 |7 D$ W3 M+ _* `base + maxsize'.+ x3 ^; X& p( i, H9 _
*/
- c. D7 R' O, c$ F. q) z3 {* i, l( w7 ulong get_ram_size(long *base, long maxsize)
7 l, A" h. }+ p( X{
* e6 w8 J# W- i4 p" C$ ~+ m        volatile long *addr;
3 y! o' Z$ X$ ^5 ]+ R& [        long           save[32];- T: c: T' a+ s
        long           cnt;
! y' z" Y; |3 d3 z" t* g        long           val;/ v1 H+ ^( _1 |4 y# S7 Y' B1 n5 z
        long           size;
- l) x# y) W) c  T! X        int            i = 0;! N1 o. o& k+ k+ [" H9 e; y; k
" D2 v0 B0 W3 J7 e. O% G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {: n4 h4 D' G) |+ V: J# a# t
                addr = base + cnt;        /* pointer arith! */
5 g. g/ q- u4 n1 R                sync ();
3 x. w9 d# b0 }  G+ W8 }2 S- _, W; Y                save[i++] = *addr;
# w7 o( [# |, s# i$ x' u1 H3 I                sync ();
& W! I6 D" i7 w' w: A  p                *addr = ~cnt;8 ^" k( S! E# U! c9 Y1 a$ p% k
        }
% h1 v* L3 l( J: j4 Y$ {& I! k
  s. N9 c' Q- i6 k* c' P        addr = base;1 G- d' m6 X: |8 f
        sync ();, L0 ~" m! V4 Z8 @$ R5 W
        save = *addr;* v8 v# D/ O; q, P$ _' _( K
        sync ();# d/ ^1 r$ O9 R: X7 B" Y* V
        *addr = 0;
& K4 I9 h2 B2 Y' B0 ^# R2 A! x0 f6 s$ y$ r
        sync ();
+ e8 Y: w% m, }" [9 x9 Y        if ((val = *addr) != 0) {$ ^1 B/ o4 L. Z/ o. k
                /* Restore the original data before leaving the function.
3 j2 X! [/ q, ~. j, [                 */
# z+ N& K+ H; O) n# G5 i                sync ();( q) I3 p% `: G9 u
                *addr = save;
! |7 o2 v' T9 Q* }+ s" S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: v+ l4 ~9 p4 J9 @# C0 {                        addr  = base + cnt;3 }) M. Q( K( {7 r7 Q
                        sync ();  T2 b; ^) o) v
                        *addr = save[--i];0 B! W) `# ~# _' Y2 Y5 r- w( {
                }* C3 ?# g4 q/ |/ N/ \( d
                return (0);
* ]8 q3 [/ j' ^* M3 q; C& k        }* c" m; N  X$ v& ]
0 p% z2 m% V+ u) P
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% i- X2 W# e5 ?; O                addr = base + cnt;        /* pointer arith! */& X6 @: r1 c! q) Y" K# C( X4 s& n
                val = *addr;
& x4 E3 f2 }( |+ g) G( A                *addr = save[--i];4 m; R6 `- Q+ G! g# H! V& f1 v1 h2 x
                if (val != ~cnt) {( c: k' x0 u5 j% ~7 j- V' ~* z
                        size = cnt * sizeof (long);! X% j: ^% k0 B& a
                        /* Restore the original data before leaving the function.
# L3 U" K" j# a$ d. G                         */
. w% t8 y9 C5 D) |  I                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# g$ g: c  r% t% B* \$ W
                                addr  = base + cnt;
* N/ V1 {2 w1 k                                *addr = save[--i];4 r2 {1 ^" C5 t1 p- i
                        }
3 L2 K& b: e8 j* d' p+ k* v4 _                        return (size);3 c. ?3 P' {( |& `
                }
& d: B5 o- W, z5 d; Z8 |  K1 c8 ^        }& r4 Q4 k, s' x* N  b: I$ l
1 a& @# ^6 e( h5 m( ?
        return (maxsize);
' L- c. ~/ Z. P7 a$ d1 s}
9 q6 u0 T/ \; dint dram_init(void)& j  b* R8 T; \8 V/ ?
{
4 L+ ~' S. E% Q* N! M9 K        /* dram_init must store complete ramsize in gd->ram_size */6 |' G, \- y! a: `" L" h! V, ]
        gd->ram_size = get_ram_size(1 U! p0 a; ~6 b1 @: H8 g; v/ d/ f
                        (void *)CONFIG_SYS_SDRAM_BASE,
: K5 ]+ ?9 T% O9 k                        CONFIG_MAX_RAM_BANK_SIZE);& Q+ M# M! d8 X; J5 W# X* q) u3 {
        return 0;
8 `0 [# D4 c3 d/ H! R$ Q}7 N) {5 r. n* O; L4 l9 L3 }# G" f
# Q) j1 F3 X- Z% F6 f1 `
, k9 r: n; R: f; _8 b. ?, O( `

: i0 r" U5 Y" o0 ?. g, L! F) f. O6 y* t4 B5 @7 h* T& l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!2 O  U2 y5 d1 Q
: C% N$ ?' [: ]
4 i) R6 ^( E" Y5 p4 F

- i3 A! h8 z( q' s8 |




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