嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 K2 t) i3 H/ @( A5 i6 R4 z9 t核心板2:DDR2 256M Byte   NAND FLASH 8G bit
- N! l' C/ |9 O+ i4 Y; J0 H这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?: a, j2 X3 x8 [8 Q0 `2 D0 E

5 p: p- }* l/ t$ f是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 U* C8 r  _" O: \0 M' r# K% i3 @1 L
# @5 d0 L. \1 d/ S7 o# S1 ]! r

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* I( T2 }! K& p! }% F5 W. m
/*
1 q  {& {7 ?  z1 O* z* Check memory range for valid RAM. A simple memory test determines
0 w5 l0 s* q, v& Q! x# V* the actually available RAM size between addresses `base' and
- t9 Z4 l6 _9 Z- x' \! \; N* `base + maxsize'.  M3 d$ `5 N( o/ @% G2 n
*/, T: u0 M) u6 P8 j$ X& f# m
long get_ram_size(long *base, long maxsize)
, t0 l4 ^* Z1 p: _0 }+ O  C{
7 i7 a' A& Z5 K+ D        volatile long *addr;& Q& B, d! w/ {/ X1 j) N
        long           save[32];
( P1 S: q4 ]- \) @3 B        long           cnt;2 Z; R* U5 U2 B+ X& `
        long           val;
* j# j  a( ^  O9 T; T( P        long           size;1 M0 |* M3 M) b* [; u. d" [
        int            i = 0;
7 V, m$ c; }/ Y. b9 O) c" ^5 H; [6 @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' w1 P# o! \, _8 T                addr = base + cnt;        /* pointer arith! */, i2 o# ^6 V  s5 d5 V+ h4 [
                sync ();# N* g6 U8 B' g; G3 R7 T
                save[i++] = *addr;7 c3 A, l2 v' ~& [: R
                sync ();4 d! x2 o" w: o8 O
                *addr = ~cnt;8 W! I, ~, h0 Q: j( p- p
        }
' E9 g3 `3 O% r9 n$ l% ^4 F# t) Z# n- g% C
        addr = base;
* t) b' D( [3 {* [. q- `7 x        sync ();3 k% m( X$ ~# M3 I: `: w
        save = *addr;) h) s& [9 G; V7 _% s
        sync ();& x: U% x2 F; M
        *addr = 0;
) F1 d0 \% c  X3 X% d, Q3 O, x, ~$ s# v3 r5 `; E
        sync ();6 w% B( Z% W' P% x5 V; p, Q7 h
        if ((val = *addr) != 0) {7 x/ D, x7 L3 v) |1 P7 ]$ ?
                /* Restore the original data before leaving the function.8 K) [/ _) {* u; @5 h5 T& I, G
                 */  G4 z' E6 S" f5 _
                sync ();
8 M+ B! [% b! q                *addr = save;
: Y' F9 s8 w. e6 c( E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {6 ~5 ]5 \* ^% o$ l9 M+ X
                        addr  = base + cnt;7 I9 \8 a2 m+ j8 d" @' K" l# Z
                        sync ();
* C2 W3 ?- R! n$ u* Q2 w                        *addr = save[--i];
- N! g5 F5 W$ a7 {# W/ {                }
% R% {' Q! c( c/ h+ b5 I2 w                return (0);
$ j, G5 N3 M1 h% z# H        }
* J4 G7 k* h; P, y
3 K: K: W: @3 j$ o! i        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; P- {: j3 R4 o: {                addr = base + cnt;        /* pointer arith! */& f3 z3 L5 A: i; w6 \& q9 d3 r3 Q. J
                val = *addr;7 r& ?" B- I5 D; S! y
                *addr = save[--i];% G  [  o7 Y5 u4 U, }! N% E
                if (val != ~cnt) {
; A; ?' U) q9 A5 E- e) {9 u: L" C                        size = cnt * sizeof (long);! r$ F" N& y% M
                        /* Restore the original data before leaving the function.6 L/ v. Y7 f3 f5 z8 b; }; W- V. K
                         */
; N: w% [0 |+ Q/ K% E& V1 ~, Z                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 T7 L% k! C. w$ L8 y                                addr  = base + cnt;
1 s* \4 d3 J0 T. ]9 q* f' }1 Y" Z, x( R                                *addr = save[--i];
1 c; G' _7 D3 ^% [& c% J& p3 @4 K                        }
! j- d- }2 k4 N" [) H. x) |                        return (size);. Z9 P5 s; I. ?' _4 P5 V' t9 ~3 G1 l* B
                }
, k+ \2 L! l" e3 ~$ S$ N! U. w        }
# A4 c& n  V4 g5 @/ ~: O
4 R  h- g* k! w7 n# E" i" y        return (maxsize);" R. V  l" ~: Z/ [! A0 T
}
& v8 q8 B- Z3 V4 \0 dint dram_init(void)# A! j. x0 R# a
{2 n6 I& A. D2 _, i* D
        /* dram_init must store complete ramsize in gd->ram_size */+ [9 h& p( A% y" N7 K2 k
        gd->ram_size = get_ram_size(' D" Z$ E+ O1 z8 D, P4 {# G
                        (void *)CONFIG_SYS_SDRAM_BASE,
: Y0 O+ e& V. s                        CONFIG_MAX_RAM_BANK_SIZE);- ~% w) m% c) R- N9 F0 m2 _
        return 0;
  I& w$ ]& [! K7 R7 g/ \" h6 o# x# @}! k9 a5 J2 U! [
* r' _5 X2 E0 l- L1 u! \' k5 y
, `9 t- c: @1 G. B
% S& T2 E6 c5 O8 w7 p/ e
! |4 l" t( P8 U5 J
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ [( q! ?; `  [( c5 e1 b
  g* e$ z4 G  D/ T/ v' Q6 m* c& e# x) I. R; c4 p% v6 i" |) ?8 ^
" N8 }. [6 k3 E' E





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