嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ w6 ?3 c. P! a6 a/ @6 t核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 O( f- }8 n+ X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 y# D' T# b. }9 [
( V( z' |: l! s8 g" J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ R" O. x/ _) I  s! _* l
5 q8 j& p: @) J, C

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:! f8 d  r& y9 U( W/ L
/*
' D5 j3 z7 y  l5 S" M8 y* Check memory range for valid RAM. A simple memory test determines8 ~) A/ j- K. N, i: {
* the actually available RAM size between addresses `base' and
; o& c, b) X2 S6 Y& Z5 f# |" R* `base + maxsize'.# V) M  y+ S$ }* [& \+ |
*/
) Y8 B6 M1 [0 p; `long get_ram_size(long *base, long maxsize)
9 A# i2 q* E* C+ Z* N{
$ ^% [8 |7 ?4 Q4 D0 C2 V        volatile long *addr;
* |! u& G1 o$ X+ c        long           save[32];
' r' {; M) o% x( R% W/ j        long           cnt;
7 d. l1 k1 f" s- D6 T2 g        long           val;2 ?3 n) }4 S7 t. q6 p# l! [
        long           size;
  G" h, h1 I  Q$ ?! @- Z- J7 W        int            i = 0;7 q" t( [4 g( f6 ]1 @. C
& K5 R; ]5 _& P& F" }0 G1 `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ o% v9 O# `' t+ |; W- N
                addr = base + cnt;        /* pointer arith! */2 s1 Z$ I& M) k0 w! {1 P
                sync ();$ o- T9 {7 z0 S: R/ M
                save[i++] = *addr;
2 d/ g9 m; U( T                sync ();) y- K0 e. q+ `6 w2 G; r
                *addr = ~cnt;3 f8 ]+ }% I+ Y7 {- \
        }
! ~* H# o0 x9 f$ t# R
! c2 u9 q$ y* B7 F+ K$ c- |" i        addr = base;
, W' x3 W# V8 Z  |0 P. {* L% J        sync ();. M3 W6 g# g3 w5 `  V4 K5 M% v6 x/ y4 G
        save = *addr;
4 ^9 Z# G2 m& `8 }        sync ();
& V0 B% `7 D+ v/ ]: F" s4 i        *addr = 0;3 Q1 N/ L& v. M8 t
/ E7 a2 k" m# \1 {: ?% s
        sync ();/ ?: A; w  J: H" x/ ?' E
        if ((val = *addr) != 0) {
# l1 F" C- ~( [                /* Restore the original data before leaving the function.; x0 \; L% W' V! h* {0 J+ l
                 */" _. q- i  `& {
                sync ();- h* c5 _1 F+ Y
                *addr = save;
) t+ ?  z: G$ }5 P                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
" |. ?: ?6 u! B/ q6 X4 i                        addr  = base + cnt;
( m* S  P) }1 j                        sync ();
" \2 _; H# L8 u: N* m' E2 a                        *addr = save[--i];$ ~/ l9 u5 u' H1 x
                }: d! G' J. N" S; k/ |' ~: t9 q* p
                return (0);: g$ }# @1 Q7 O* N' V
        }  u5 d/ ?/ }3 ]' D7 s

" q/ }6 U" e, D' g6 m7 B6 c, `0 k        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& I8 U4 y+ Z* q. z8 x0 x                addr = base + cnt;        /* pointer arith! */
/ W" U6 A6 @4 {; t, b2 \" F                val = *addr;; r$ I" z9 s3 k7 x6 X
                *addr = save[--i];6 F# w- |2 F: o. ~1 F
                if (val != ~cnt) {
$ R4 q  _# ^6 H: O6 @                        size = cnt * sizeof (long);6 u' a0 U5 o8 c3 X4 x
                        /* Restore the original data before leaving the function.+ a$ S: S$ N' ^. q4 W" ?; N2 d% k0 S
                         */" T# h) L- R6 w0 c4 }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) w0 G4 v4 h! p                                addr  = base + cnt;
7 i: j6 G" L/ o                                *addr = save[--i];
  s  M  U- ]" |) K% Z! v' A                        }
& j3 c; u' N6 D+ m& w                        return (size);
- J$ C; F: x9 A, J5 p- J                }( n/ Y, a- t, |) L8 z$ \+ v! ]
        }- d9 Q* C8 n1 L3 T

  l4 e- P  r4 @6 b" u9 q: \: s        return (maxsize);
: n" t& f1 P+ q: G$ L}0 V. ]  B' ~% `7 U/ w9 Z
int dram_init(void)2 T9 s" t! W) ]! W% R
{* y7 X( [8 @' U. [
        /* dram_init must store complete ramsize in gd->ram_size */
& F1 x: K4 g- f6 z8 G8 k        gd->ram_size = get_ram_size(
: ^% C! j" v6 c* P( K% `" Y, T                        (void *)CONFIG_SYS_SDRAM_BASE,) Q3 d% d% a9 r+ K
                        CONFIG_MAX_RAM_BANK_SIZE);
1 \4 s  b. e6 T7 }# \( h        return 0;
$ s- C) [* k2 T3 F, u5 u$ a}6 B4 {+ {( X) Y8 A' p0 U( I: A

4 r/ j3 k" c1 K* _) R4 Q4 T' U
" N8 U& e" [, Q6 j" W, ^
: c- ?/ e* H2 u9 S6 x2 Q7 ]; o1 M$ X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( _8 X$ a$ L, k( Z$ J
; H- M$ q: X$ I6 @& O$ C2 q. Q" Q7 j; [1 N3 p2 ^% h7 d0 C1 ]7 }5 [2 Q

1 S+ z7 x9 X' E3 r- a4 c




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