嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
$ Z, s1 O) u# x. V! |$ C1 `( Q. l. j核心板2:DDR2 256M Byte   NAND FLASH 8G bit
1 Z% v' R" H* m" m+ [这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ e% ]& v' H1 T( n
8 @+ a. ]( H1 s5 y! [- U- D是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 S4 N( _6 x; L' ?( n* j$ Y) Z% U, {2 \, ~* Y# I1 F& v

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" N! ~. R% {* i$ n, V/*
" x! V: ]8 C! W- Q) m* Check memory range for valid RAM. A simple memory test determines" g: s; W. A$ A! v0 X
* the actually available RAM size between addresses `base' and
  Y$ |$ F% n% p& [0 g% q* `base + maxsize'.3 S( d7 d- c! `6 Q- r" E+ E. z0 [
*/& s% c' M7 x7 t+ G$ \9 r% @/ L
long get_ram_size(long *base, long maxsize). j- M6 d" q8 v
{
9 c. G6 x  b; v- O        volatile long *addr;
! N; f/ V6 a: p9 K" |" |        long           save[32];
7 j. |9 `! T1 g3 y5 m        long           cnt;
' [7 N! X/ r% n7 w! \        long           val;
# _0 c! E; K7 u- k/ D5 j        long           size;
0 |1 D, |6 i  {! h6 W8 i7 n9 k        int            i = 0;
  n; m( }% s4 O  a' h& k8 c( }- B. I7 U3 J+ K. C
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 v' `$ x# q6 f1 ?3 A; c
                addr = base + cnt;        /* pointer arith! */
% c# p( U. j1 T) J                sync ();
# y3 O- o* J8 S8 o+ p                save[i++] = *addr;$ \  R: j: {# R% \$ k* \
                sync ();) {) n1 Z7 H" f) t3 g, l
                *addr = ~cnt;. h3 |/ b- s' v( ]: M+ i
        }% Y/ W! ?- X' U) B1 O! Z
# N" o) P* i0 t: E* z! t! E) s
        addr = base;
8 p: ~% M8 B$ w* K& e        sync ();" I  \( Y- ?9 [1 A
        save = *addr;  E5 h) v- R) ]  K9 o9 s4 u- z
        sync ();
3 {) ?0 E0 o: d! x        *addr = 0;
  g0 [" `" v  b' G$ ^9 {! C
1 R- v; {& ^9 b- H        sync ();
: e9 D$ e& O0 r        if ((val = *addr) != 0) {
! y3 ^5 d# f4 E) V: K- e3 Q                /* Restore the original data before leaving the function.
; l0 R  \5 @+ y' z, h" E                 */
& e) I$ |$ ]% U6 I# O: ?0 f                sync ();( W9 L. g0 Q+ E- b( I
                *addr = save;
4 I& X6 g5 ~/ K: g2 V. F; b, `, ^                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ l5 L) v% s1 m8 s& e' j. Q" s                        addr  = base + cnt;
0 u% y3 W6 J* u. v                        sync ();7 p( N/ G8 u4 s) T0 z
                        *addr = save[--i];! F$ w5 d5 Q. K; w
                }
& r0 }3 k- ~% R                return (0);; i- k, L2 f9 y
        }$ T" T6 w) V  p2 c% L* g- ?5 ]
6 p0 r( u7 r: u4 W6 ~) U7 F6 h
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% i$ o* G' C- x' t! ?: V( D4 i( u
                addr = base + cnt;        /* pointer arith! */
% b1 R+ U$ I3 _2 }( ?* Q                val = *addr;
/ j1 ?% O  D' w                *addr = save[--i];' w6 V1 X7 p4 P/ W9 i) D" {
                if (val != ~cnt) {3 _6 x" q2 O1 c+ L7 ?8 y! o* P
                        size = cnt * sizeof (long);
* P6 [' C" ~( Q3 O                        /* Restore the original data before leaving the function.; S# [; ~- b& ^- L
                         */
& o  K& s5 W5 r( f! Z: X                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 C# r9 H$ O2 |% I                                addr  = base + cnt;2 c2 ~8 |! G' K' u) D- `% f. g) K3 n
                                *addr = save[--i];4 `' G  Q' h- ?. Z/ N# e8 |
                        }
* ?6 ]/ V' y8 ]                        return (size);
4 d+ U4 y5 f' E! g                }
" W3 l1 c- Y9 x/ w2 ~& a        }
0 w. t3 Q) I8 W, w* ^
) p% P( t; S- N4 Y: [        return (maxsize);0 ~0 ]: F6 f. t; R4 [
}
# \) J  o8 p1 Y5 mint dram_init(void)1 S' X0 V) Z; d& u4 M
{
0 F  C0 o4 ?7 \. }- u& v9 a- G0 A        /* dram_init must store complete ramsize in gd->ram_size */
, A8 x& D4 O% ~        gd->ram_size = get_ram_size(
3 ~/ ]$ Q3 K' V8 {  x, k                        (void *)CONFIG_SYS_SDRAM_BASE," t, V9 i" O' i" F% a6 m
                        CONFIG_MAX_RAM_BANK_SIZE);
& M) _+ h( R+ l$ N, A" @! Y        return 0;( f( i: Z6 E' z( X2 T4 N
}2 e+ U: [2 H4 m3 w2 v

& ?/ s/ X4 r& e/ i5 K3 t2 ~* a! g/ k$ C% x' I
8 M  O) b0 c0 E. r/ B. h) ]8 T; A& o, @

, y/ O1 V; `. @FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!; k- i$ `8 U' K3 O8 h% g$ A: I

" r8 E/ N5 ?8 r7 K7 m% @# f% t& Y5 K  r- h2 [

' F2 O" ?- v# K+ a- ?, W




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