嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' A5 \' d  z' [& K
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( A: Z- r7 `$ L5 [+ p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& ^; [% u  x/ ~6 v; ~* Q9 }4 s
" q  W' T2 D. T
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! B& d9 I7 |# Q) w
; d7 Y6 b" |% k  L2 ?2 D/ T
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 ?5 E3 T# y: z3 e  t( I& U: q/*
$ R1 o* }- p( e! e/ z, _% q# P* Check memory range for valid RAM. A simple memory test determines6 U" u! F) M0 `% w# W4 h
* the actually available RAM size between addresses `base' and
! u4 }& e' I0 Y9 f* `base + maxsize'.
/ a6 K5 [3 U; N( u, z: ?9 l*/
0 W7 ]% J' g- s/ R. I) v( m; vlong get_ram_size(long *base, long maxsize)( @+ y+ q7 Q, E- L; z5 A
{
" j; \3 k  k5 Y  M        volatile long *addr;
9 Q( G; t. H. |9 y: T7 O. z        long           save[32];: r, B* M1 F/ r  z3 K
        long           cnt;
. _- P7 R8 M  G: z        long           val;5 t1 t8 V0 }) _: l
        long           size;; M5 K. A) {/ m: F2 B
        int            i = 0;
5 K+ Q9 P* k4 d9 |4 I2 e
' N9 E6 q7 r) T6 p. w* J3 @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ |: |- d: P+ T! x& l                addr = base + cnt;        /* pointer arith! */
, a- _; [' }3 p9 q                sync ();( t% Z0 [1 Q' J
                save[i++] = *addr;4 u8 _% A' H$ d5 E
                sync ();; T, ^, o9 b0 J( |; Z, t$ [
                *addr = ~cnt;
1 o4 p( }" d& Y        }8 q- I" e" \' x- Y% ^
1 X9 \1 y- w# g
        addr = base;0 A/ f2 z/ D% y% w3 e
        sync ();5 }. g& V2 |; n
        save = *addr;
1 {/ ], D. s4 F! A; h* A8 k        sync ();8 {1 l7 B3 j( h- v4 L# [
        *addr = 0;
6 j" S, _3 F. H0 k4 G, B+ o" ]6 u7 g0 f8 Y7 Q
        sync ();
  g! f: z+ K+ B+ `! Q5 a2 |        if ((val = *addr) != 0) {0 v( S6 d" [5 k& }- g3 ]% `
                /* Restore the original data before leaving the function.
# a& D2 C' T+ A( y! U                 */3 y! s/ G) Z/ `: A* {% L$ O
                sync ();
, \) S3 Q$ F. `  Y                *addr = save;0 G! w% S1 T- Y: T, K
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ F" o/ C  Z8 s% a' i4 q                        addr  = base + cnt;
! p3 k! U) {6 A% \  {. X                        sync ();
: m* G1 G# r. v4 _% b, Z9 y0 j                        *addr = save[--i];5 ?* U* _& h2 |/ p) v! [6 e- W
                }# @" s" _' D( _' l$ b+ M$ ?1 T( A. Q
                return (0);7 {: j3 d+ K; H* X6 u& R
        }0 B+ F! P" A& t
7 P) u% g& a, s8 S" ^
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 L6 R) `3 V, x6 M                addr = base + cnt;        /* pointer arith! */8 J% _9 Q4 e2 l
                val = *addr;
+ K! P! _: q1 a3 U  ^3 |+ V                *addr = save[--i];( G7 ]5 e) ~  @2 @" [2 x$ y
                if (val != ~cnt) {- a2 _6 n+ {# Q& p7 j, m
                        size = cnt * sizeof (long);. Y0 Z# D& Z3 D+ {- g/ q* q
                        /* Restore the original data before leaving the function.- r4 I; C3 ~3 |4 |0 l9 V7 A& J' e
                         */
* ^8 A/ L- M9 m* X                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* z* I  o/ i: T1 M6 ^' Z9 m                                addr  = base + cnt;
1 v% Q; w3 q* A/ T/ f9 b2 I                                *addr = save[--i];" x! K  v& z3 Y) L6 s- [. s4 {
                        }
8 O9 W- I) {: F" F( l( G9 J" ~                        return (size);
( h' I3 r. q( [8 K+ _6 f' E                }
1 ]5 l2 ]" h- z, H" l* b        }
% D: ~8 x" F7 ^7 `0 \: b( M. k6 i2 h4 P
        return (maxsize);
1 y2 i+ [% [# v, v}' V7 L3 _: }( H' L
int dram_init(void)+ I; V1 ?6 Q9 M
{
: W: }- }# F$ T% x( s, t        /* dram_init must store complete ramsize in gd->ram_size */$ g: j/ B+ g. J( }0 s
        gd->ram_size = get_ram_size(# \) f* B/ L( f3 T& W; d2 ?
                        (void *)CONFIG_SYS_SDRAM_BASE,; B9 M) {1 o" L5 f& ~! o* x3 _
                        CONFIG_MAX_RAM_BANK_SIZE);
1 p2 _; h9 a3 M$ s5 i& c& k& E        return 0;: o, S& G  p( i& w0 q( n
}: Z7 _0 u1 s; h2 `4 y
* i' [' M' |/ h- t  R$ v

6 ?0 }- N7 Z" n
$ e8 m6 X& ?' C$ I7 r! i
" K/ c% n1 f& L6 a; I- fFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!# j5 R! r1 h4 v: M

. E" a8 b0 w! @0 W1 g9 ~8 S( W& A4 P2 g& l. _
' I8 G! n+ s' Q8 D9 ^4 N5 c: M# T





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