嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* O  v$ \; }7 n" r0 c, v4 D& @; x
核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 K) N% W! }' G/ N. F, r8 _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 C2 W  y* g+ V. k/ q& k! L- n
! k3 z% u2 X$ e, B/ x
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; x# i! X6 z- N# {7 y2 E& @4 |, z+ b- h, R9 V$ g; ~

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 m* `( L: ~& w) Q8 F# a' H8 @* w3 F
/*
/ E% L7 P; P0 E% I* Check memory range for valid RAM. A simple memory test determines
, d3 ^" K% W6 `2 U: i1 T& I* the actually available RAM size between addresses `base' and
/ u/ [5 \- W, O0 n- t  K* ^* `base + maxsize'.
# Q/ I$ [5 w! e/ E) @; u*/; j  z; S* r" G. a% h
long get_ram_size(long *base, long maxsize)# ^  W; K  X1 V0 [- K! v- B
{
! i) m- D) {, T: o( _- w! O) a' Q        volatile long *addr;0 n" H! B" z! i5 L1 }
        long           save[32];( p/ |5 I9 l8 S4 ]+ q' w
        long           cnt;5 V% u/ ]' E8 [. z! ^$ @7 i, l' z+ K
        long           val;
3 Y* C: n6 l2 q        long           size;+ K" O' J  G. j. y
        int            i = 0;1 e0 Y+ o+ i: p3 |% ~5 z

: Y9 ~; R3 l2 g. C        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! C+ [9 c9 w' a) J. ^* S
                addr = base + cnt;        /* pointer arith! */
7 X1 p1 K  u& I  w                sync ();- J6 G) F# w; ?% U- N( ~( h# K
                save[i++] = *addr;
. r1 Z2 T) s7 [  x! J" K                sync ();. G2 E: ^8 ^% G
                *addr = ~cnt;6 X! \4 h; b" L0 p" @9 j
        }" L4 q; B$ O1 c; I) W1 ]

# a% g0 ~  g( }9 O0 [- H4 U        addr = base;, i2 X0 A3 t/ |! G4 \: M6 G
        sync ();* ]. ]  W; M7 B  a3 h/ L
        save = *addr;; m% K9 a1 P8 [+ y# N- a+ l4 D
        sync ();' U1 h* Y+ o9 p, f  e0 ^& I
        *addr = 0;
1 j0 U+ Q- Q' S4 `
2 I" I! D8 q$ ~3 v+ a7 s4 s* W7 z* ~        sync ();2 p- \$ X7 {- N7 g- Z
        if ((val = *addr) != 0) {+ u4 u( f$ ?6 L% s9 j* Z1 y# `* s! P
                /* Restore the original data before leaving the function.
1 G( [# W, d4 d; a/ ]                 */
8 M; e, N7 Y  M2 {5 T1 T                sync ();
7 y- g( T/ x, `) q4 s, _3 Q# n                *addr = save;# H. C: w9 U, m" F* O/ ?4 G' v
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" n9 p/ t% D# K! e' u                        addr  = base + cnt;
6 h: z9 H! h- G9 J. }, |; q3 A                        sync ();, p' j$ u- M7 ^. D  W) Q
                        *addr = save[--i];9 q3 G+ v: U( A. f5 L& Z
                }" Y$ m+ ]: a  a  h" `& T- j9 ^$ M
                return (0);: ]9 `, C) d  ^/ H! Z+ ~4 |) Z
        }( V+ U0 V6 ^; W& ]+ ?3 S8 F
8 y; V# B+ F7 n: ^. y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 W6 L# R' I* y) ?, e& ^                addr = base + cnt;        /* pointer arith! */
; Y3 h6 u# [5 N                val = *addr;8 g; |  w7 T7 n8 t6 g- q0 w8 ?2 k
                *addr = save[--i];: v( o, `! X9 \2 O: b6 o4 A# Z4 A
                if (val != ~cnt) {2 A- j! m% A: T! u! \' C+ Y4 r
                        size = cnt * sizeof (long);
7 g# W- G3 `  s                        /* Restore the original data before leaving the function.- k" G, r' T  g. e
                         */$ j' f% Z) P! b& T, [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; Y/ L% [& Q3 g( c/ b" t: G
                                addr  = base + cnt;5 ]. d0 ?' c$ ]0 O4 [
                                *addr = save[--i];
3 g* l% V( Q$ Y# e( G& f0 F                        }* M( _; I$ C# _; S$ g+ r) r* }
                        return (size);
" B# I6 H" W3 Z2 x* k                }5 Q* o6 e9 S# o. a! @; z# }) r8 u
        }1 w1 c: I8 p$ Y# L: w1 ~( e

0 ^8 {3 K1 k1 X. _& Q  C* c  ?* E        return (maxsize);, o4 N% n9 K1 Q+ S2 E# }4 G
}9 H" b0 _( g. X
int dram_init(void), x, c1 O8 G9 _  F
{# W2 ]% l# F$ X& r# c9 n) x( S- n
        /* dram_init must store complete ramsize in gd->ram_size */
. ]/ k5 C/ K8 c) W/ p* v; M        gd->ram_size = get_ram_size(( n: [# d5 _4 Z& E$ Z
                        (void *)CONFIG_SYS_SDRAM_BASE,* i$ Z' k% b: U9 u
                        CONFIG_MAX_RAM_BANK_SIZE);
  w4 t( n7 ?4 g1 L# G4 w        return 0;
/ o& B) C) f- M+ ~8 j}
, d! h3 Z4 n  ^; v) K9 y. G2 P1 x) e/ P7 ~

8 J( K5 X$ Q( E, l3 e6 ]3 o* j5 \. p$ `

9 N( M( w' b7 Y* d  o( BFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 o0 v2 @" u2 N
0 m4 o1 `' S3 v) a$ L7 M: J( g  h* _3 \% z& N6 B
, x  |; J- }: W. R3 R5 u& Y0 g$ \





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