嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
! ]# e7 C6 R/ y) }核心板2:DDR2 256M Byte   NAND FLASH 8G bit( {# Y3 ~( d) b" m  R+ M
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- p" p$ r( T3 c+ |2 [" d" r  r
5 O  a1 @3 i7 D3 D7 d  ]3 {3 H是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) V% S+ q, O- X* p
* e; @% l6 x- _  w  H8 S9 {
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ u/ J7 O7 |! ]' O, B
/*
) h. ^  {/ |. A' k* K* Check memory range for valid RAM. A simple memory test determines
& L, v9 g5 `$ i3 O) E% q* the actually available RAM size between addresses `base' and; }7 o8 S( ~0 d8 A0 V$ b
* `base + maxsize'.5 ~$ ]2 f' V# W) v7 z" U3 Z( t
*/
, ~! b& v/ r+ jlong get_ram_size(long *base, long maxsize)
' e& d2 [5 a' [& K1 k' e{
0 r; L4 }8 E' A        volatile long *addr;
' s& n% \) \0 T; q        long           save[32];; u' I7 Y* @+ \6 s: L; T
        long           cnt;
: d8 W+ H  z. p- V  [        long           val;
0 ?  W  J/ Q! W- C2 K        long           size;
0 W. w$ S0 G/ `7 R* _0 {        int            i = 0;6 c8 @" T* T- P$ C* i& {6 L6 z, k; R
( O0 O& H/ u4 r; a  \7 X
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! U9 o) J5 O- q* P6 W& u" p                addr = base + cnt;        /* pointer arith! */
$ J& I: a0 ^3 I  Q+ [% P                sync ();
6 y- M. w+ M7 V* m1 ?                save[i++] = *addr;* k* Y6 e* {# F$ z. r$ T
                sync ();- e. B* O* D0 y  O
                *addr = ~cnt;
- k6 k$ v) s& \, G: h$ \        }# S" W; i6 `7 c1 {

! ~( U0 n+ G7 J  P        addr = base;. I# r2 n8 V/ S$ P( F: @
        sync ();6 W7 [1 n1 R& N2 _5 q$ P) x5 Y' n
        save = *addr;
% r3 u% |1 M: D& V1 h( w6 x        sync ();( ], |& c" v) i' ^( D: |
        *addr = 0;
2 t  w. i7 g( D! Q3 M+ K- p! a: E7 p: h* V4 z  r
        sync ();! {" N, B4 r4 \% D
        if ((val = *addr) != 0) {9 F4 w5 @6 a* l2 t$ ^# z
                /* Restore the original data before leaving the function.
7 M2 }6 O. l( E' F+ ~$ n9 N& W9 O                 */$ ?* a5 z  I5 k
                sync ();% l! {! |4 _  U/ b/ a" W+ G
                *addr = save;2 ^6 O! ~8 R* n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' O  R. V+ K/ b                        addr  = base + cnt;* }: ?3 r; d, a# I: M
                        sync ();
1 f5 O/ g" X2 H6 \8 _                        *addr = save[--i];' U+ s1 L) a( k. G7 X; ^/ h) `% l" F3 ?
                }
) l3 {" v$ A; q5 B                return (0);
* f7 a6 N* U  T2 j+ L        }4 K1 E" ?0 c/ B! ~& p+ I0 b
; f3 K3 |, I$ z' {0 |- s
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' k6 J' n3 D6 q, l                addr = base + cnt;        /* pointer arith! */
# F" `% e( f# H& b                val = *addr;+ O( w. v+ X3 ~4 }5 C; j
                *addr = save[--i];
4 g9 x4 a4 n; J5 [- ~; t1 m& [                if (val != ~cnt) {' o: E7 [$ X7 U4 }& B% K& a2 {
                        size = cnt * sizeof (long);! k, i. n) o; o1 t; k  c
                        /* Restore the original data before leaving the function.
* V( f" p: U  Y' f4 \8 I  d: |; t. g                         *// ~1 ~. Q* L2 @2 r  d
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 H( b1 w$ ?2 x
                                addr  = base + cnt;
0 V6 d: ^+ z! i3 s  U+ Z! [) q                                *addr = save[--i];
) [8 y! |; e+ l                        }4 F; U6 m+ e" m4 }
                        return (size);( |4 O0 N" ~, r9 X
                }- Y( G/ F  a( a, e( h* e2 P3 n
        }
2 s2 z! K& W( H* r- K9 _; _
. t2 H: ?% i0 }2 c        return (maxsize);' M. S1 R+ o3 P. E
}7 p6 v3 j. n, y9 H5 v/ E# U8 f9 w
int dram_init(void)) @: s6 s% F" Y% [, n
{4 v$ Z6 g8 y7 N: A7 _
        /* dram_init must store complete ramsize in gd->ram_size */; z$ l  D* g6 L
        gd->ram_size = get_ram_size() H% A* X) ~: o+ S2 Y
                        (void *)CONFIG_SYS_SDRAM_BASE,  h8 x- F* {" l! O! F5 B" e6 S
                        CONFIG_MAX_RAM_BANK_SIZE);
( ~" q4 Q# @5 d5 n) q        return 0;' w* M1 g) p# ^1 t( O" _
}
0 k$ e  L( d4 x: t5 I% \- t
9 f, ]8 y( B' @- A* y! o8 g5 O# z& r
* h% d+ a+ }' }1 }) y$ v1 P9 j% T/ @8 q
8 L- U% k9 U9 h* |2 ^- `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, i% U: K+ u* c' o
# b. y) V, \, W

% T5 C( _& _# U
/ [2 R+ ^0 P* P8 e4 L' S





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