嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
" a+ M/ c# `! m) A) B* v: N. @核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& U! C; ^; F0 d这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
  ^+ J& z" j5 @+ w9 i- h  ~2 p
- ^, c8 |6 f2 k+ E8 ^! J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& g3 w( D+ U2 j, O
* w# F1 C% ~: N- m
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" a- a8 k& j' ]2 V/*
9 ?5 P  H0 P8 B; l- ]' J7 h) F* Check memory range for valid RAM. A simple memory test determines
7 @5 L1 v# d  @& R" k* \* the actually available RAM size between addresses `base' and0 p$ ?! {, ]# f4 A! K8 F' \$ f
* `base + maxsize'.1 S/ C: `7 T1 W: c4 }% n3 ]
*/. I! _4 E+ c8 l- Y: t0 P3 x3 g( a
long get_ram_size(long *base, long maxsize). z+ p# G& l# G+ L/ Y
{' a9 G+ f8 Y: e6 b
        volatile long *addr;; `% M. k3 U. a$ h
        long           save[32];
+ Q: ~9 v0 o) G* r  t6 R# }- q        long           cnt;
9 E; {+ a2 s1 Q5 a* g% n+ c4 m* c        long           val;) b! ]+ e' U! W' k! E5 X4 E
        long           size;# U  D0 [( H8 y7 u$ J* a
        int            i = 0;
% F; \, F7 ~, H& Y2 u
+ E9 U- h0 s* }: }/ m        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* R- i$ _  O- {7 U8 `
                addr = base + cnt;        /* pointer arith! */
3 o; J# p* z3 j+ L8 Y. ]; c/ {3 ?2 {                sync ();
; b$ U+ {" W7 B; k3 l( p4 s                save[i++] = *addr;
' b+ U4 J* L+ }# w" T. u                sync ();4 G8 M. v9 C- x: W% D
                *addr = ~cnt;+ @# k( h% e, p1 |4 g% d
        }
% K2 A+ N' Q5 D; S! d1 H2 H& f& l1 a" u. o. ]" X
        addr = base;
8 d1 K& N' [4 l. Y4 F4 ~3 g* i        sync ();
$ c4 b8 s, }: [8 A4 e! r: w        save = *addr;
9 E0 \5 _# K! p        sync ();
8 v9 `- c5 D: D4 ?        *addr = 0;2 M0 G$ ?" q- C
- F! r: E* M( ?4 n
        sync ();
- C7 z7 S! Q7 ?' B# [        if ((val = *addr) != 0) {
+ Y) b, B; W: J0 f! p                /* Restore the original data before leaving the function.5 y# J! D7 F7 u: b! `* ~
                 */8 ^4 T% O% ?9 _6 p* L9 H* p: \  g: G
                sync ();
; y: p2 G/ d8 @/ F' x( ^5 k                *addr = save;6 K# `* O  _, R) Y0 O, ^8 X2 ~2 K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' |) _9 E$ s: p! r1 U                        addr  = base + cnt;
# J& v1 B' s$ i% [# G* F. T                        sync ();/ f) ^( f5 [5 M/ d! H2 ^# O9 @
                        *addr = save[--i];
' J# `9 v1 Y/ r                }
7 n8 Y* R9 I7 g4 N  O  J8 x                return (0);/ L# A5 \" {' A1 N! z0 S
        }
# Q7 g* }# g  V  @& n1 {; G* U6 r/ K" u0 L' ^
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! \  s5 e; q3 b                addr = base + cnt;        /* pointer arith! */
/ ]( M: N. b( _                val = *addr;
0 h  s" U7 [. r1 i' G6 q1 k                *addr = save[--i];
% j2 m! E* z2 E1 i' j8 a                if (val != ~cnt) {
6 ~% j  |% I9 v6 }- ^; Y                        size = cnt * sizeof (long);% K2 n* [- p. l0 _% x
                        /* Restore the original data before leaving the function.$ y. u+ G3 @5 |- r% Q, t
                         */& J  Q+ e7 Y3 B
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- z' d1 m( _# E" Q8 y
                                addr  = base + cnt;+ [. m: i, W1 f0 d9 P
                                *addr = save[--i];% o8 @: O% |) c. l
                        }
+ V+ E) Q9 q; r9 u5 l" A                        return (size);
. h+ s3 |5 i  L" F8 S2 y& V  A                }3 p+ P5 p, X0 I: z" g" H
        }
) k. W2 U( ^7 V' M2 c" m, S- j  X' K$ L# J8 {5 v9 K  q
        return (maxsize);, k2 ^$ p! ?% Q$ C
}
: O1 P, B9 a9 M4 y9 A2 r, ]" aint dram_init(void)' r8 M# u3 p! d3 u
{
9 S. m6 w: B) S8 M% l9 h        /* dram_init must store complete ramsize in gd->ram_size */1 _0 |# |' A6 {- y( {
        gd->ram_size = get_ram_size(
* h2 ]  Y8 m) m5 S6 [9 b                        (void *)CONFIG_SYS_SDRAM_BASE,
8 L6 w  k" e; k5 v                        CONFIG_MAX_RAM_BANK_SIZE);
0 t) S. J* X) A3 E4 y+ ]- }        return 0;
( P& V8 }% K8 H# F$ J$ ]6 Q}
0 Y7 u0 G" [, d$ d+ i; _; D; y7 }" W$ t" q) G9 Q) [

+ Z2 m; C1 P* m9 [# H
+ ^2 v7 I. e1 F. M- t  e# U( T% H# x
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 C0 H. i1 q9 k( d- ?' q. F+ D- Z# q2 A3 N( }! t' B

/ G- Z( v7 P" Q+ M' D

6 M: ]9 A4 i% M/ P* t




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