嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit& R- ]" Z2 F+ f  k$ \9 u4 `2 q
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' ]3 o. n  J0 g/ U  Z7 `, v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 G: C% M" q- K0 c' o- m$ n. L' g7 `$ Y" @% i2 Q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?0 G  l6 V7 h/ O) \6 D
4 J  v/ D: h) F3 ?: m! a; F, g- {  V

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 t! c$ y0 u. \3 u+ P: y4 H
/*9 y2 d, ~; R) X  x
* Check memory range for valid RAM. A simple memory test determines! P/ \. m& |7 z8 C. K+ Y' g6 `& }
* the actually available RAM size between addresses `base' and
' ^2 L6 G9 ?7 \+ n8 g3 J* `base + maxsize'.1 R8 G2 Q9 P% h& [! ?; _$ _! N
*/
" P8 x+ {" r% o6 rlong get_ram_size(long *base, long maxsize)' \8 \7 d4 ?5 N$ f2 l! L" U
{
6 R& j! i5 A! d3 i# R        volatile long *addr;
. i0 F, }' d, i% u6 `7 W6 F        long           save[32];# S8 @7 I, p8 ^5 o8 q0 |
        long           cnt;+ @' m# }) b% `2 [$ V
        long           val;- x: D5 f, B5 y4 {' [9 N
        long           size;. A  e* a2 \7 i: c% m9 J0 U
        int            i = 0;
" m1 z1 t/ \2 ]" l9 s: ]* u
1 |7 B2 U' M0 j( F" m) x        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 X' h0 w( v8 t                addr = base + cnt;        /* pointer arith! */
# V0 k) _1 y& `0 `                sync ();9 N4 q% G( w9 s
                save[i++] = *addr;% w8 y4 |. K: v, N( \3 g
                sync ();
3 S5 o/ E; Z  _$ c" w8 A                *addr = ~cnt;, o' _2 n, O1 g8 b
        }
4 F* D+ [6 m0 y) `# P# _: M6 k# m. S. K7 i; C7 T
        addr = base;
# x9 c# a0 D* v2 h1 Y        sync ();
/ i$ `0 h6 M; X- D, q        save = *addr;
$ B2 {1 v! w( \& E        sync ();
. _0 \0 b' {- }1 U* L        *addr = 0;8 ~8 I1 F/ A/ W) j) q' `) C
, \" Y% K' @0 ~+ e* m
        sync ();& |! W, k2 n1 u7 N; ?0 x+ B! h/ J0 d
        if ((val = *addr) != 0) {
  M# e/ l( a8 D. P, h9 S+ y( Z; l                /* Restore the original data before leaving the function.. e- @8 i0 [3 i6 }
                 */. V5 A- X: B5 {4 o- `6 I) S; v
                sync ();
$ P# P5 E) a6 {# ~9 O                *addr = save;: {- u, w+ u8 b2 J% x& a4 P
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" ~- ?% y9 p7 K                        addr  = base + cnt;
" U' G& @2 Y9 N- S4 {                        sync ();
: w! g% V, H6 U# s2 J5 t                        *addr = save[--i];
3 \& c9 v5 A  j5 X                }1 Z1 `' ?! m0 M# f, ~; U( ]8 _5 l
                return (0);
3 M, u  y7 T* A8 |6 W        }5 a$ `. j+ g5 \$ x
9 s* ~( ]7 B! C% t/ N
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) x7 ~1 Z7 e0 [3 k3 u6 k& }( A1 V) E                addr = base + cnt;        /* pointer arith! */
* f1 N- d% f: W" U3 H) o0 A, J) P                val = *addr;4 m( l: k' v/ _" D
                *addr = save[--i];$ e5 d* Z5 F& T
                if (val != ~cnt) {
- i* O' p" L8 x) F2 ?  B- Z0 \                        size = cnt * sizeof (long);, B( E3 v; k5 w5 Y; o
                        /* Restore the original data before leaving the function.
$ T5 U( a1 J& W' F( s9 h" ^' u                         */
6 k$ U6 o8 M% l4 q6 Z/ ]9 Y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 s0 g+ J0 |- x4 \2 J- n
                                addr  = base + cnt;
, z& A2 H0 ]( w% T                                *addr = save[--i];3 ?! j, L3 U# U- J; p" h
                        }6 {* p5 X  J) N- f3 {( J1 W, O
                        return (size);
* [  _* p( Q" J! z                }" L3 X/ k$ e1 ]
        }9 h3 @$ J) b" o+ }2 H

" v# k3 C& |7 F8 R: [8 l        return (maxsize);
4 u! `8 Q8 \4 a2 b) u6 l" E. i  d}
4 g# B' F# X" L" oint dram_init(void)9 c) Y) G: I* w9 E
{
; j% u+ ]4 C6 t7 R) o) P& j        /* dram_init must store complete ramsize in gd->ram_size */
( p1 k+ U3 @' z! p$ d        gd->ram_size = get_ram_size(
; b$ b" v6 |" l) ^0 w' M0 [                        (void *)CONFIG_SYS_SDRAM_BASE,1 p$ e# ^# K( X2 X
                        CONFIG_MAX_RAM_BANK_SIZE);
6 O& x5 y( E" Y% `6 h        return 0;
4 o5 t! b  c" g% ]' U0 X}' v2 Q! ?! h' w$ p: y; \  w, K( I
: G7 `$ X8 G% n: K2 F
- V! X% @& ]  a9 m$ l# \( Z

' @' v* r) s% l$ a* X# G5 J! v& {- N5 Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* ~$ |: d, ]# T5 A- ^* e" J1 e/ D

: Y9 j% s9 |0 x$ g$ |2 N+ ~) `. m; `
& p# N. W2 L: A, Y% G





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