嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, U) Y/ ?8 O2 s9 Z1 }# P( [+ W核心板2:DDR2 256M Byte   NAND FLASH 8G bit( H% i1 ]! q" N6 H0 {2 t1 {. Y2 x* |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* _/ k+ \8 a  K% l5 Q0 a

# m# Y' j) U0 i: V# V; L& q是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 v/ h# F/ R& t

4 _3 l3 i9 |# ~$ r  t6 [8 U0 C
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 L* P* t+ Y9 g; {9 D. c. Y( M2 u$ l
/*
9 ~" k& h2 g! q4 c+ [" a* Check memory range for valid RAM. A simple memory test determines0 W% ]1 i6 y3 w. Y$ g# c3 p
* the actually available RAM size between addresses `base' and
9 V, p5 }! J+ S4 r* `base + maxsize'.& u, l+ b' \) Y3 c1 _! l9 m" A$ {  i
*/
1 R: R+ O; V+ a! Ilong get_ram_size(long *base, long maxsize)
6 _) m  @# K/ L! R/ |- I7 s5 w{% L/ `. _6 y8 ^' s4 x, v% r
        volatile long *addr;/ M6 d( n2 w( L: N% f8 A" r1 z
        long           save[32];) ]( P: y" d# B9 x  Z
        long           cnt;2 F1 s; Z5 e! y1 X
        long           val;
/ N& S: g+ O# l' E        long           size;6 f. Y' ^7 n8 _
        int            i = 0;
, {/ k- v. L8 O) U$ I0 J% ~. G9 w2 u. W0 I- a( R# q4 T: Y: e
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! Y( B  T& n% u. t/ \) x& a$ K
                addr = base + cnt;        /* pointer arith! */
" Q% p: e/ g1 g- R1 U                sync ();( |; y5 F! E4 s' I& j
                save[i++] = *addr;3 F0 h4 j% ?; {
                sync ();4 e- M/ A/ z1 t& y7 L7 K3 \$ K& M- b2 k
                *addr = ~cnt;
  a9 @$ k+ f. B0 `0 ?        }
5 P2 B6 B1 i; w6 I: Y! }+ V. I& P( P/ Z8 m9 s
        addr = base;: Y4 q3 m6 g+ X& C+ Z
        sync ();# X/ c1 A$ w/ k4 j) |  q  X
        save = *addr;+ d. h7 v0 F# ~" A( x3 @
        sync ();: U+ }: F  `( l) q! p/ m
        *addr = 0;' t! n) d# P( a$ D8 k

" r: i" V. Q  u2 L6 @+ c& [" c        sync ();; a, s$ ?3 T/ E9 i. Y; I8 v# o0 o
        if ((val = *addr) != 0) {  N* J! m) A8 R4 ]! q
                /* Restore the original data before leaving the function.% ^! \$ i# J9 E; r) d
                 */1 r3 S" \2 {* o: H$ j
                sync ();, x4 q; m& ?0 t) s3 M, ^  p6 t4 t
                *addr = save;
" h7 |9 Z" v3 R  a1 f  _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 G% C8 x2 }1 ?8 C0 n' n
                        addr  = base + cnt;
7 y8 B& E  Z; C/ u                        sync ();3 D3 R; K8 y  Q0 W4 p5 L- ]0 Y
                        *addr = save[--i];
. G) B/ E6 a* F8 @  M! j/ p                }
/ w9 p) I& y$ t% z7 m                return (0);2 Z7 M6 U* m4 O1 L0 i- T& |
        }
  B7 b* }# A4 Y* _7 t& l8 I, U  u3 ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# K& c! }1 p& v. i                addr = base + cnt;        /* pointer arith! */
  O% }3 a$ f3 L! Y+ H0 J" J                val = *addr;
( e: }/ S/ c$ S4 z$ z, f                *addr = save[--i];& g$ ~1 J5 S/ L- N
                if (val != ~cnt) {
8 G8 |/ W: A1 G& e$ U                        size = cnt * sizeof (long);
2 V' U6 Q+ P: I! d; u                        /* Restore the original data before leaving the function.
4 x& W& G/ B4 B" E                         */
; P: E( S+ B. {                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* U* [# z7 [* R( C# a0 U                                addr  = base + cnt;( G. j( u" {+ r  [0 x; P* t% V+ w) ^
                                *addr = save[--i];% v& g2 F/ F; x6 e
                        }
, V! H; D3 S6 _9 r/ F. F                        return (size);
2 C6 k  A9 T0 ?                }
4 v* I& h; X7 M5 i4 H        }
, a+ ~% L9 A+ w" P  L
3 c& r% o( M6 b* @& n) j        return (maxsize);  i; N0 ^( Q  |( U
}8 W0 F$ [$ @+ J: f/ D' L
int dram_init(void)
0 g* A8 ~- y( b+ A8 a{
' B- w: z. [- n8 A        /* dram_init must store complete ramsize in gd->ram_size */% h! |( f! r3 |6 R# g
        gd->ram_size = get_ram_size(
1 L% n# \# P/ g. N) Y                        (void *)CONFIG_SYS_SDRAM_BASE,
" u  Y% a5 D8 O                        CONFIG_MAX_RAM_BANK_SIZE);! u0 N! e0 Q2 T2 G
        return 0;1 j0 W' W: v. V
}4 n' E! S0 p- Q7 x

; z' S. _3 |3 Q0 D/ g, \* e: I7 Z3 g6 k; D# I0 P

" @( g& c) C, B6 `/ J: a- I! |
, o  w" c: C# V0 R$ KFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; X5 Y' ^8 l* L5 ^, h* {1 A( r' t/ |% o# m
% m  v9 N# W8 ?( O+ t6 ~

* r( b# K( K& ]' h2 Q* p3 }& s2 S




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