嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit5 C9 Y" {) J' r  |3 H/ y" H
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. Q4 `. s; g+ O; `3 q这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 W9 Z. Y1 L3 [. x( h2 n
3 P- y+ p; `8 o7 a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) x7 X6 R' }% e/ M+ M# X
& H: u2 h% x: ~$ J" Y
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:5 N% F, h$ u( [7 h3 o7 s- k
/*6 N0 w6 T& n5 B/ [  y) E. ]
* Check memory range for valid RAM. A simple memory test determines
' x* N/ E) h; d& t2 l  W* f* the actually available RAM size between addresses `base' and
2 e0 p/ r9 q; E% I; j  A* `base + maxsize'.
" r; v+ \. l0 O*/
" m9 n0 d0 y! Y1 A8 @+ elong get_ram_size(long *base, long maxsize)
) u! I0 v1 `5 B" n$ }0 a7 W{/ p% m( X) g/ I7 o  q
        volatile long *addr;6 f# e: U7 Y$ i# P7 N9 \. v
        long           save[32];; |  s0 H' J# m2 D8 |4 V/ X5 Q
        long           cnt;
" t1 \: y! |3 s0 e0 W2 q) z! [        long           val;6 J+ c. K% r1 |
        long           size;
% D) c) g& i0 n; ~2 K8 ?2 w& B        int            i = 0;
5 G/ z/ f6 s3 p, L% {
8 j9 H3 n2 S% b        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ S' F5 c7 n" B" n                addr = base + cnt;        /* pointer arith! */
* H. b$ I$ P" b: ?3 `" H( N                sync ();
/ {3 `) q1 t, n0 J; a" O                save[i++] = *addr;
) r4 l, g- N/ ]& P, X                sync ();- F6 b/ O& W& [
                *addr = ~cnt;3 G. R8 l! M4 o4 C2 N- l5 k
        }
+ L' {' e/ S- N/ ^' T; }. `, k9 u! g+ G4 d5 o% t$ o2 E7 X
        addr = base;
& \3 H: d- ]$ l6 x( O        sync ();+ i8 _# f# r# C% h* o( @& u
        save = *addr;
& [7 Z, }6 [9 d; y1 y        sync ();! R3 T: _. ?5 S% @
        *addr = 0;
. v! g* u$ }, S9 g- f" L$ h- o+ I- J, J& o* A! s$ t
        sync ();
3 m0 p& C8 Q% J+ R! E" a        if ((val = *addr) != 0) {" o3 U: @# Q/ N- Q2 n! E4 ^) B6 D
                /* Restore the original data before leaving the function.
0 [- Y4 \; S" H, F                 */
0 H( Y/ o1 `; I2 V3 T0 ]                sync ();' m/ ^1 ?& k  Y3 f' _. H
                *addr = save;, J* O% s; {7 p2 c& i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' f( B" R4 b7 a( f. N
                        addr  = base + cnt;& D6 G3 z; m2 ~4 \
                        sync ();
4 `, x6 Z1 @5 o9 d% ?. G1 I* {/ i                        *addr = save[--i];2 G2 E: U" h6 L9 M. q
                }
+ H) `# [0 a+ {; R                return (0);4 K* ~9 g0 _$ v8 U) m7 Q- p
        }
% `) \: R2 n5 R3 N4 a& f
( V" s0 e$ i+ `9 ]# Y# S: g! x        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 A4 K9 S  F: ~; C& ?  z                addr = base + cnt;        /* pointer arith! */$ t2 b% m0 ~: }( [
                val = *addr;, h- M+ n8 u* O  D- f0 W
                *addr = save[--i];
% k0 k: D/ Z/ J' y6 G                if (val != ~cnt) {
. J5 A9 l9 `' s                        size = cnt * sizeof (long);0 B: {1 f) y4 A0 F% G6 g
                        /* Restore the original data before leaving the function.
! S) U& P: z1 o0 h& W                         */
" T3 `2 S7 t9 S0 R                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! u* E6 F+ P8 h                                addr  = base + cnt;
6 i: M0 f& O& n& G8 r1 I- h                                *addr = save[--i];; F& K3 E. h! T/ Q5 O- \1 G
                        }
1 _" q& G/ i7 T% ]- p" C' B5 \; z                        return (size);' P9 e4 J  f& M: f0 u- R5 X0 A! x
                }( g2 o  H7 D  A" R' W: K9 V" _
        }, j' N/ X$ W. T( c
: q& \( H% N5 K1 _. e
        return (maxsize);9 W, z1 @$ W& p/ v1 x3 |5 U$ Y- d  H
}1 I+ E* H! k$ g( a3 H
int dram_init(void)
' ?" _. V9 h- F6 B6 k0 {{
" `$ D3 v2 }; c7 m) r& ~- P        /* dram_init must store complete ramsize in gd->ram_size */
3 B+ \4 S" @! b, J        gd->ram_size = get_ram_size(
% ~' `2 t% J# U7 I/ F$ Y3 H' V                        (void *)CONFIG_SYS_SDRAM_BASE,
. p7 u, O6 b% Q- K8 d; }* s                        CONFIG_MAX_RAM_BANK_SIZE);
1 @- h3 l8 h0 C. q3 x* {7 C        return 0;
1 Y7 Y( N8 g* R! w8 q}+ j8 f( V% I( r" D

$ B+ d$ K! f- m* q7 X1 A  X
) g0 X# E2 }+ ~" s) L9 T  V4 d
2 v- K0 H7 ~* K, {4 h; L3 b3 [1 b: g4 U8 i6 {1 Z. z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
' X2 i5 o$ p; S0 l0 |7 h$ v8 O  g( @+ \9 {2 N. J, e
- ^& L3 o$ @& e6 c8 W3 y

( {  k& {' v  `. v- Q4 }




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