嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. e( g! w/ [/ s; j* W% p x! L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ W. i2 S2 D `1 @5 ]' _) a
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. }; y) K9 E, ?$ {' s+ Q$ Y
3 x# d, i. d) Y2 q( q& @7 ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 Q( {1 d q9 N5 F
8 C9 ]: A7 F# L
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
e N3 T3 r# c! D o
/*
) Y5 m+ v8 O) P0 K+ k
* Check memory range for valid RAM. A simple memory test determines
y3 A0 V% q9 e
* the actually available RAM size between addresses `base' and
; @4 W! U" L- t4 |- D7 r" M' ]
* `base + maxsize'.
: Y9 J) i7 z. C/ U1 Q4 @
*/
: N/ [# I L6 a* m8 L0 j- t% b% j
long get_ram_size(long *base, long maxsize)
: E6 S- I( |% \$ `. r
{
. n+ f5 L# a& L8 [* M4 _
volatile long *addr;
2 E) Z8 B3 g8 P
long save[32];
0 B8 ^6 C+ f! F
long cnt;
4 R- s! ?7 w o3 [! M: n( A
long val;
/ \* A% m9 |+ X) ]
long size;
* K3 {# u4 O& x' w0 H1 o" d
int i = 0;
/ G! X9 o7 E$ Q7 O8 H& k6 K
1 E5 [/ F, b5 z5 m, N. I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
9 s2 g6 r, ]; `! K9 }
addr = base + cnt; /* pointer arith! */
; m8 k" a e. J K$ h/ W
sync ();
& o8 ]2 Z- K) l4 ^
save[i++] = *addr;
9 W- G2 b# k3 d3 y6 G
sync ();
: V: y" y; S$ t$ H0 d7 x
*addr = ~cnt;
' N" f$ @$ y, @5 H. T
}
$ r0 O8 M1 s8 |) m& j
" x0 u) ]0 }3 ~0 a5 z z
addr = base;
/ s; h" V% @; S# `& D( u L
sync ();
' ^8 y, o5 z- p: Y( ]5 h' [' B/ G
save
= *addr;
' r8 o/ {/ b0 x# e4 a0 m3 \
sync ();
$ I- m$ {$ F' `1 o3 v7 U) [" A
*addr = 0;
$ _# t6 S$ r/ B7 H6 q. g, j6 U0 l
: C" t: y& ~9 P; y
sync ();
! M0 L, W7 O9 G7 T" D
if ((val = *addr) != 0) {
6 o$ t0 _# V6 c
/* Restore the original data before leaving the function.
- o' p3 g$ z+ d' C# H. m" j( V
*/
. i* C- f! D4 z* Z n: c# U
sync ();
: X% A% [/ q ~% t6 I( |
*addr = save
;
& y- _& v+ {. z5 P2 w6 q' ^7 N6 B `3 r
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 ?/ _) Q" u4 ]% @
addr = base + cnt;
4 [0 x' p: X3 G) l5 i5 \/ ~, L
sync ();
+ @. X) x$ J5 @1 x& v$ r
*addr = save[--i];
0 X9 _/ o% f4 g7 X* _6 R$ x
}
2 s4 ~& b, v+ ~% e9 h- f; v
return (0);
7 P+ J% ~. ~; w; U
}
% B, X/ d0 v: u6 g
( J3 {. C( A7 m# B7 }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' `$ V* K/ I: Z. A$ O: o& t
addr = base + cnt; /* pointer arith! */
+ L. X6 j! q/ [! a
val = *addr;
! R0 X% G: l% h) n0 q
*addr = save[--i];
8 j, d! b2 W Q/ n
if (val != ~cnt) {
& J- x9 l( H$ B. N+ Z
size = cnt * sizeof (long);
2 E/ L6 \; m' s2 c' `
/* Restore the original data before leaving the function.
2 l( Q U9 U" p
*/
- U+ J: A1 H4 z8 S
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& {2 O, E9 e. V6 ~# s
addr = base + cnt;
/ n; j, W4 j6 T% n" H, ]$ ^$ a
*addr = save[--i];
# e. S, _2 L& G
}
1 \, J. j5 \% M1 B7 _
return (size);
, |; i7 @7 |9 A
}
. n2 }, i+ ?; U% A8 T0 _
}
% Z3 N* s1 G+ t4 x H, {2 |, f( D
( {! Z3 `: v# v/ B* w# w" H$ @
return (maxsize);
- W1 D2 ]7 _5 k& M" a, g
}
/ q0 x# R( h7 a; x
int dram_init(void)
7 i1 n h7 \( j; K, g k0 U; [
{
I' G$ n1 i+ y& c5 U
/* dram_init must store complete ramsize in gd->ram_size */
' J% @, y$ T* |2 D5 Y7 u! P) L
gd->ram_size = get_ram_size(
3 N8 K3 \4 v7 X8 e2 ]* K
(void *)CONFIG_SYS_SDRAM_BASE,
. g2 A. e; m- a; P! J' i
CONFIG_MAX_RAM_BANK_SIZE);
# ^" y2 @. Q* N2 p1 f0 A& p7 u! t
return 0;
( v9 @+ P1 `& L0 V( u
}
* |5 J- i# V2 ~7 N% v
5 M2 ]4 m5 j% P+ _! R* W1 ^
( K/ K) J0 M, m4 F* V
( Q4 @7 V9 v* d+ P( w, w' ?
3 d g; \2 R1 F& t
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" M8 m1 X" u% h
" D" C7 a: E; N
; w* Q2 ?2 W9 }
, D7 j M" j! X1 H4 ?9 ^6 i
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4