嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' A1 }* Q" U. y核心板2:DDR2 256M Byte   NAND FLASH 8G bit
8 s; F+ k" \- E' g这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?# N2 d, s* W) H
. O: @4 |6 r4 j: q
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 p, ^' E) ^$ r, y, z' \  h  r8 }, ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 k" F& H8 ~- _, l* n/*
9 g' L* o+ ^$ S. U' X- c3 @* Check memory range for valid RAM. A simple memory test determines( c0 t6 Q' y! @! E+ R; ~$ Q2 D
* the actually available RAM size between addresses `base' and8 j  V- m. ]5 u- C8 Q: z9 |; z0 E& O
* `base + maxsize'.  S% k, k0 y1 ?! H, }
*/( w/ N8 \3 {4 L4 H/ x
long get_ram_size(long *base, long maxsize)
" R5 s& d2 T* T( E) W{' y9 ~, O% }, k& O9 @( ^
        volatile long *addr;$ O- F) v% _0 T# }4 ^2 ^
        long           save[32];
8 o: L+ X' K: C+ Z        long           cnt;6 {: ?" D* W; o, m
        long           val;
% M- G9 S3 E& Z! H- |% {        long           size;  j+ Q6 Z1 r: d3 v+ j0 C
        int            i = 0;7 [" c) j: `: Q8 k' b' S

4 w) h7 n/ Q9 [6 f, D- s' ~        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {( ~% D: R" L" \& U/ _3 ]4 z
                addr = base + cnt;        /* pointer arith! */+ E5 u. t( g! q
                sync ();1 ]& @, [" m2 V" H' u7 ]& h0 f1 \
                save[i++] = *addr;  n2 E. g6 {2 b: T3 u
                sync ();+ n4 q% O  @! n8 C2 k0 i
                *addr = ~cnt;
) f4 N& n, G  H* F        }/ r) A( Z; m- }& c
, w, p; B; r# S1 {2 B% J: x) U
        addr = base;% B0 w6 s9 j  h) K  ~: B9 ~1 K' U
        sync ();- y3 ~" ?& O- `, O
        save = *addr;
9 [& I$ W7 i: q; }        sync ();
& Z, @! {. j& v9 n" x- }" }3 Y8 |        *addr = 0;
/ E$ D8 o1 t: p' y) U& {# @8 q& N' X" U, a* n; {' S/ e
        sync ();$ ]9 e# n! V) I5 Q( v3 P# a
        if ((val = *addr) != 0) {' G& v/ O3 o7 o
                /* Restore the original data before leaving the function.
) p/ `. Z4 W' t! N+ {1 q$ p                 */
5 r" F* D2 l1 I1 ?/ G                sync ();, U& o7 I; B; F7 V# n& j
                *addr = save;" p7 o% ?5 \% c" g
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 \0 u- i% T( ?# K/ O
                        addr  = base + cnt;9 k5 ]8 I9 ^  k- Q; d# O/ F. b, A0 D
                        sync ();
5 z( M5 ~9 j# P# U' n5 @0 M- b6 z) K9 e                        *addr = save[--i];
* @. W3 M3 Z5 |3 ^) _( _8 J1 W                }
1 Z) Z& l( ~0 B" S4 ~                return (0);& h1 x: L  o+ @7 Y
        }$ U* S5 s2 _2 E: }, C
& s3 N& ^5 M) }$ s3 H2 x& j/ h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  u* K$ R! C: Q# m, m* y  R- D                addr = base + cnt;        /* pointer arith! */6 I& ?3 h7 \5 ]% Z
                val = *addr;
- |# G# g/ s+ Y' D5 l5 ~* g5 f                *addr = save[--i];
, B: ^% J+ h7 `; b6 Z: Q                if (val != ~cnt) {: @+ D$ X6 ^& W# k. y- d$ q' _9 I" J
                        size = cnt * sizeof (long);/ n6 r2 P2 S  n/ s
                        /* Restore the original data before leaving the function.
& c, G) c6 N, O# L+ A$ Z( E- `                         */6 f" G7 d$ x, c9 M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 e, g% P) W& ^+ y, N                                addr  = base + cnt;+ N7 ^7 W$ S! J1 q, W" Z
                                *addr = save[--i];
/ N0 z4 M& [) Y2 N  x; ]! e$ K                        }
9 v1 @0 D0 e* T* Q* y                        return (size);
% r2 A& Q, Y% x9 s$ ?+ w; J                }4 h2 I+ `6 k7 w. e: U+ o
        }
0 {/ J. m5 C8 y' F
; H# u1 l+ w& V  t' F4 |; X        return (maxsize);
. @) @2 k2 E( V5 c}3 O* Z3 ~6 p1 A
int dram_init(void)# V& n/ l2 }7 N7 {
{
1 Q* N/ s, m- J$ l8 i0 z; d. b# R  |% O        /* dram_init must store complete ramsize in gd->ram_size */
4 b( @3 g1 a# A# S) ~; K        gd->ram_size = get_ram_size(. \0 w8 _- s( r+ A( c- h
                        (void *)CONFIG_SYS_SDRAM_BASE,. C% P5 v1 w; Y& y1 h. i: k
                        CONFIG_MAX_RAM_BANK_SIZE);; E! f' n; Q! v. G
        return 0;0 {3 @( E1 l, \, u: ^, Y5 G' B
}: a, y7 O5 R1 n! G! W( T0 ?
% B$ x2 w$ Y' J5 r% M
6 l( j" z6 J  P: l4 F/ F

/ r6 _/ q4 W6 k7 b( O8 \( g8 }8 _. u6 z3 Y5 t; q8 f" {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!0 t! Q% i/ q0 B; b& `5 Z# s. T* ~% ^
) N! L/ N0 |9 r6 Z3 S8 Q

: x" Y+ ~, P6 g
: ?+ Q% E8 E; H+ u7 D+ l! e6 J





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