嵌入式开发者社区

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

作者: Mr.Loser    时间: 2014-9-11 09:33
标题: TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 j: w$ Y, D' M5 l+ s0 H核心板2:DDR2 256M Byte   NAND FLASH 8G bit
/ n4 T9 y4 g" d  e8 x: |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, Z0 \4 M* N' W/ X# e
, h0 T/ K3 z) m5 O2 P* Y是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?; m1 i4 J( ]$ D: o
0 J! A8 h) O5 {/ O$ h0 J

作者: 2532609929    时间: 2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:+ I, W- A2 \8 g! E) H- e) R* _
/*
" a8 A$ ^4 M% z& z* Check memory range for valid RAM. A simple memory test determines
5 ^$ }9 H$ m5 t* the actually available RAM size between addresses `base' and- Z5 S5 E6 p5 e
* `base + maxsize'.
5 b, s; {1 }7 |*/8 G6 W' X' B7 ?) w3 A" Q$ B2 Y
long get_ram_size(long *base, long maxsize)1 w9 G$ W+ |+ {6 D/ L% \
{' B& B) P4 Y$ }) Y4 }
        volatile long *addr;+ c3 s8 H, k( h( [: e
        long           save[32];
% s, {; p/ p8 L$ X" Z  D        long           cnt;
- _. ^" K# }4 H        long           val;
4 {2 ~# T! {. \. C# M+ p        long           size;
5 G4 R& `0 H% N6 @* A  v        int            i = 0;
) I2 O& y/ ]& ]
1 m& Y/ v0 I& ^6 Y        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {2 K6 T, v  [# j4 ]5 A  x$ w4 _
                addr = base + cnt;        /* pointer arith! */6 U% K/ Y6 b# T
                sync ();
/ z7 W9 C1 p0 i$ r6 ]                save[i++] = *addr;7 Y$ }$ W: K( n7 ?0 k
                sync ();8 X& j' x1 y/ |& w
                *addr = ~cnt;1 E, q1 d5 E$ R+ X9 s9 Q7 R
        }
  A+ n2 ?( |) }0 S' E& Q& Y) @
# b4 g8 ~3 ^" G$ o" Y8 {        addr = base;
- V8 \2 X& v% L4 s2 j        sync ();8 d+ Y, l" C  S2 k4 Y3 T
        save = *addr;
5 y) G! z- O/ z2 S# O2 A        sync ();
0 e, d& O# G: _0 z/ E; V5 j        *addr = 0;
" J& \" g  P5 F2 T& b8 z1 q3 X
1 S- m& H. g4 [7 d8 x7 C& D/ Z        sync ();
4 U1 Q2 U. S7 w9 u$ f% h4 ~$ |0 H4 X        if ((val = *addr) != 0) {
  N, ^1 _, `6 {& [( L1 V! |                /* Restore the original data before leaving the function.! h% E' X, c/ C/ K& a8 x
                 */0 l) c' d3 \' U3 w9 ?8 o% L
                sync ();. z& z& k) {& e. s& n' B9 p& I
                *addr = save;
+ G( D9 H) `% q8 c, A                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 Y% G! d7 ]9 |1 {! S6 _/ T6 ^                        addr  = base + cnt;
, T3 B$ a2 T# M5 d                        sync ();% Y" D+ P2 b  H4 n
                        *addr = save[--i];2 S; L+ \# V2 l1 U: s! X# W
                }
# K3 r9 w, Y' M4 \7 X                return (0);$ s9 t" L" h( U9 T7 N
        }" g8 C5 _* y2 {  o; `( T1 Q; |

! j# L5 k: p0 }1 ]& _        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% z+ ^7 C/ v5 f. J! k
                addr = base + cnt;        /* pointer arith! *// G& V: V& c2 `) W! t5 p
                val = *addr;
! l0 G/ k8 N$ A/ l+ V- [                *addr = save[--i];
$ w7 z7 C1 r" n                if (val != ~cnt) {! n/ \/ o: e2 E
                        size = cnt * sizeof (long);" f1 j3 X6 i' D8 Z  n2 a
                        /* Restore the original data before leaving the function.1 P: J' B0 E" p# q# N
                         */
& K( l4 E1 ]& L7 g8 x/ d                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( `/ I; z4 U2 a3 g: ^; c
                                addr  = base + cnt;0 Y$ Q- _8 z( ~8 g8 E7 d
                                *addr = save[--i];
; _3 N. A" R0 k* u; b! T" A( b1 M                        }$ Q/ p# M5 o0 l6 J
                        return (size);
8 `) R$ T( N; c1 C3 r/ z4 H( K                }) x+ ?8 u6 X6 A- M# n
        }
, n( k1 J0 u& e) Y4 W
, K$ a6 S: D4 F1 |3 V        return (maxsize);+ y0 S) C3 x" j1 B) E6 p
}
) F1 J1 K; Y  _  U# {int dram_init(void)3 \8 R0 z& X  z; a% z+ H/ T" W
{
2 U" G. q# M9 N        /* dram_init must store complete ramsize in gd->ram_size */
( G' v# q7 n1 v, e/ Y. K        gd->ram_size = get_ram_size(
3 H9 I6 I9 u* {! p                        (void *)CONFIG_SYS_SDRAM_BASE,
3 Z3 J  p+ V. Y5 ?( ~                        CONFIG_MAX_RAM_BANK_SIZE);' A2 O/ F$ F$ p( v" _) Q/ w# |
        return 0;' Z7 {5 ^( i' k
}# `# u# v# e4 Y+ {9 a* b

; q) N$ M" L3 Y! o7 R4 c# A  ?# n3 n& h

0 U* A) m  F7 C& U6 }# T3 C
) s- L/ C8 D* x* z0 B0 i; p2 _FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 U$ J+ c  @8 U4 A% H) d0 C6 C2 G0 s2 _% s, U
- {- i1 V4 ~- M9 Y

8 L3 c) R7 x+ \! R4 M( D2 t; @




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