嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
1 ?) ?: r/ h) Y  Z! e核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( ^( q* D1 {4 H: X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 w! q# A1 ^0 @2 ~6 J3 ^3 v
! s$ W2 I& _0 J! N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. e7 V8 a, d5 L" q. w$ {) Z! t3 o8 I5 }2 _+ D' ^

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. P, G. h) [# f3 N( J4 G/ s6 |6 o" [/*
$ e& p" h' a& \* Check memory range for valid RAM. A simple memory test determines
( d7 e. ^# q2 x  p5 j. d* the actually available RAM size between addresses `base' and  h& T# P, w$ I1 s2 F
* `base + maxsize'.* G! \+ }6 f8 y- S* N: J2 G
*/- d# X% C  Z% S( R$ [  ?3 \
long get_ram_size(long *base, long maxsize)0 o. a9 b* |8 g0 `" s# E
{) F" t0 Y& B# A! d/ x) H) o$ _
        volatile long *addr;" D) ]8 L+ `/ ^: t7 V% {8 l
        long           save[32];
  @+ r# S/ L5 k! N        long           cnt;
2 @# ], M( o5 b% C: p        long           val;8 F; q# K) w% M: h7 W; ^4 n: c
        long           size;8 A4 t3 w: Q% k; o1 O; z
        int            i = 0;
! Y% L: A0 x0 u5 T. F
- K( C, S: ?0 P$ B+ @- z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- G$ k! v3 D0 `! K0 @" w
                addr = base + cnt;        /* pointer arith! */
% l  _% ]4 U% W4 s1 B  c& |                sync ();3 ]* ^$ Z; O; Q* S+ m
                save[i++] = *addr;
2 P7 W  W' {! S9 f" C4 P) ~                sync ();5 K% A( X3 R$ L: |& Z7 d1 {$ g5 ?1 d
                *addr = ~cnt;. ^" }, T+ C: e" l8 }
        }' b1 m5 q7 T* {6 Q; k: w# g4 J

3 m% c# R. B7 y# [, N/ H        addr = base;3 `: I+ w- q9 j! |2 C3 i3 y# t' |
        sync ();3 O8 T' s. q6 f% D% W( f9 S
        save = *addr;+ I  |! m/ ^. J5 t1 k
        sync ();. J" \9 N" l9 a
        *addr = 0;
( R% [, A( A9 E! [9 d8 F" j
  `9 Z+ {: d. Y) X1 V+ b  y        sync ();- ?9 C* R% E! A' |
        if ((val = *addr) != 0) {, O" l3 v0 S' {: f) U
                /* Restore the original data before leaving the function.7 G. z+ [9 b+ ^7 m, n2 [
                 */6 k# c  a5 R8 f: y% B' o$ a
                sync ();% H4 x/ W- w% K% I- T0 K
                *addr = save;
& Z/ m6 Y- F+ G3 d) S; b2 J6 l                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 n# u: S/ {. T# O# O                        addr  = base + cnt;
8 G- l8 q, b6 ~3 T2 s                        sync ();
( z" j. [1 u- m                        *addr = save[--i];" X" s& F% z/ `6 e( l
                }' }) H  t) Q4 b
                return (0);
- Y- N  B' h) g        }
1 [! \2 M/ S4 U9 T2 F- @0 L4 @: l7 v$ g
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, [% E  k: \. B# D0 B
                addr = base + cnt;        /* pointer arith! */
; R6 J$ L% q3 |+ D                val = *addr;. K  B# [$ d2 H$ e
                *addr = save[--i];, F3 s% w* m, h% z$ I
                if (val != ~cnt) {
; B+ E0 r8 ^( g1 X0 q8 ~; p' V                        size = cnt * sizeof (long);. w' N9 Z  R) ^
                        /* Restore the original data before leaving the function.5 {" t0 Z: [5 Z9 U
                         */- S# t/ b/ _- e) j; I  s
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 g& f: P9 K. T- T                                addr  = base + cnt;, O% X1 D4 ~) l  m; q2 D
                                *addr = save[--i];/ D8 n" n, x( ]. X3 a1 H7 _
                        }: p7 V- q4 s& g- f, f1 ~- ^
                        return (size);
9 p0 }! F4 C5 y; X* s5 [                }
6 X' S2 b  I* ~' R* k, v, W        }3 h& l% M# R* @: e) Z

" e& O" f  Q, X  s/ U        return (maxsize);
) e3 q( V9 |2 w8 B  K* u}
# c6 Z2 S( L! ]3 [4 Y  X3 V  Kint dram_init(void)8 H( y5 c9 J& b
{
6 u  @  O3 ^6 O        /* dram_init must store complete ramsize in gd->ram_size */
9 X( U# s2 f/ t, b8 u3 M; Y        gd->ram_size = get_ram_size(' ~; D' ^9 t- [  x) N; m
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ K. Z. {9 F! `& e# b                        CONFIG_MAX_RAM_BANK_SIZE);
, m, f6 G1 b& s  F2 h        return 0;+ U! P& N2 C0 w4 K- u
}' n8 T/ G5 T- Y! Y
& L; @. F3 F, F# l( E- L. }
% Z, y0 L! `: K- |# Z
, W" P. W$ G7 ?! B1 x
" K3 x+ _1 _8 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
% H/ b/ a! u' M5 H0 v. p
% Z% e& L. j2 W$ C, v8 [# e6 G) Z8 F# I0 t. ?
% r+ h7 Y! f9 l( C# _





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