嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 \& `. E2 Q4 {" \& o核心板2:DDR2 256M Byte   NAND FLASH 8G bit6 w1 \, g, M0 N* o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, t4 A6 ?/ T* l, c- e2 e: l
5 m; a4 N  B4 `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) V; R0 [2 v; f% O6 f) {  a  \
3 m, n5 L$ ^3 B, z+ I* z& k  Q% n
作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:; T5 S( ?2 i4 Z7 T* g9 F6 y
/*
5 P% ]4 N2 ~" A; [# k# q* Q* Check memory range for valid RAM. A simple memory test determines2 F5 p& q1 S! I. Z& O
* the actually available RAM size between addresses `base' and
" C- x& T! F* K) N: F* `base + maxsize'.
: }" p0 E7 Y$ r/ R% X" b; B1 W*/! j: R/ l# I6 I  A: Y  ^2 Q$ `" z
long get_ram_size(long *base, long maxsize)
6 j( q) o2 D6 k7 K8 L{. [+ |8 K6 t' @7 [7 ^. c
        volatile long *addr;) {- J2 t, ~2 a2 p" P
        long           save[32];9 f9 p' n8 h! t7 m2 V, {
        long           cnt;& x7 T& |0 X/ \; a9 v, x4 w
        long           val;
" k5 N6 t8 X6 A" f3 u: U        long           size;% B/ R% n8 y3 N; ]2 K+ b: J
        int            i = 0;
% h4 J$ A+ f' z/ {
/ Q9 e) A  a: P7 s+ v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ J  c# J6 ~; w                addr = base + cnt;        /* pointer arith! */
* a  _8 l- U2 |# v                sync ();/ s. k7 P6 @' c
                save[i++] = *addr;2 H! T- v9 z' R  g4 G. P
                sync ();
- |( h5 B- t% Z! L1 e  c# t' K7 N7 ~                *addr = ~cnt;% \9 u# Z1 {: W1 f
        }
3 o; O5 Z1 D7 D5 q: Y  Q/ o/ o' K9 g( ?; \) X2 O/ g
        addr = base;0 ]- |8 l: T' a" O# x# h* w
        sync ();
0 F2 F  F& a# X9 G        save = *addr;
4 R  j, q% d5 S9 a: A        sync ();
7 K0 X, o4 \+ E4 a: B        *addr = 0;9 s+ Y  `7 d* P3 M2 M4 I3 j9 O
( s9 K* o. v' [/ p" R; m
        sync ();
3 }& ~, W$ L+ V; P5 I6 h        if ((val = *addr) != 0) {
/ o  d+ [6 _# B0 ]- E/ J                /* Restore the original data before leaving the function.
  ]1 H6 G5 y3 ]& a3 l" d                 */
( {- H& Z8 m, X. F: |                sync ();' q0 r* |4 L' E! X9 j; p
                *addr = save;4 Y  R0 b8 K' C, H8 P% s
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {+ B. r! R9 u5 J! ]
                        addr  = base + cnt;
. {- a: w: s5 x( j/ f1 N4 L3 n                        sync ();. S3 h3 ~3 ^; U  A( O& ~
                        *addr = save[--i];* A7 i  \  |& C" ~
                }* v, k) j8 P0 [9 d) q- |
                return (0);) {' _% m3 G9 D) ^3 Z" k% K) A7 _% D
        }, z& r1 r3 }6 K  A! S' R& W: k( M- N
- Q9 }2 A$ a# g. c& S% {' }
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% a9 _8 p& s2 F6 `" u% L                addr = base + cnt;        /* pointer arith! */  X# `, M8 ^  ~5 V$ C+ y2 k7 Y
                val = *addr;
8 I) }% E; M% ?' W$ E' W1 W0 C                *addr = save[--i];2 {; u- [. _: @
                if (val != ~cnt) {0 X: g0 X: f% X* p1 B: H
                        size = cnt * sizeof (long);
& I8 O/ q* m7 f% c+ x% f7 }  a* c                        /* Restore the original data before leaving the function.9 g) U5 ^" j! Q# V: E6 E
                         */  p" r+ [& {; t6 J; G# y& V: c, o! j1 q
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' r" v4 K6 @7 m                                addr  = base + cnt;
* i3 [$ P( g3 g" ^: j6 Q* r                                *addr = save[--i];) Y% g& K5 [# T8 A  p+ G
                        }
: A& r' r  }6 M# f8 R: h! D; A                        return (size);
( ~  I! E  i" z                }
: m+ N& x7 ^; w$ l' q: Q. ^        }
: e, i7 r  B8 J. k1 d6 Q' _8 c
, k3 g  X7 d/ D! p0 S        return (maxsize);
. n# ~  e' z9 B2 N+ y+ K}0 s0 O# X2 S: @$ _4 j; A' T7 |
int dram_init(void)
( K% d3 J9 C2 B; p% d, Z{- t/ e8 y: {  [* R6 H1 d
        /* dram_init must store complete ramsize in gd->ram_size */
6 S% T' \' R8 r2 z* R        gd->ram_size = get_ram_size(6 h( R) g8 t% z( L+ _5 Q
                        (void *)CONFIG_SYS_SDRAM_BASE,2 C" X" ?- M- G8 v7 T; o* Q. d
                        CONFIG_MAX_RAM_BANK_SIZE);
; V8 E& Y  a2 m* N" V- h        return 0;. J& ^; B* o. r5 u0 E
}" m( d0 Q3 e. l" V2 H& z

" L" O- U% k$ P$ y$ \: h0 @
! a8 q/ W+ ^  y  g. N" c; o6 l
" Y% Z6 T$ l1 {) {: h, J3 R, N: I: _8 ]5 s
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!+ j# h: z% P3 T# @& u/ l
2 `0 f1 T% G; H' G# c
" m. f& O. Z( G  c

' [0 E5 c5 z2 x# p/ T




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