嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' z7 H$ j$ D% v1 [核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 }. J# S" m" D+ ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 Z$ L0 T3 x! t% \  ^, L' Y! G

- Q2 `0 }8 t0 r' g是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?7 w. N( z6 W% ]' K2 G# I( O8 [

& e" t1 W+ U- I& o( {, s  X) M
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* e5 I" @% B. r4 f9 O
/*
+ ?7 C- b) D1 g5 a1 t3 p- a* Check memory range for valid RAM. A simple memory test determines
7 w: `+ N  E/ x: S! _% k* the actually available RAM size between addresses `base' and
6 {( I' D$ o6 x* i* `base + maxsize'.
% b9 l% t" J7 G: h' O8 `; _/ M# k; I- ?*/# ~* ~2 |; U$ X1 Q. ^" Y
long get_ram_size(long *base, long maxsize)  s' N0 \# \$ P' h. i- |
{( I( m- n- z, y1 z% b
        volatile long *addr;: s2 Z: S- S) N  @1 o
        long           save[32];
% ?& l' K& G- r6 h8 L9 U+ x+ ?2 n        long           cnt;& y# x, n  B( t, u# C
        long           val;
1 P- {2 v# ?0 ^3 d4 w" `        long           size;( V: x& Q& a/ n8 c: o+ c
        int            i = 0;. N* C4 i; H: Z/ Y2 ?" \" V4 Q$ x
8 e; ]  c0 k" _' w. c( x
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* I/ s, H: y  c( G4 s                addr = base + cnt;        /* pointer arith! */
# x. a* J$ N7 O+ H- y# U7 r+ y  D                sync ();" [$ I3 {7 c( j1 Q5 Q' r, Y
                save[i++] = *addr;
0 O( T3 I( {0 t) T& L% w/ a                sync ();0 f4 B4 `  K. `# L, e
                *addr = ~cnt;
3 P! F9 k7 s' f9 t% R        }
' J& h" G* T4 v; M. ^$ Z7 F) f% H+ [( t' l6 o7 z' z
        addr = base;9 S( T& L, X, S
        sync ();
# j! H9 D  u4 H9 O        save = *addr;
- \) G7 Z1 N" Y1 k1 X; q! B        sync ();3 v6 @+ S$ N# z6 A& X2 p1 ~& n
        *addr = 0;: b; N+ j. V+ y* {& n. p

) p* y8 X9 u3 w        sync ();
! |( G& V4 t8 k9 ^! i" s/ c, M        if ((val = *addr) != 0) {
! _0 r" c8 U! A  G                /* Restore the original data before leaving the function.
: `; ^# r: M0 k; r                 */
' P) z+ P; w* X+ n- K+ s                sync ();! f. \! ]1 b, [; [* `: {7 i, u4 J
                *addr = save;
! k# W  w& @, L! v* I  a# R                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ p' L" h5 q* o. t+ q" N$ v' H
                        addr  = base + cnt;- j1 Q: j4 d4 C) r0 p( w& e5 U
                        sync ();
/ ?$ U  {) j# g' u" k, O; [                        *addr = save[--i];
/ D: ?3 u. ?" @7 B( m5 X                }
+ P/ V7 r! W' C! P; O                return (0);
- A% b4 n3 B: X: A% ~        }
3 I8 [2 ?% [% \! r2 f7 |6 L7 U9 |- s5 N, z: u% p
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, V! ^0 O: ~" u4 E
                addr = base + cnt;        /* pointer arith! */
8 b/ q( i6 D% y/ ^                val = *addr;
& ?# p; D$ y% n9 F                *addr = save[--i];
# g# t; x1 Z1 b/ E% P! F- _                if (val != ~cnt) {. n% q( y; \! H' r
                        size = cnt * sizeof (long);
) T2 `! N* d) W3 ]$ z! Q" M                        /* Restore the original data before leaving the function.
* Q0 M0 b5 t  F  ]2 _5 u3 k# A& H9 v                         */
( Q! ~. ?( k1 Q6 b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, z9 U- ^" L2 u" I' j9 K0 C% G                                addr  = base + cnt;
' u$ W7 e7 R4 S+ l/ ^                                *addr = save[--i];
. _& y  h+ j; g                        }- K. G) f& S: G1 ?# Q+ K
                        return (size);  \9 E, G' ^0 {. ~- d9 V
                }8 N' e; p  Y* [- f6 x  o; W
        }
# ]; g5 k$ D% V( x/ l
" b' l$ j2 i- @; K$ F! L, E        return (maxsize);
, ^. I' j: |6 w6 w3 C}
: t5 g7 ^. C1 I, U* Mint dram_init(void)
/ F# T" |3 d$ x7 I{$ Q( R5 A; W* Y. P8 e+ @. {/ l
        /* dram_init must store complete ramsize in gd->ram_size */
- ?4 L& ~4 |! w; F# q        gd->ram_size = get_ram_size(
' g# Y* e% B0 V! V: N                        (void *)CONFIG_SYS_SDRAM_BASE,/ W$ R( j9 ^( y, F% h7 X
                        CONFIG_MAX_RAM_BANK_SIZE);- `; }0 K1 u5 ^
        return 0;
: T: u- U5 H1 e+ O* {1 H}/ U6 g7 X4 }8 ?
0 Z2 @4 q4 k3 c5 ]& j1 ]
7 \6 f7 x; a7 g+ W4 I$ R
8 d9 ?3 a* o) j$ y( [
. @3 F: p* Y4 ]# a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 y7 q6 O( g4 B9 G4 e; y! k6 F4 Z5 u0 ]/ b1 b# {9 {: t

  L& ^: t& u+ I

/ P* s; W- L! _  \/ u2 M- b0 J




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