嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit3 o, S1 V4 g; {9 E) X5 m8 E, C+ C1 a
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 j# C: ^# M! V& F+ I% E# y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 q2 f6 y# k* Z( R, \! m& b9 o' I' b) V
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 ]: e; O' l9 {0 X' ?& t% W* J; K$ f1 t) f. \8 y* Z. f

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 L* D5 `. a" r) f2 X. j8 a3 t
/*
3 l$ l! E5 R% Y2 s/ Y( |; ^* Check memory range for valid RAM. A simple memory test determines
" {, ]/ F: I* {* the actually available RAM size between addresses `base' and% i3 J3 o" k" l3 M! R: L0 A
* `base + maxsize'.) G$ Y) d8 z8 H$ }3 T& m
*/
5 o) v- o- X0 t* u4 Elong get_ram_size(long *base, long maxsize)
6 W! r+ H  r9 D2 b4 Z" m{7 l! `7 z4 m- w/ ]& Y, S% @' h
        volatile long *addr;2 ?# N# w/ }; {& }* Z; I' D7 E; E
        long           save[32];
& d7 r1 ^" P- v7 L  Z5 E6 p        long           cnt;
) B9 X1 u! L5 @# l        long           val;
2 Z; J7 Y  `/ a8 h. n        long           size;' O% H+ w/ B" g" f1 K. z* _
        int            i = 0;) @/ c! ]& g3 L8 V, L# Z
+ F  Q- [5 t* O
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 J3 a4 X( B9 \- `9 n; S( I                addr = base + cnt;        /* pointer arith! */
( h$ t7 m1 \# C- j                sync ();& R+ v* w( {5 w$ y3 n; H  N& N* U" J
                save[i++] = *addr;
* U* F# {# T/ P                sync ();
6 k8 E! ?/ ?3 D/ a/ G1 s- w                *addr = ~cnt;
1 C3 w. d3 M/ C) b        }" e4 `3 D( ^+ r, i( K# E8 H3 B
' L% m- P4 [' B1 h
        addr = base;" W5 L0 K6 p5 R8 T
        sync ();
% ^  s$ W8 m8 G' ]+ x/ \5 m0 E        save = *addr;
' [; W) b5 B# e7 k% ?% |        sync ();
! F- H: f4 Z+ S& r. _8 L        *addr = 0;
+ O! e7 F  q8 a0 q5 ]$ t! d$ N
2 d2 Y4 i, n0 a4 `% |" p0 @        sync ();/ \0 g: R# U2 \2 V
        if ((val = *addr) != 0) {
9 h) ~1 F1 I# |% R                /* Restore the original data before leaving the function.8 }, a# }% V5 r" N8 z
                 */
9 I+ p+ `5 \$ M! T5 l2 Y                sync ();
8 f3 G; u. I' x) C* n                *addr = save;
4 O% g$ Z7 E1 S% }0 D' c7 j                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ G( R+ t7 R7 K; a6 o+ R. M6 f                        addr  = base + cnt;
- |' q/ N7 B' c                        sync ();
2 I& g4 [7 R3 }- D% G/ b/ U6 X6 ~                        *addr = save[--i];: |5 r3 E& G% h0 z, U( N* f( r3 R
                }4 d7 \7 l' ]$ L' J7 B" {) T* L
                return (0);1 z* n& b0 U$ W8 A+ @* I1 A
        }1 u/ A# Z7 w# y# ]* p

, x  j0 \  ]% q7 H3 S- |9 d! L- J2 ]$ K% ?5 S        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {  d# e2 Q6 z' V1 D6 K" e, N$ i
                addr = base + cnt;        /* pointer arith! */
& t6 n: n) |- ?* ^                val = *addr;, ^* Q% ]5 s. z, i: m1 ^, q
                *addr = save[--i];' D! o# V) `: P9 q. M4 C9 O8 C* G
                if (val != ~cnt) {
8 }0 O+ t; c. a7 x. \; n                        size = cnt * sizeof (long);
5 h9 i$ [- G7 b6 q- g3 z% U2 b$ g# o                        /* Restore the original data before leaving the function.
/ _1 g; ]* a% l0 y2 Y& g8 d$ q                         */
# ?4 O( f3 X8 z8 g' z, g" J                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 x. ?& B1 f& m- \                                addr  = base + cnt;
. `! [! C% N. Y' U                                *addr = save[--i];, C9 _  n1 h0 o. \
                        }
" y& G7 K; Q: U) O                        return (size);8 c) X2 b* x6 q) w3 G
                }/ \, L9 f2 p- C) c  d' u
        }/ f; y& t+ V/ a

/ P# a) P4 v  D# ~0 Z: _! h        return (maxsize);
) V7 {9 H4 c. v3 r$ l( [}
; p% _, j5 W8 \+ B% mint dram_init(void)# z& R4 t! |; s9 O
{3 a, o& ]. U$ H7 @3 i) R4 ~# k
        /* dram_init must store complete ramsize in gd->ram_size */1 S. F: C& [  U7 d8 \1 U
        gd->ram_size = get_ram_size(8 `0 f; n% ~; {  w' {; v  ?
                        (void *)CONFIG_SYS_SDRAM_BASE,2 m3 e3 b# V6 i# q4 S
                        CONFIG_MAX_RAM_BANK_SIZE);
+ I$ `! o# v/ o        return 0;
0 ]" P* t& v* a# W}
3 y( Y/ {& d2 |+ g! \
/ F+ l6 _& q# U/ |& a6 p2 I8 C
! R9 v2 A2 [8 h0 y6 T" L
% _6 u( N5 Z4 T- `% U' t
0 H# k( h8 s+ o* V$ q5 TFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 e6 M& {, O1 j% `# L9 ]
! S1 }, _( G5 g
2 s1 M% g# b9 n+ j

# s! E0 f, m5 D- S




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