嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
: h% ]: Y9 R! e# b" S" G核心板2:DDR2 256M Byte   NAND FLASH 8G bit
# U9 v1 n0 h$ J% D8 m这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?) `  C6 R) h. h

- I3 g$ I8 w4 ?: K是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) x  g; k! N; l/ g& W( w/ O1 H

7 j, N$ w( F4 q; O. c
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- ~  |4 I0 c1 _% o3 C$ B/*$ S( l: g" E2 c
* Check memory range for valid RAM. A simple memory test determines. O0 t' d" [+ c* s5 c
* the actually available RAM size between addresses `base' and
+ `( f; Y  x6 f/ j6 @& @* `base + maxsize'.5 ^# r1 P2 Y3 a! S- s% H
*/& d4 ~  T- A' u0 |
long get_ram_size(long *base, long maxsize)% Q- c5 ~8 [) g8 `5 n' z! l2 R
{
& i' `; V7 s2 x# Q# G        volatile long *addr;
' [) e9 B" q; _1 m        long           save[32];: K+ C3 Z8 x( ^7 e; \
        long           cnt;/ e* P5 X0 n  r1 u. O* w0 ^" W
        long           val;
* N, @7 E) s$ f& ]3 Q3 z9 }( w  c        long           size;' y  u& u" m! t
        int            i = 0;( I" t6 Q8 b7 O
1 E9 f, p4 M/ [$ X2 l, ?
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ Z+ y( ]" |6 ]6 o9 ?& s                addr = base + cnt;        /* pointer arith! */
6 [8 y" ]% n- e                sync ();* l9 `' o4 P$ t' p; ~3 M' a" P% Y
                save[i++] = *addr;. U1 Y$ q6 W" ?- D) g8 s# U
                sync ();* t* Q" }! _1 H4 x7 V# w) F; k
                *addr = ~cnt;) \) ^5 J% P  ]3 K
        }# o' t7 f* h0 e7 i* h! ~
3 ^* V$ j. c- w! O
        addr = base;
. _- X  o6 z6 Z5 G- q        sync ();
9 q: a  Z$ U+ j) u3 |        save = *addr;' Y% h" ^' H; S! h: m$ I
        sync ();0 I; j5 {* V- H% m/ z( e+ s; i/ }  m
        *addr = 0;4 h5 a) r  j/ i! ]! m

) ]1 [* g: e0 Y- h  L9 c" @& L        sync ();
! O& V  e5 `  @* b' c( L        if ((val = *addr) != 0) {
( D% l+ O2 q5 l1 M( ^# _1 a                /* Restore the original data before leaving the function.$ ~" p, p- E. f" O1 h& D2 D
                 */5 j$ i. H: z' t3 t) H, B! [
                sync ();" Y. r7 l( {. E! v' p7 V
                *addr = save;
% K8 {3 u9 c4 A% c' m. ^                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 O! _' f5 \: S$ J' {# M0 ~% z                        addr  = base + cnt;
. G) p" O/ X) F% F" s# ?                        sync ();) J1 W4 O& V0 ~. B1 P
                        *addr = save[--i];
0 j9 [; J1 y# Z, @( p) h" A                }1 ]; r3 H3 k3 V( ~8 B0 ]( I/ z
                return (0);- v% I1 B8 N9 X% ^9 v" C3 \
        }# q% i/ W: K( F

6 [8 \9 G3 [( c6 B- X8 x        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' P, ~6 K+ Q, T7 W0 Q* c7 I6 e                addr = base + cnt;        /* pointer arith! */
8 _" [7 X# @! c                val = *addr;  l5 T% ~4 L  T
                *addr = save[--i];
  p% s' _' E/ o5 x' H8 i/ \                if (val != ~cnt) {# A$ d" X8 e' T- N# \
                        size = cnt * sizeof (long);8 y" J4 [* Y9 Q8 _7 ~& ?
                        /* Restore the original data before leaving the function.
+ B/ o3 o' d  O1 d+ v) V! e; A                         */1 A9 x6 J# m# P4 w" y1 f
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" r- K& E+ d4 [7 G& f' j3 d9 }
                                addr  = base + cnt;
6 \$ i% j$ O1 x1 p3 }' y) j( B                                *addr = save[--i];
% x2 Z6 ]9 U4 l4 p+ ~! J' J                        }" z$ N8 B( w8 y. U
                        return (size);4 |9 |- _' _. D% ~8 G. q8 w" T$ h% f
                }/ P% v0 q9 j8 [! Y. ?3 I
        }! @! O3 A( K$ Q) U  S2 B& ^! L

0 e" V2 E( D, ?; J6 k+ R        return (maxsize);( ^/ `  x' A, j
}' f$ ^- m" w9 l+ b) A" m% c8 ~
int dram_init(void)
* c* T" s# v1 `1 B{
6 \9 e) w8 L2 T4 O) `        /* dram_init must store complete ramsize in gd->ram_size */
0 f9 }+ D0 T! e2 n( b' {, \        gd->ram_size = get_ram_size(" }6 I/ B& y, G/ S+ Z/ }$ R
                        (void *)CONFIG_SYS_SDRAM_BASE,
* k1 B5 ]) |1 }* u                        CONFIG_MAX_RAM_BANK_SIZE);
# g) P4 j6 h- C' r        return 0;! E+ _  R6 s( X: O* B+ w2 W
}
" C' ?- I* t8 M! c( _) |
* B" X0 ]; r8 Z4 |! h. [8 @0 ?& \+ X2 r* S7 T

7 t1 @0 P; R4 a& B/ U5 U9 o" o  j& h5 Z: p5 {6 ^
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 H" b; {. P0 L6 d3 L
( n9 O, t- f  s6 h
5 ^4 E( r4 U' D
! ?# d+ w0 P7 L





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