嵌入式开发者社区
标题:
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& ?: @% `/ |$ K
0 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 determines
2 \! 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 _$ F
6 |" 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 S
9 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. Z
1 @/ 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$ r
FLASH是通过检查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