嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 P- n; O' i. H" ~: E% d$ u
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* D: Q- c7 i" e2 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ Y0 }. k; g: s
+ N! a+ q7 z) x是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' h8 B) e1 Y+ m' O. B. w2 s
. M+ P/ f2 U! p2 s

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: S8 R- R$ u/ f2 m' t0 ~/*+ E+ ]6 p! r4 Y
* Check memory range for valid RAM. A simple memory test determines) e$ s6 c1 y. `# }( E& _
* the actually available RAM size between addresses `base' and( A3 _: z4 A' `0 X/ i0 x- O
* `base + maxsize'.
  s& u9 z: I5 G6 O+ V- t! |- o*/
" Y+ r* t% s+ xlong get_ram_size(long *base, long maxsize)
5 {" b" }: _6 I- s2 w0 P# r9 K( M$ j{
( s& ?/ b5 y) I& V        volatile long *addr;2 C4 E- T7 v- J! `
        long           save[32];2 d1 R1 Y1 B) D' g  y6 N/ c
        long           cnt;
% C4 a( a6 h0 j2 [- ?9 _! N/ |5 F        long           val;; p  O/ |$ O0 V: h% r
        long           size;
8 n/ V! B: x, G! K% P        int            i = 0;
; E+ m2 `' R! z  a. [) Y& Y4 |
- n% n; ?% E/ I: f        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 `0 j" G: q+ Y2 b- N3 D+ k
                addr = base + cnt;        /* pointer arith! */
! @  B5 k4 W4 @& d4 y                sync ();0 p0 H: x4 r* w; N* m6 I
                save[i++] = *addr;5 b; N5 d) Y2 C& G$ ^9 W; f
                sync ();, ^! d; D, U" J
                *addr = ~cnt;- X$ L/ N+ o# L+ E2 N% j$ f
        }
$ Z" L4 m( m' D! c  V. {
2 f& a, g1 Y  A% J4 t, ?        addr = base;8 |% j5 }! p7 m2 N
        sync ();1 {1 I4 @( t4 V' m1 r- w, Q6 w
        save = *addr;/ {6 |& f% p5 h4 Q; p& p" n# B9 g
        sync ();: n; S6 a" e6 `$ f7 O
        *addr = 0;
/ m2 r7 ^  q5 r# a& ?2 ?5 M% i4 h* }$ M8 C# [* G2 {. ~
        sync ();/ T* y6 P* T' E+ P
        if ((val = *addr) != 0) {; n- j* l- V% c! |0 _& R& n
                /* Restore the original data before leaving the function.% P+ s' c5 P* z' z
                 */
7 @, W# r5 U7 N                sync ();
/ _( v! z+ A1 I7 y4 {/ ?                *addr = save;
3 H2 [) J8 v4 L8 |) _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {5 Z4 u1 Q6 t) ~4 J4 h7 w+ a
                        addr  = base + cnt;
7 q  c% k7 g7 q. t9 F1 @                        sync ();
& S4 C6 R& z  b, O, D9 _' g/ S                        *addr = save[--i];
# l$ e/ @" W: w3 \. E- \* ^                }8 e. c, G  u: ?6 M- Q: L4 y
                return (0);
( H& w2 T/ M" s8 G1 y' k        }
6 d0 h" c8 H- S+ u& U( H2 |0 D$ u6 U* Z- {# _2 E3 c# E. v; F& Y+ I! u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ ?/ o# n4 u; k
                addr = base + cnt;        /* pointer arith! */$ l# t8 \7 H1 C' l4 p5 P1 W3 M
                val = *addr;2 `5 p/ f5 x' B4 j4 P) P
                *addr = save[--i];
& |! s6 U+ {+ v- c3 _# e7 G8 g                if (val != ~cnt) {
) T- L* z: P3 w, o# E5 i- r- j, \                        size = cnt * sizeof (long);
0 F/ o$ ^2 G* X0 z% ^                        /* Restore the original data before leaving the function.
- p% Z' V2 {4 q. K' Z+ Q% M                         */7 ?4 T: b: G) T7 v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 W. p! n# W. h3 e  L7 ?4 S
                                addr  = base + cnt;1 l0 h; F4 h4 X
                                *addr = save[--i];
; _7 x: ^4 F/ _$ O& C5 ?                        }
8 E: J3 H" g) o2 j! v; ~1 q3 s+ K                        return (size);
, F# M/ O$ o. B  O. F                }* K4 o; H3 A$ F' @
        }
; \4 u0 T6 }! v2 ]0 k! N- C, X% ?" c0 c8 k8 I
        return (maxsize);# a. A% _/ m6 j# z0 T2 F
}
$ R6 J' s6 ?  m% Iint dram_init(void)
6 p* H1 i4 I0 X{' }/ W8 K3 [2 k
        /* dram_init must store complete ramsize in gd->ram_size */( F8 [" c) H  }: k7 s
        gd->ram_size = get_ram_size(' r& [+ C: R0 K$ [3 Y
                        (void *)CONFIG_SYS_SDRAM_BASE,  I9 W/ @; h6 v
                        CONFIG_MAX_RAM_BANK_SIZE);# ]0 Q2 S  ?; Z; [" W, F/ y7 T; ?. ?
        return 0;0 h" I; ~9 U2 [
}
* N# V8 R  a% x) P8 f6 K( Z+ R% g8 x
% P: T: D/ P" T; N# E- z' N  P8 o) b

+ b8 n9 Y1 \3 o* K* {( W/ V8 Y
! n' l0 _5 O, P3 Z  f( FFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# R& `" w( C" c. J; E! e. H
& k. j7 X, ?5 }/ _0 h4 |. l" G
7 |5 W  p  a# ]/ i4 p6 g
8 p# U0 d: a; Z/ d4 w! _





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