嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. l1 q  [6 ^/ q; T2 }7 l
核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ U& M- i/ v8 a7 }- y# M) k3 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" b. `4 V7 Z1 E! c1 Z& u0 C. z6 t5 L( A# s9 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. J3 K7 n) v' [$ N- P  H9 z) V
, p* w( ?! Y3 v* n$ G

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! z$ o3 {- Q0 _5 d" _1 d, C
/*, Y6 _( ]0 V1 w: Y; W3 ]
* Check memory range for valid RAM. A simple memory test determines
: f3 G' V$ V. J) D" z, b" v3 T* the actually available RAM size between addresses `base' and6 w5 G) M9 ~( }" a' m
* `base + maxsize'.
% }$ x# u$ k. C% n4 P4 h*/
( B  V# r4 f+ E9 k$ Qlong get_ram_size(long *base, long maxsize)
) U3 u" }6 s" o& f" x& F{8 J; Z1 n5 [4 g2 D; x7 D
        volatile long *addr;; q5 g  _) q, l8 T. b& G7 F% I
        long           save[32];* V. Z2 Q; k- X
        long           cnt;
: M/ [# q! P5 r; W9 F; U1 f        long           val;! Q" ~, N8 q0 }; Q7 X
        long           size;. d2 b9 O  [0 ~2 K' {7 I
        int            i = 0;
. m+ g: V' D; i* h8 H
" G2 V3 f& z  J" Q3 c9 Z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) O1 n" o+ c% c8 t/ ~
                addr = base + cnt;        /* pointer arith! */
: i6 T2 z2 d1 W! U1 B# A                sync ();
; X* G! \0 W/ C6 y4 p! n0 X                save[i++] = *addr;1 E, ^. _: |3 p- L
                sync ();
5 s3 a! ]7 [) T2 [3 \  f                *addr = ~cnt;
: |+ X7 L( |& f6 Z        }
% v: |# ^- H$ D# t1 p" }+ n
7 D% X- w' [$ R, L        addr = base;0 M  ~& b  b4 {- W
        sync ();
; \" I, M, X3 s5 _        save = *addr;+ M0 Q! Q  j3 M/ v0 X) |* V
        sync ();
' z) Z) J6 ?3 i1 C, O% X$ o        *addr = 0;5 E7 u7 _  Q0 d) L2 H
8 p0 I( b: z$ P
        sync ();; w7 X$ m$ X8 U1 ?
        if ((val = *addr) != 0) {
+ Z, u5 T; L" b1 r                /* Restore the original data before leaving the function.
# e! I  b1 R8 y3 l4 N7 b                 */- S; |1 N  m% j: }
                sync ();% V. X' Q2 n8 l) ~
                *addr = save;
: q* T" S# }" j1 c                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
! s$ U9 e: A% l3 |                        addr  = base + cnt;# `0 T8 G" R1 \7 ~3 v6 x- j
                        sync ();: @0 G2 @5 b. R9 t4 V1 Y
                        *addr = save[--i];) C+ f# W" r9 r) C" N3 ~
                }" t7 x, J7 C- _5 l/ \
                return (0);% o+ [. x: E/ x8 Y9 {+ Q1 ^, ^
        }7 \- @2 L9 Q6 k9 T" L+ r/ [
" ]3 S; w9 f: t+ `2 g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; W8 R5 ~( D/ b' d                addr = base + cnt;        /* pointer arith! */
/ R. I- U+ q- B% g5 \1 V                val = *addr;
; B1 {) n7 d- |# ^8 k                *addr = save[--i];
) Y, S' D( |4 j/ _+ F/ |                if (val != ~cnt) {
9 d0 A8 o) s# m0 _; |, X                        size = cnt * sizeof (long);
) w- N8 i' Y9 O, l# Z- O                        /* Restore the original data before leaving the function.
1 x4 `7 U) _+ d* O7 J3 ]2 L5 B' D                         */1 m2 m& M' D! i5 k9 [* Z6 C/ ]
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 f/ d! K: k, F8 {8 H( p/ D: q                                addr  = base + cnt;8 P2 G& x  y/ C
                                *addr = save[--i];2 O/ m' k% W& b1 V' T6 J
                        }
7 x) T" z* j8 I7 q! p, W                        return (size);$ F: u! i1 ^7 z9 ^6 I; h* O# c
                }6 N) x8 ?: l4 }% c
        }# D9 |$ |* \) m4 V/ J5 N5 J% {
6 y. }; O( _7 p, F) F* r  C$ O
        return (maxsize);0 I1 H/ [0 `1 I2 g) @
}  J0 J1 e! i% L0 u9 _3 m/ O
int dram_init(void)) b( A3 Q; y( R' y, E& I
{& Y& q8 f, g* z" s1 F$ l
        /* dram_init must store complete ramsize in gd->ram_size */  \% p, A" U! O
        gd->ram_size = get_ram_size(# Q4 [" D$ V% t
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 N3 y+ y, Z+ Z5 a/ ]                        CONFIG_MAX_RAM_BANK_SIZE);8 H1 K9 Z3 p: `6 C
        return 0;% o; p" G) ]. u) T# d) N
}  V0 B! I4 @  T- S3 w4 ]

$ d* e- {1 s4 G2 Q0 u5 B8 L- o& g7 n; y- Z0 L: M) f9 q
% c1 c; d3 E6 i+ O' r+ a" S) u5 ?6 |; Y

. M8 y- |, g" U7 O/ |. f' ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. K) a2 P- \; |9 j+ j& W/ L8 [) d9 g" O4 a5 z2 }6 s, y

) a1 g+ b/ A' ]& j; h8 o

/ [; `7 e+ w1 e8 p4 s, Z3 s; q




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