嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
- h! E" h& W0 ^/ s+ b5 r0 n3 A/ t6 r# g核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' U: [/ J# q& M) U) j! A' v这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 Q7 V; d1 B7 N" ?3 W$ w% l0 L1 u. d6 _1 t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" f4 x. i+ O8 K+ N
3 K( j+ d! z0 J) z. ]  B, V
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 G3 C0 W: w4 P6 p, K/*, ?) l6 e1 h# l* B
* Check memory range for valid RAM. A simple memory test determines& M6 G0 ?+ J6 v
* the actually available RAM size between addresses `base' and2 h: c. @6 k6 u) W' H' f5 T9 p3 v
* `base + maxsize'.
, H4 |% ]2 T, P4 M2 r*/
8 Y' d" P, O# _) j4 glong get_ram_size(long *base, long maxsize)" I/ ?/ G/ |% c/ K4 G* s# B8 ~* |
{
( G8 w% X  K7 Y  m        volatile long *addr;! n4 s; z- T1 Z# J( P) e6 j( O0 g
        long           save[32];- l. E! e* ^+ l% o1 b$ J
        long           cnt;, \2 ]2 ^& d* q  n; z; n! }/ a
        long           val;
3 H  L! w+ m& g. F7 [$ S. C        long           size;3 n8 f& n0 V4 q- n' m) J1 P
        int            i = 0;
6 x4 M: O- Y/ w4 n/ b9 R3 T) x& W- ^9 ^( j  y- r  C
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 D6 u5 L% O* q" x* `                addr = base + cnt;        /* pointer arith! */
* Q0 K' p+ }! m7 E, R' v* J( Z                sync ();
" x$ G( h0 d* n# I# m                save[i++] = *addr;; U# M( C% e8 `. U$ `, i
                sync ();
1 h# X) `, ]/ p  G' i                *addr = ~cnt;" n1 c" ~0 N7 U
        }; G! m7 R, B% F* k  V* D) Q0 f

: z$ Z, H6 x2 e. [! g6 L5 Z- a8 h        addr = base;
( a7 @$ g8 ?2 f7 A# g        sync ();
5 I4 ]+ \$ o1 k8 |0 w        save = *addr;
5 D: G6 h: ^6 t* D        sync ();3 g4 P- _, k# I# F
        *addr = 0;' b& C- F- ?: ~- s7 z3 s
# ]7 P" v; L1 J, b. N
        sync ();: _3 A  P3 b9 ?) u+ T5 N
        if ((val = *addr) != 0) {% E, c4 g( g' W  ^1 L! [& M- L
                /* Restore the original data before leaving the function.
$ f& ~' d/ `& _- ]6 z- Z, W2 F                 */" X9 K% c! g# e( A& @: G! ~5 J
                sync ();
# i5 ~7 E% R1 a: `- ~5 X0 q5 ]                *addr = save;
: I% R- w: ?6 p' s% L% x7 J! h- M                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ v+ K  t& m% j, l8 l                        addr  = base + cnt;
4 ?0 u. Y! N' ~7 H                        sync ();
, d+ m9 F4 F, U5 |' g                        *addr = save[--i];
5 [) |) C  X- _* Q: n                }" T% J6 `/ f. l
                return (0);
4 S# ~* {) ~- k7 y        }$ d. |: f( w  E' D$ K. q

0 F' [" J1 L3 ^$ F( z        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 G7 z( X0 j; c  \                addr = base + cnt;        /* pointer arith! */
8 R: e5 {2 z8 S, S- L/ k                val = *addr;0 a8 j9 N  r" a7 k, l
                *addr = save[--i];
3 z3 _, z( V, g6 T                if (val != ~cnt) {6 {8 T4 L0 `$ a' v$ j
                        size = cnt * sizeof (long);
; |% P+ M3 G$ Z: o1 u( E5 [                        /* Restore the original data before leaving the function.
% ]2 S) u$ o9 H6 |                         */
& _" J+ v1 L. @" \' ?/ c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: I+ ~7 U# d- n5 L( Q5 ?                                addr  = base + cnt;
5 e! y4 D$ ~' G; R                                *addr = save[--i];
8 X! z2 j8 k) T  t2 G                        }
8 |) T$ S5 E' x! b7 a% Y! _                        return (size);7 a% P. K4 R5 K- V
                }
5 G; f# v$ Q/ P' Q8 p        }3 j" J" ^( @+ L3 A0 n9 @

" C  z" t+ t5 [& b5 Z        return (maxsize);
; L* c$ ]3 K' `- O: V}
$ f, _" E2 O! {3 a2 h7 zint dram_init(void)8 l7 j# `+ d7 ^2 X: Z! Q
{
7 }2 Z$ O# Y. Q        /* dram_init must store complete ramsize in gd->ram_size */( a: r. Y/ l  G% A
        gd->ram_size = get_ram_size(5 s( B& I( F! U. N. U4 A0 u' q
                        (void *)CONFIG_SYS_SDRAM_BASE,5 I, j, K/ c' v( [; \. Q2 c$ k
                        CONFIG_MAX_RAM_BANK_SIZE);* f* P! v+ I) }
        return 0;
. [3 |4 A' r" a}" \7 J3 R7 z. R4 b/ s
% A' M  \) w3 q2 h( g
6 {$ J* @; C. H& v8 [0 _) b7 e

7 F& z% [# F' V  v! ~8 P# @7 q2 G  E: Y( Y) z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& f$ K4 W6 i9 j3 _

! G4 T& p- n, u) P* E+ F: j+ B! g$ f+ f' K2 w
% q* C3 D; e; Q2 E





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