嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
% ?  J! }) ?" H2 @核心板2:DDR2 256M Byte   NAND FLASH 8G bit
4 @: Q7 f2 l3 J- K* Z这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?0 h' M, v. o" q, y
8 ^& ?. f+ ~3 D; w, n. ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 m. U8 [0 ?* j$ M/ C7 P: }
& _/ }( l2 n4 A( x! B0 }

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:8 O' B! {; M7 I! K& a5 b* _: U8 V
/*
' H' P1 a, M6 W* Check memory range for valid RAM. A simple memory test determines; V* j3 f( \" t& C- [
* the actually available RAM size between addresses `base' and
( u8 [! Y5 G% K" C) H  H* `base + maxsize'.; D$ \5 y! |- k: T* G
*/
, z. S" p0 t) Glong get_ram_size(long *base, long maxsize)
$ |' t  o% `$ U6 V# u% r{
% y' L. C) X; c+ |* `. D        volatile long *addr;
* R9 T  H9 p/ w6 x1 N+ E" Y* X        long           save[32];1 e0 l* E: B& i% c- x, j; t
        long           cnt;
% x+ v* P' m, ^        long           val;+ o7 p  T- ^- q6 M
        long           size;, ~2 y) f: i7 I$ v
        int            i = 0;, a- d  O3 }7 l9 H; l
& r3 K2 y* I& Y3 p. P+ A& k9 u. L
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 `! h6 J, ]+ \6 u3 [$ X
                addr = base + cnt;        /* pointer arith! */
6 W9 v+ n- O1 U2 N                sync ();
/ o7 q3 f- x) k  J" v% p6 G                save[i++] = *addr;
" q8 X# k; j" d. o  C3 Q  `3 i1 L                sync ();9 r6 L$ o% ?7 Q; k
                *addr = ~cnt;
- C5 J4 W3 v0 ~4 e        }; `) S  n! [- a- X7 ?

, x1 Y% d& v3 x! h7 M8 ?        addr = base;
- W; l- p* _. S$ r! s        sync ();
) T- O3 r! ~9 I5 |" t# N" y3 \        save = *addr;! Z. o  J% \% g# I3 T, }6 X
        sync ();
$ t. D$ D+ b/ q+ h0 }; q        *addr = 0;
+ e- V' o2 N" k; u" e! @  Y" ?2 `$ C. z% O
        sync ();
; F$ d8 L% \9 h0 K" j' h        if ((val = *addr) != 0) {
  h$ p( P# e' K/ z$ b                /* Restore the original data before leaving the function.0 h, a0 q( Y: |$ \, m* G
                 */$ z: ]5 `7 c- b: a/ b7 R
                sync ();
9 n# g+ j2 c* W                *addr = save;) u1 _3 I8 r9 c  ~1 q5 a. N
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ ]# V2 a7 \- v, ]
                        addr  = base + cnt;5 y7 W8 h) l1 `0 Y' [$ ^
                        sync ();' r- i0 h. s& U7 S$ b
                        *addr = save[--i];0 p. u( g+ Y* w8 u% u
                }
9 n* [/ W' `/ S' j& t$ i                return (0);' ?# l. d) f! d9 V
        }
* h7 G7 T+ g% N( W* T- z/ K- E" z; O' }
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ a# ?# X( ^1 E$ [7 u+ C3 _  s                addr = base + cnt;        /* pointer arith! */7 {  Y7 o" j0 @# @! {
                val = *addr;. k+ W; Q' M) \% `4 F$ X
                *addr = save[--i];
7 R4 f, v# F+ p* K/ T                if (val != ~cnt) {5 r. ?/ o3 c: N' m
                        size = cnt * sizeof (long);
  z' E$ F/ C' k$ f8 O9 r                        /* Restore the original data before leaving the function.- {! q$ k) T/ ]* h4 Q
                         */
0 N2 h1 _0 S: y; b                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 g$ F1 G$ W4 ^; B3 t( X                                addr  = base + cnt;
3 T" ^% d. a5 k4 H                                *addr = save[--i];
; c  R) m* Y0 c; m9 J                        }
% o0 ?0 Z& ?9 w" K/ }1 W' Q                        return (size);2 B  V& ~, u# j
                }
4 X( \/ R- Z! \, @) m        }
0 A- w  H: f4 s$ g
5 K: }) a4 z! K/ S! ]! q  ~        return (maxsize);
) h7 ?  M8 W% W0 O) X8 b}
: F/ d( @! v7 g+ Wint dram_init(void)
# v5 @! T8 A8 A: J+ c6 P! h{
. V9 i, S' m" c: O1 ^        /* dram_init must store complete ramsize in gd->ram_size */% x; o* `# R* s& O6 T7 _
        gd->ram_size = get_ram_size(
% o6 t9 \. j6 V, K. n                        (void *)CONFIG_SYS_SDRAM_BASE,
" Z! _( K$ f0 ]* w                        CONFIG_MAX_RAM_BANK_SIZE);& \, p4 }. k( S! D4 b
        return 0;
5 [% G, B5 j0 d4 `2 D}" h  h1 {2 b. W' ]* t7 t
) O8 o" M' \- P3 e
! x" u9 G9 ]+ P: Q
% _: ^: W5 N1 Q8 o$ B1 [9 Z- \
; e6 A4 [* {* \- Y; ?; a" w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 H9 r4 ^# _: v4 E2 A4 F
& ]7 @8 D% @  U( K" q2 c: ^3 n5 U, y* J1 Q

5 G( \) i* s" J




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