嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: a, y2 ~' N$ m$ h* }) N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: \, O3 [1 d* O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?5 w' D5 F8 A0 z5 D) @3 [5 [

5 e  f% d1 e$ y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ b0 r; w0 a1 a& v/ L
; |" c* @. s& Q& D3 X: q  ^
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:2 B( G" D; D; Q8 }
/*3 R- e; H! x+ H9 J# }
* Check memory range for valid RAM. A simple memory test determines
/ L! T# v6 L$ B8 G" f* the actually available RAM size between addresses `base' and, e3 T- B# ?; W4 [; f2 x* m
* `base + maxsize'.
7 Z9 Z4 B# N% B" f  w. z*/
0 d$ F8 }1 \7 p3 d& O# dlong get_ram_size(long *base, long maxsize)2 p) S$ ]  M  L3 E: f
{' C# Q+ }! Y7 r6 ?4 P
        volatile long *addr;5 ]7 Y# `+ q7 i2 b
        long           save[32];
' v( Y* C( I- [6 m2 V0 x3 ^        long           cnt;6 m% x0 P/ e8 Y* `, p/ l) X9 O
        long           val;& `' h/ L+ O& N
        long           size;1 o6 v+ I1 ]6 t1 O, |, g
        int            i = 0;( X/ s% a) f# w" R6 e4 J7 F

% G& \  G1 V/ i        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 |2 d% v5 P, s6 a1 ~
                addr = base + cnt;        /* pointer arith! */8 U0 Y$ `2 O* m* u; F5 P. a
                sync ();
# p  {2 I; A# s1 R                save[i++] = *addr;
  y1 L/ F# Z" X$ o3 j! b1 A4 V( c                sync ();& l$ U7 b8 e& t) {' \7 v
                *addr = ~cnt;
# y& `( Q* q" g4 t3 l5 a        }" r* Q3 E( j  Q# _2 f. A$ I+ l- K

$ J0 A" O" a$ X, D5 E+ k4 a6 I% x        addr = base;6 U5 k3 Y, b( `
        sync ();, Q+ r, g* k; k
        save = *addr;
; ?, b7 n( ?3 _- o" l( x        sync ();& E: q) ^7 ~. j
        *addr = 0;9 J7 ^+ @9 D5 T
3 k  {1 H: M3 T! G% @! M- o
        sync ();
0 K, t1 ~0 `  S  i2 b: X        if ((val = *addr) != 0) {) b) @8 D9 h- l# L2 p
                /* Restore the original data before leaving the function.
2 r+ [* [9 ~) ^* {                 */6 q- n7 x$ q! |- R/ j5 m% ~8 |- v
                sync ();
! w7 A  X& t& R                *addr = save;
& v4 C% k+ _) N8 z4 v' F                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 w3 J- A0 T1 g+ ^! h: l# l                        addr  = base + cnt;. t) V5 u5 j! J& W1 d
                        sync ();
: U; y7 Z5 x* p# ]                        *addr = save[--i];. v* `$ m1 {  S( x  k! H
                }
# g2 c! K4 n7 b                return (0);
+ G6 |! D3 o2 B9 F+ }        }: u. @/ _8 A; b5 ?1 C4 @& u8 Y. W

7 \, H' M; Z. w: W3 K8 _        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" t& W# T; ~" J* G* }
                addr = base + cnt;        /* pointer arith! */
3 _" r2 A" P4 O# E$ {' W3 B                val = *addr;6 ]% R. U9 P& q5 `" {' A' M
                *addr = save[--i];
; m) w: N! K2 q' m, z5 x! ^! g                if (val != ~cnt) {
( h. R- a3 Y  a3 y6 W9 l. w                        size = cnt * sizeof (long);
* O6 R' m$ \) C9 t8 y                        /* Restore the original data before leaving the function.
6 o0 q2 a3 r; ^0 S1 ~$ `                         */
  i' ]1 w9 m: R3 e                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ]3 @" y' a7 K2 w* T) k1 P$ f                                addr  = base + cnt;
8 P7 ^: m- ?% a$ L                                *addr = save[--i];* _+ M# F) |& y) x, j  `
                        }
) K3 {2 L/ e0 u& Q( X7 m                        return (size);. G) {0 q* g. z6 q; U# G* E
                }) N) X; S+ g# Y! z9 I- y' X+ O
        }+ b# T* P% g5 L  r% n% _
+ L5 F+ x/ {' h" `: X6 Q( S4 h
        return (maxsize);- W! Z, e: Y5 w4 i% ?* ?0 u6 H
}& {* h8 d1 Z: E7 j1 X
int dram_init(void)% f6 I) I0 Q- f- V
{
# ~* a% z: Y( H/ V3 S; W; _& ^6 i        /* dram_init must store complete ramsize in gd->ram_size */
# F- P/ c0 p$ V$ E        gd->ram_size = get_ram_size(
' ~: i, d) D( E) K% v! h+ I                        (void *)CONFIG_SYS_SDRAM_BASE," q: B2 o3 \+ `2 z, }2 }
                        CONFIG_MAX_RAM_BANK_SIZE);
# _, r7 N$ n" m8 W: C  ]6 A        return 0;4 @- L$ t; A, S- z$ A# ]
}4 ?2 L6 G/ A+ G6 a
) `/ @! j/ N0 _4 R( @7 V
3 m% s  k  v+ e- a+ F

: w5 S( w7 i/ u' k% \8 \# Q% ?
% g) f8 c; k4 P5 VFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!" [. ?9 M- b- Y" I6 M: }: K. B
+ `* q' z4 f0 H* O2 x2 N

7 h# e6 T  N$ O) w

! h( V* d2 `+ J( q+ c' C5 Z




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