嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# x- J& `0 G( i, U/ C% t3 d; G核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 C3 [/ t, w# r% u) h这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 X" G( ^! g' c! H  f3 H
" u1 g; P! d; L$ C
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 M' D5 a* I8 P' l- h6 `
/ Z0 I( F/ N6 g* M$ [$ \; T
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
; X! u/ k; B8 H1 d* Z' t/*1 A5 X. _* a4 Q9 u) j6 L. w: W/ G3 m
* Check memory range for valid RAM. A simple memory test determines
# B3 \+ V' Z: l1 Y* the actually available RAM size between addresses `base' and, E" ]: Q' T+ a0 j: [" l
* `base + maxsize'.3 e( z- x! T5 q* K/ m+ D1 w: u6 m
*/$ D- m3 x$ C) t$ O! |$ N
long get_ram_size(long *base, long maxsize)
. E0 m6 d. O! X8 M: ?% |{
! g+ g: z# d5 e! m7 W8 f        volatile long *addr;( Z0 [% z  [. N% c' J  ?
        long           save[32];! p( e& ?( H* y$ n3 M
        long           cnt;# b) {+ a6 _6 Y' v% j# ]  j) c
        long           val;- o8 \) m4 O7 W
        long           size;
+ u/ a6 y! a7 J' t        int            i = 0;
# t$ B& H( B+ ]" [$ u% H" P3 m' [9 y+ O1 @: \# ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {9 n3 a, F  E5 a) }- p: ^- A6 a9 c
                addr = base + cnt;        /* pointer arith! */3 X& C: O# W: O+ \6 Q: Q- I' s8 W
                sync ();% ]2 s* v2 k0 J+ W8 ]5 `
                save[i++] = *addr;" N/ J  B" C) T  ~; G1 B
                sync ();
+ K4 {9 f) R+ u- T4 ^8 @, f: K                *addr = ~cnt;
* V0 R9 s' F$ u5 T$ }" p        }  ]+ t' I, D9 N. }+ X3 @
; m3 p/ O" G1 J) U
        addr = base;
# C( d, D) K) j0 G        sync ();; P9 A2 J) x# _. j* }, r
        save = *addr;% @) Q) }: d6 W' r5 C. l- a; O6 r1 {
        sync ();
! d& S6 W4 ]3 C9 q# w) F7 t        *addr = 0;
7 k) a' ~7 q. U* O8 X3 q# K0 q4 S5 [% v3 f0 x8 F
        sync ();* y/ E; @& y+ @4 S3 @  u5 `. }
        if ((val = *addr) != 0) {4 s; N+ |) c) B! B: R$ }
                /* Restore the original data before leaving the function.
8 C8 s( W: b8 J! T6 i) H                 */& q+ x# J1 m+ b' K  Y5 I
                sync ();+ M/ _; l8 l) s" A
                *addr = save;2 o+ v1 g6 a" n, d; p: }
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {, o5 M' W' k3 d: N) @0 J! L
                        addr  = base + cnt;, Q" C9 i& i7 V% _4 q7 [: B7 |' T
                        sync ();( X: T) d7 I1 N: }
                        *addr = save[--i];
5 g1 }& f. m* h- J, x                }  j2 m0 \6 ~: ~" d" x, B3 _' B3 j8 y# c
                return (0);: g, ]1 e( f0 C) N/ r0 f
        }& |7 e* \) `; J* I

0 Z% F" B! d3 N        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 c- `7 U9 f2 o# z6 _
                addr = base + cnt;        /* pointer arith! */
1 _8 x1 w* v. h                val = *addr;1 J* W' y: A$ x. W$ X$ c0 [
                *addr = save[--i];8 H% y) [; Z: A( B- g: \
                if (val != ~cnt) {
# C* k6 X% x7 p% c; k" P1 m- H                        size = cnt * sizeof (long);
( `" ?+ Z) q. t- T1 e) a. k. o. y                        /* Restore the original data before leaving the function.4 S& C, A: I& w6 O* t7 M
                         */
7 R( ]$ m: b+ y" E3 ^  w                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 w4 R# g# Q* D1 S, q/ Q                                addr  = base + cnt;
( f- U) W, l5 k% l                                *addr = save[--i];0 o  E1 S8 V' b2 F" ?
                        }  s; R: Z; X0 w
                        return (size);
$ ?# r& [1 z$ l. T  E0 G( ]1 H                }
; g6 F& T5 |' `$ S" `        }+ m4 G/ T5 F( a  M" M) e2 H
3 b# W3 R% B: H5 B" X, |; c! n
        return (maxsize);6 U" `; A$ D/ E0 v
}
! L/ r. j6 S2 Nint dram_init(void)
$ A7 i  A0 V8 y! ~* e{
5 c9 D: e# `8 K* @# ~7 Q        /* dram_init must store complete ramsize in gd->ram_size */
* Y( I! f. D& v/ H3 ~9 V        gd->ram_size = get_ram_size(
2 t0 k8 b- a. Q8 Y0 l, ?0 @# H% `                        (void *)CONFIG_SYS_SDRAM_BASE,2 _8 a. k3 {; [  P0 K/ j3 L
                        CONFIG_MAX_RAM_BANK_SIZE);
5 E& ~, C7 K6 m6 }        return 0;0 S7 W  X# f, `
}
. P8 }' R! k7 ^. i$ {
) M" F+ P5 e# [' B
) g7 B8 w# u1 B+ }* q
. A' e( N% O  l4 M, X7 f( }
9 p8 |; |3 z2 |) O7 r  rFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* a: p( [3 A* K9 T

6 u7 w' ~5 H, F
0 `( }4 \7 h, }$ i7 }0 ~
+ [9 n2 s: F" C! C( h, `$ T





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