嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% Q/ {: G: l3 H. m% r核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ l' k- R; K5 ~' |/ v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
& x1 O! U# ~3 Q1 g3 W" `" d) v+ f3 o2 s! d  I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: i; N2 A+ ^  A) [. B; j

6 W  i0 o; n5 w+ ]" r. B/ u/ C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% N) U2 I0 U$ F, P/*
( H# @; Y1 c4 t( u0 V) [& ~* Check memory range for valid RAM. A simple memory test determines
( J+ P/ K" r6 g* the actually available RAM size between addresses `base' and
/ J5 T+ _# B! s! U! R2 b6 ~* `base + maxsize'.
. g& u5 I* g' [& M$ t*/7 s  |- d. |$ i7 ~& U
long get_ram_size(long *base, long maxsize)
1 o3 h2 e  p* Z$ O{
1 ?) U* `9 U8 Q        volatile long *addr;( P7 [8 Y! p. A' d/ Y4 q3 h
        long           save[32];
. B( I+ Y9 S2 z6 f        long           cnt;1 _. |- f: ]0 }; c- m9 d5 f
        long           val;9 A5 A0 ~: Z- a% V/ d, I) z
        long           size;
: K, Y1 U( F- Q8 T2 i        int            i = 0;& G, T8 n+ R# q' }( \1 r: Q
1 o* ~2 @; m4 k& J5 a( O* a  n
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# H; m, l- Z4 J4 g" P
                addr = base + cnt;        /* pointer arith! */
. ^8 e- ^  s- a  i2 D0 Q. l                sync ();6 T5 Y& L/ i' {& }( |& J
                save[i++] = *addr;: o& M- f0 q" y! ]) W5 Z
                sync ();
! i- H8 H& h7 `. c/ _& z                *addr = ~cnt;
; D4 D- T3 y9 T3 P        }) H/ P. O' U) F
7 @8 }" {: e: y
        addr = base;6 V% [9 a$ i4 F" k2 \. c( A
        sync ();
$ ^0 Q  ~. C* ^& E8 h" A3 r        save = *addr;
) b9 }8 h8 z5 d6 g+ A- B' x8 B4 K4 }        sync ();
% t- B. v3 r# p# p        *addr = 0;5 F* @! A; i: t4 B4 K
# D# f# I' f; U. ^& w2 r1 y! ?
        sync ();* e* f) v5 S5 x4 z& u
        if ((val = *addr) != 0) {
' [. V# L4 g+ d0 h$ L                /* Restore the original data before leaving the function.
4 t- c# e  ]! D4 d8 H+ q/ x                 */. ?. U+ r# U% R: l( V
                sync ();& f$ Z% v6 [. k' d, D1 S5 b; t5 Y: I
                *addr = save;: E2 o: A8 u0 {
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
6 i: w) e% S3 |$ ^" c                        addr  = base + cnt;. B. @" R4 o% S% b% a# g2 H% r/ {
                        sync ();
. t6 p5 j& d0 E2 m  \& _/ h4 k, k                        *addr = save[--i];5 ~; f0 i0 X9 A* v8 z
                }
: l) W2 g  X, Y, Y4 ]8 Q9 T                return (0);/ d; R  y" ^* ~. m
        }
2 g1 A4 q" j3 f) X) S8 `" S$ F6 N/ T; {
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 b& H0 ]9 w# g; O8 s& ]0 a                addr = base + cnt;        /* pointer arith! */
5 X6 \2 }& `, R6 ~3 Z7 S                val = *addr;
; F) Q7 r9 d; u) K$ y' u, \                *addr = save[--i];+ [& T* P3 ^9 a# U: y; D+ E
                if (val != ~cnt) {
4 Z% p; v  G3 n, F: S6 A                        size = cnt * sizeof (long);
: B" T3 N; F. ?. i9 r                        /* Restore the original data before leaving the function.7 Z, i" D8 n' U% d% N
                         */5 s0 z8 _/ Z" N& Z% @
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 c+ D3 z% I4 s2 R# W7 F7 w. v
                                addr  = base + cnt;
2 z# a# F) f5 g# P                                *addr = save[--i];/ X3 T% m! C* q9 C3 n
                        }
( ^# N, J' M( M/ |                        return (size);5 F" H/ t- W0 S( h& f3 r, B- f
                }
/ n2 T0 d' x4 F4 v" A8 [        }3 `7 R+ D6 z$ {- }) {: I/ V

& e$ [; U: v$ f. p( k! X/ W/ G7 `        return (maxsize);3 L4 z0 r( z* v2 W- R
}4 ~5 g+ r4 R2 s. m% ]; g
int dram_init(void)
3 }0 a2 ], z( T3 ^{
& G2 L1 w5 L7 L, R! ?: O9 Q        /* dram_init must store complete ramsize in gd->ram_size */
/ K! k1 J% @! a  t8 i2 [) R        gd->ram_size = get_ram_size(# v/ j: W3 n; w3 y" p& X( W$ s
                        (void *)CONFIG_SYS_SDRAM_BASE,
# l0 C1 R) v  P4 O; h+ h2 N                        CONFIG_MAX_RAM_BANK_SIZE);+ G% n! T) C/ s1 c& h1 T* N. v
        return 0;
* @7 j* l! S; K6 E2 W7 v}6 g2 \' \) N2 p4 u) y% B- b
1 M9 X: b; A: V, ~" H. S' r" C

7 _  L0 L" i; }2 d( v
/ s6 ^$ X: P! @: v6 U
: j( i5 E: d/ N5 e6 T$ t2 uFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 b" o$ C5 q% Z1 X7 N: M: I7 |: @; R# f1 G

; p# A! i' j) N- b9 t0 |4 P
8 H6 Q+ d% M6 D- |





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