嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
& T4 d! \5 D* a6 E9 q( B; f核心板2:DDR2 256M Byte   NAND FLASH 8G bit* j! X# W0 F& l, d/ H, n, X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
# u7 e& ?: @% `/ |$ K0 A. W7 J8 m. u+ U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. K* g0 F. _9 Z2 X9 r+ E+ L9 Q3 P# w7 N$ K

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
  q0 M4 X( u3 r& O/ R5 A/*
( {& k) l) d$ N5 B% |* Check memory range for valid RAM. A simple memory test determines2 \! Z4 {9 O- |$ N/ ^. }
* the actually available RAM size between addresses `base' and
" N6 m+ i0 z) L! c6 L* `base + maxsize'.3 A9 \( B% ^+ W! \# G0 q3 p& W
*/% I" K" J6 N. `  |1 R0 S  E; h  |- u
long get_ram_size(long *base, long maxsize)
$ s$ Z9 v# K- i{
+ a0 ^  u  O3 i9 ]% w. ~        volatile long *addr;- i, q8 G1 ]% s! C; p- p3 d
        long           save[32];% @2 {# b3 V5 a; g$ n4 w6 Z
        long           cnt;
. r2 `4 Y7 J8 ~% B4 w) X! n        long           val;7 L& S$ V+ q0 O
        long           size;
% K- c% R7 B* w# h5 b7 w        int            i = 0;: d% ]5 V* Q; P- z
3 j3 V# M6 W* C  ^
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 s" T: R3 W- E2 x! }                addr = base + cnt;        /* pointer arith! */) Y  A( Q; n- I: R) W
                sync ();1 B' d9 z* D. |% l+ A( W0 U4 t
                save[i++] = *addr;# u; z. A0 _' J( ?
                sync ();
2 O- G2 M) U. [! J+ O                *addr = ~cnt;4 R# B+ {1 F, f% k
        }5 R) |9 b# q& w$ }7 D1 C& a3 b' U
2 S* |2 z) r, K7 M
        addr = base;) U9 v! k* r$ V2 f6 y
        sync ();8 q# F5 X# K+ [! t* o
        save = *addr;
5 q3 b$ r% d/ W) S, j        sync ();
2 C3 I/ b, K0 R& E7 F% v        *addr = 0;
/ x3 z5 o; i( f( n" h$ L, z# j
% p* u7 x) @8 P; t9 ?, x        sync ();5 @/ R- v" Q4 n8 [8 W
        if ((val = *addr) != 0) {
, a5 x7 S3 Y/ \3 i! `                /* Restore the original data before leaving the function.) @/ W/ U+ q- z* k) H
                 */
0 ?, J( w  D  N  S5 D% s/ u# S                sync ();
5 N0 j/ r6 j- z) D5 R/ m                *addr = save;7 x" z4 u& V7 J
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {$ c& r* f% [0 _$ a
                        addr  = base + cnt;
9 @1 T8 Z4 p3 `! d0 V                        sync ();! D, D4 d7 r& p/ z! x/ S" y) p
                        *addr = save[--i];6 l7 W, d" ~5 e" K2 S) M, j
                }
1 j5 h4 x6 G, X( l* P3 @                return (0);
$ z% B: c# x" e: }- G: B        }
, E+ x: V; y5 i3 _$ F6 |" k* P- t. e! C& V, W& n8 B
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) ]6 t: b. n/ O4 e& ]% W( {% h1 o7 m                addr = base + cnt;        /* pointer arith! */
# y& D( d% f) L6 Z                val = *addr;5 ^; N, g! q8 K& O& R, f# M7 y0 x
                *addr = save[--i];) l3 f5 @" b4 R  h
                if (val != ~cnt) {
6 S% v4 g- s! y+ D" v6 T9 H' B                        size = cnt * sizeof (long);
+ k/ }- ~) X, s1 I: }! e2 |                        /* Restore the original data before leaving the function.
3 h, `1 y) }. u3 Z0 [- ?                         */
. d9 z& [; y  K                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 S1 ]; |# P  _
                                addr  = base + cnt;
8 w& b4 t- {9 Z9 A& u# b                                *addr = save[--i];; v+ P- H9 M3 U! p7 z; }, g7 Y
                        }' ?) r9 \. I6 t/ ^& D# n9 `
                        return (size);
0 Y( o6 o, H7 z  k% K                }
2 W; V; n: T; S        }
4 a. O8 Z$ z! a7 @1 o* j4 S9 D* r- A3 C9 K" s  g7 }
        return (maxsize);
2 i6 Z8 N4 p; K/ q1 T+ a& M}. C: l& u7 T+ H+ o# K
int dram_init(void): t. n- n7 p3 [3 @
{
+ f  G( Y$ E/ g- M        /* dram_init must store complete ramsize in gd->ram_size */
7 h4 `: b3 d" E1 L, b        gd->ram_size = get_ram_size(
6 r2 O! U% Y8 p( q- _5 |                        (void *)CONFIG_SYS_SDRAM_BASE,
" \# b/ x) ?1 h& ?) e4 i                        CONFIG_MAX_RAM_BANK_SIZE);0 s! U8 ]3 `! r* |
        return 0;* ]0 ~5 i& M3 {
}
: H7 \9 j5 z' z, i# p0 A/ I! K. Z1 @/ a! l5 Y4 x1 N+ r
2 g& X+ ~; M* N, |" M
7 g% y) n9 M! [

' W) ]# U0 X/ j* h# D/ K& C$ rFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) j" q9 g, b) l. O# a2 X
7 ]# Q2 J0 _# b/ ~; g2 |5 s8 y- g- q) X

0 Z) ?4 _. ~( X7 g- n" y, q
1 a( z& U/ q/ U# S& \





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