嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& B2 ?/ c* [  Q1 d) s1 _% p0 N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 b1 q+ Q( [! N: k9 I% Z( u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?+ M9 D& w4 d: g7 c$ K' f% d1 ^
7 R/ G5 M: R) c) N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?& ]5 x& y( f. L* A; W
4 F7 @- h5 L& e9 m9 D  I

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. f" x' {3 L5 j3 ^8 j$ `2 I" g/*2 b: U3 ~3 H$ ?% k# K( m
* Check memory range for valid RAM. A simple memory test determines1 ~; z, ^# G' U4 C; G1 J, B
* the actually available RAM size between addresses `base' and
- Q; S( @3 N! w- d. k" Z2 V* `base + maxsize'.: l; {/ `2 u1 ~; ~( ~5 c
*/& }# k% K& [6 a
long get_ram_size(long *base, long maxsize)8 O/ \% t; q$ Q, ?$ e/ Z
{8 g- ~) ^% E' ?0 B8 S& d
        volatile long *addr;
  R7 K( z2 M& M# ~# g" ]        long           save[32];
# }; b- e5 a& |) `        long           cnt;
" f2 [0 a( r: Q& v2 C        long           val;
! V9 y5 B" ^& b# U) U: N        long           size;
! Q/ Y4 x) z& l8 j6 E1 L" b; P        int            i = 0;
/ C, l% L9 I3 o7 w( d4 d7 F# S: u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {% p& a9 X7 s8 I2 z8 m
                addr = base + cnt;        /* pointer arith! */! D0 _4 ~" |" S; a" E+ J
                sync ();' v& ]0 }1 p+ ^& k
                save[i++] = *addr;
4 r0 D! k, Q: A. n                sync ();! i) ^6 b- C1 o% ]( l' d
                *addr = ~cnt;; E6 L3 n0 @' l
        }
; W7 l7 s. r8 ]; \# d* @8 C
! I) K6 Q- ]$ t7 i' n8 j7 m        addr = base;
6 [3 K: d1 Z' R        sync ();) M5 ~7 V3 A3 R, b* g
        save = *addr;
, m( q0 ]+ h/ j( X        sync ();
# Z- v3 [7 [2 M+ `        *addr = 0;
: N  v9 Y7 t7 C2 U4 P# N  v5 |" K4 x$ T  ?3 e1 y' c# e
        sync ();% k2 G& \3 w3 H
        if ((val = *addr) != 0) {
  Q. z$ t4 B$ ~; x7 o                /* Restore the original data before leaving the function.4 x' e. ^+ H$ ~
                 */: `& L0 U/ s, t4 S) s9 }# ^# u
                sync ();
2 q" h7 Y+ n# i# G, a                *addr = save;
# o! a* h  ~6 a                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 o7 H) M; K- T; B: K5 C                        addr  = base + cnt;& p) f. e6 z' o* @# g+ b/ x6 S8 Y
                        sync ();/ [) B" Y( Z  O9 }  l1 d- |
                        *addr = save[--i];
& Y, i: k2 L% z9 ~/ Y) X. A; J                }% w+ m' _3 X4 b, y
                return (0);
8 {  Q9 ^3 I* @, q& `# q        }
1 G' [% a" i% B8 m/ f
9 U- |3 J9 I9 \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. f( V$ s$ Z- d; Y, H                addr = base + cnt;        /* pointer arith! */
2 Z- b3 m: \% I2 E1 Q+ x                val = *addr;% E  i7 p' U' ^
                *addr = save[--i];# k4 z* M) A& ]. d( e6 ?
                if (val != ~cnt) {
' y! P) `+ g$ h% B- n                        size = cnt * sizeof (long);
. u, m7 X# `1 z" X/ p                        /* Restore the original data before leaving the function.
' v- n5 r4 N9 K, u6 G9 U' K9 j                         */
" t' c& v0 L# E1 m1 K+ C' V                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% |$ [) ~7 D; g                                addr  = base + cnt;5 ?0 V4 h7 u' H# Y, \" V( h
                                *addr = save[--i];' e; ^/ ?2 R7 y2 f4 V, s
                        }" a( Q4 Y( D2 F. f6 w# H
                        return (size);
8 Z. V9 b( R8 z4 M                }+ H% Q5 r+ I7 l: o
        }( J0 F. h  Z1 o9 a: B% U  g6 y1 t
$ F% Q. x6 n+ A$ a& r
        return (maxsize);
9 y$ I4 [# p0 n* y3 Z}
, \$ S0 F, S8 D& q7 sint dram_init(void)0 ]7 R, P/ i/ C& ~- ^' Z; |
{
; H) M. V% J9 ^        /* dram_init must store complete ramsize in gd->ram_size */, }4 O& b# q1 L; k& F- g
        gd->ram_size = get_ram_size(3 z  W3 S0 @4 ^5 W9 j
                        (void *)CONFIG_SYS_SDRAM_BASE,
: a6 G6 M# r# U! g                        CONFIG_MAX_RAM_BANK_SIZE);
5 x7 F: n6 A2 v) E( G        return 0;
/ b/ w  D. e) ^- M! j/ K0 ?8 u}
' \) X0 N9 A4 s: u; ?/ ~. f4 N) {; A7 x' ?, L4 u

1 x6 ]1 U2 s( x& ?6 Q$ z
2 C9 D0 `: Q' p/ E# }7 O" o; O) J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ O+ b2 o$ Z8 r+ a* o7 h0 C0 j5 A6 W! n3 a4 e

5 q+ H1 i7 T: w$ Z2 E5 M
  p  N) I& |) N3 t! s5 [





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