嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- j. T/ l' i0 `4 g# h
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ `. S1 O( Z$ ?这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" s2 _7 w) M( O4 ]

8 I5 [- Q9 w& X$ ^# L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& u; D; G9 Z7 `3 {
0 G4 f4 V8 h( l+ d; Q$ T! l
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 C) U- A: T& H+ g/*
3 j; k, \7 ?9 ]0 V; N* Check memory range for valid RAM. A simple memory test determines
6 @) m" h2 p+ V* the actually available RAM size between addresses `base' and, b* G3 M5 H/ k8 {" c( U" C; O
* `base + maxsize'./ i1 W5 x+ V" i9 {% f
*/
: N( `8 t9 R; C- h% f; \! ~$ _6 nlong get_ram_size(long *base, long maxsize)
9 p1 p5 V; ~. K0 t7 j7 R# S' U{
) E; P7 @8 t; J1 S$ B; C  o7 F# _8 K        volatile long *addr;! h- ?( q  w5 A8 o" J  Z
        long           save[32];! i/ K( m& L2 I3 A
        long           cnt;
7 w; a3 w9 @7 F" x, ]. q        long           val;
- \" {0 b* u' [' b, J% ^        long           size;: E0 H; P8 @7 m3 A/ c
        int            i = 0;% i. g: L# w7 Q; b
+ ~1 u. a" E7 _9 h
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) J& G3 ?2 e( @                addr = base + cnt;        /* pointer arith! */
3 S2 }$ o8 K! O# U5 }7 s) @                sync ();1 A9 G  v# m. _. \! q
                save[i++] = *addr;5 x7 u, d3 k  m+ Q% _
                sync ();
& D5 B$ j5 E6 ^# M) n* h                *addr = ~cnt;- f! B9 R1 ^# ?# j
        }( C7 B5 s, B; ~1 a) ^1 W$ W% @

( t$ E8 M: X7 |        addr = base;3 J, D- X6 _- M( o; B# \
        sync ();9 i/ F* ^' F3 g+ B
        save = *addr;! [8 H! D# d+ V! }
        sync ();, n* I  U0 F9 P2 E- a( Q* h
        *addr = 0;
1 J( q$ t/ G5 p7 h6 R
* M9 e( x3 b. H. K' S, g        sync ();
1 K% B" h- T- A  \# K8 W$ X" v        if ((val = *addr) != 0) {! `* e. e9 O5 e- J
                /* Restore the original data before leaving the function.. j6 L8 q, H& X$ }5 s* Q1 d6 Y, i
                 */" F# G8 ]$ J& G9 o+ a2 B* i
                sync ();
+ O3 A, O  E6 m* n% Y  P                *addr = save;
  `, i+ P6 b- n+ t( `5 b& B' ]                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
  ?% e, ]8 a5 {                        addr  = base + cnt;9 O6 e3 N7 m/ t
                        sync ();
' ~1 [) G+ ^: r& I                        *addr = save[--i];
1 P( T* T# x& ?+ W                }
2 N6 I" N4 u1 v0 D, A# D. ~" [                return (0);5 x9 ]  _! ]4 N6 c  Y
        }
# N. k3 [* R7 J& ^3 [
/ u. q' i( L, H# B+ Q( W, @% U        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" N9 @4 P5 g; y% d' _; N, A' u
                addr = base + cnt;        /* pointer arith! */
0 k- \9 e( B% b6 N                val = *addr;; j: I6 v; \" J0 `
                *addr = save[--i];
! _8 V8 R# g, d5 Z9 m, ]                if (val != ~cnt) {
+ Z2 G+ o% C3 @3 e3 s% v. i- z                        size = cnt * sizeof (long);& \) X  c- n2 v
                        /* Restore the original data before leaving the function.! g! w3 I) R! U& a/ c0 \
                         */% a0 k3 G: L8 D9 Q6 ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  B$ L4 _/ F' B1 J! [
                                addr  = base + cnt;
$ @7 R! o$ T' t1 e) `                                *addr = save[--i];7 p1 h; Y) `: S8 x" f( q' r
                        }* f+ F% j' h$ E0 P# `0 t
                        return (size);
' }& E. S& W- z                }
, W2 q& w7 r$ g$ |+ U/ h* K        }
# P  X. n# ?) J" e. \8 ]4 R! K6 H; J( }$ {
        return (maxsize);6 z) A0 H1 G" Q. n- O
}
3 u" z  w" i0 ~( X1 \* ~int dram_init(void)5 {2 a) _1 W7 J# Z3 [
{( a0 a: `$ f# }( [& x% q) l3 N
        /* dram_init must store complete ramsize in gd->ram_size */, x$ y* Y6 n4 ]& |: Y8 i
        gd->ram_size = get_ram_size(
9 i+ I. x: T$ O9 ^/ g                        (void *)CONFIG_SYS_SDRAM_BASE,
. @) g* \' J$ j4 Z$ F8 e" E                        CONFIG_MAX_RAM_BANK_SIZE);
3 r; d6 s7 l4 |. ^+ @' ?        return 0;
' \6 j9 {2 I' c2 o+ x( g2 q}+ v9 X1 r$ _& E4 W- h6 L5 i
* ~4 T1 P+ L, G

' j, u3 C, @2 c6 E6 x. m# C/ [  }$ h& [- R, c# i
9 Q. d( @3 I- Q  T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 v  j8 w: p0 i, \9 }2 \, {2 B* ]3 T: }3 v2 Y; K; A, D

' `* b; [0 [; }+ l" a9 U7 k
% p* s8 _7 k5 r+ N9 A. U





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