嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
9 b# r$ f6 a+ s( V- T/ ?: q5 p核心板2:DDR2 256M Byte   NAND FLASH 8G bit% ?) L" h8 \( _7 N+ M6 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 m% j- m& }8 t) T4 N6 L0 e5 S; i% Z4 S$ ?) d  I: b) G( U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ j8 n. j5 K% l. l6 [$ G# K
2 r* O7 ?% |& X. P! p, W
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 s  \; U3 K- y* S/*4 \. P" x% ]! S0 @9 Q) q2 B
* Check memory range for valid RAM. A simple memory test determines8 D( }$ c0 S7 a: @5 `, `
* the actually available RAM size between addresses `base' and
! h# O' z# v1 O9 a, z: `* `base + maxsize'.
! g' {7 F2 f7 {3 Z*/3 G$ {" A( Y) u3 ?- B6 S
long get_ram_size(long *base, long maxsize)! D1 |. R% L$ A- B; F
{
8 }% V. w" H0 Q. ~& ^4 J6 {% S* a        volatile long *addr;
! t- o; H) M$ t3 G7 [1 E$ I2 q4 X        long           save[32];
  |( o. f3 E3 r% d  c$ u/ ]        long           cnt;$ N2 B! K+ ~& i0 H# J" a6 U
        long           val;1 Z3 A+ p/ O6 W1 Y3 n& K  N+ n
        long           size;( \/ s- ]) W" n' t2 m. Z1 o& K
        int            i = 0;0 \, `7 J8 a: K# U, _1 B5 ?
% F1 C0 h- ^* f5 b: k; p3 g6 m& v
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 Q7 Z3 [% j$ Y8 v                addr = base + cnt;        /* pointer arith! */
5 t( X  L5 L% W2 D' b/ i7 O5 r                sync ();
  H- h  Y- C2 b4 E- \" L                save[i++] = *addr;
; v4 I9 `9 \' o* _' S( V                sync ();, d, O' U2 Y; }  i0 j: ~- X
                *addr = ~cnt;  O8 A, t2 F1 m& j
        }9 q$ u$ a% t$ \" y$ d
4 l( X  |+ i' ]: \
        addr = base;
. N; x' \) T' L( @        sync ();7 g; `4 s8 U/ T  L- [3 P
        save = *addr;; D  R1 c$ L: J+ l6 ^* ?) _
        sync ();, w+ F  W# `+ }
        *addr = 0;! S! d6 L4 V. E  ^5 s7 P5 o
4 R- U! F! X7 g  @% M
        sync ();( }: D: a$ H) ]; b) ]! e
        if ((val = *addr) != 0) {" x9 @2 n6 h* |' w, Z
                /* Restore the original data before leaving the function.$ o+ }( O+ V  e) E% u3 m7 H
                 */
/ J) ?% X  r/ V                sync ();
/ Q3 r) q! h/ Y7 H* C                *addr = save;
* \# {' J! Y: U' K" E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {7 c4 }3 [1 \9 U, b% \! G" V4 B
                        addr  = base + cnt;" k' [- Q' i% T8 [! \; B: ?1 ~) ^6 k
                        sync ();
5 m" J/ X+ ~. y                        *addr = save[--i];! y% [# J( p, x3 s* v
                }" Z+ e) |/ X9 G* S2 Q
                return (0);
: c) a& f+ r' r        }
0 {& [1 Z! c# e/ L2 c0 ?8 s- c: T+ Y  z$ H* D
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 U, |) G8 L) V! y3 F                addr = base + cnt;        /* pointer arith! */
6 P& t" R0 p9 K                val = *addr;
/ d" N1 y& Z* ]2 q; D* V3 _                *addr = save[--i];
) e9 N1 j( Q4 u% m! ?2 a3 _                if (val != ~cnt) {% s- S0 \0 `6 \3 W: \
                        size = cnt * sizeof (long);
0 g- Z$ u; j/ X& E7 |' [. A                        /* Restore the original data before leaving the function.
" ^" S5 o6 c! Q5 e/ [0 Z1 I                         */
% W& M+ s! x  z& p7 t" J                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# J  |5 j! y! O# J0 ]( U  R                                addr  = base + cnt;
8 C2 f1 b5 |, `/ M; d8 M                                *addr = save[--i];
- s& m0 a# t0 F3 R+ Q1 ^                        }
+ Z8 d4 \9 c% ?, ~' `3 [                        return (size);
) r: i3 p& a, I3 e* Q; r                }. U1 [# A6 e& a  O, n0 q
        }2 e0 F+ A2 N9 S

& s- Z" B9 i: O. B( z/ r        return (maxsize);4 U4 n! a; z3 q  ~+ |4 _. g
}
0 K% y- N; d# T: Fint dram_init(void)4 \1 `$ R% P$ q5 p. Z+ o7 P
{7 n1 v0 D0 ?8 |% c- J+ x# r
        /* dram_init must store complete ramsize in gd->ram_size */
. v! |; x: m5 j4 {        gd->ram_size = get_ram_size(
  G5 H0 \7 A! a9 a0 ]7 P; W9 i4 e+ W" T                        (void *)CONFIG_SYS_SDRAM_BASE,
6 n4 |% z" R: m9 l9 N                        CONFIG_MAX_RAM_BANK_SIZE);
/ M& ^8 ^7 U/ C6 [6 _        return 0;
8 f" [  v0 t  N9 O' ]8 I}! |& l- j- f5 q1 n( ^& r3 D& w+ A; u

, O4 S3 H8 B' I: o9 l
7 s8 o+ q5 n- n' c! W" g
$ o* B0 G5 Z2 ^3 b: D- |- P5 x. O5 |: x0 N/ u! ~8 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!. B: F8 C( W) ^' C! T% }) K' m

% |9 P" ~+ \9 \$ R( i- @
$ q) U) G( E* l. {( V: t
1 O6 [3 o7 m& m8 j8 M





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