嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 q- J: n& l) ? y$ n) D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 B1 P* t6 Z6 B- Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
j0 V( R6 Z; l- u3 S
* R% @6 }6 K& V* i- h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ {; M" y: q" D) c" W! F3 |, a. C
+ a( u7 h# v6 L/ F/ a( Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 Z- F6 k: _( g/ m% Z, a$ H
/*
+ \" w$ H0 d/ B. c5 `
* Check memory range for valid RAM. A simple memory test determines
9 s& |4 k% h; _; @* H$ D1 G* a
* the actually available RAM size between addresses `base' and
1 F4 @9 O6 Z4 Z
* `base + maxsize'.
; I/ U& `6 o' ]& P2 S
*/
, G9 J8 g1 k2 ~; t
long get_ram_size(long *base, long maxsize)
$ c) U' H0 Y: _
{
; u) h% k: X6 m3 w
volatile long *addr;
+ i& f. N- i2 k' P6 p4 K4 u
long save[32];
, @3 ^$ k1 M$ _$ U# B8 O" N. f# N0 B6 d
long cnt;
/ B7 E5 G5 e& w( K9 j
long val;
/ e: M* } [) Y5 U
long size;
8 w/ T7 Y! ]* |* \
int i = 0;
/ y" d$ \ d6 R$ _8 Z3 ?
6 ?- x% i3 Z+ @$ v# G4 A9 l6 q% U
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* R% ]& }6 _' `/ N5 v
addr = base + cnt; /* pointer arith! */
- J3 u1 x/ v1 m- X: ?
sync ();
2 v: a5 d9 d* R$ g z
save[i++] = *addr;
4 n7 B7 d$ G9 k& T, `/ ^
sync ();
' l2 k8 Y2 ] Y( Q C6 P. O& M
*addr = ~cnt;
1 H, k% f& G4 N- V$ s
}
: @! q- G, O7 [& y
. Z0 R* b" K8 b
addr = base;
0 q( `" Z$ D6 G4 {& y! S& Q ~
sync ();
g# y. A8 x A' A3 k& |; D5 b
save
= *addr;
- n% o0 l6 p J0 A- K+ f# j( S
sync ();
% V; l/ b+ k P9 H2 \
*addr = 0;
# F* v7 R; W1 F; Q. \7 ]: ]6 T! r4 P/ @
4 \4 P) P# R+ K
sync ();
j! }$ }8 j9 `& b% O, d H, T! v
if ((val = *addr) != 0) {
" X" G$ x. ~$ a* J0 }
/* Restore the original data before leaving the function.
; _2 V" d O8 z, G; d1 O
*/
/ h8 ?9 {7 r& K g
sync ();
+ J7 c3 g0 H" [7 x9 Q7 n
*addr = save
;
1 o7 k' o: X! ?9 s4 R
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 [0 A: Q& k/ u6 O' Q; ~3 V
addr = base + cnt;
7 c8 b. F5 y# _9 |, E
sync ();
, f7 T+ ?2 C2 A; m# k" x- [2 J7 `9 e
*addr = save[--i];
( J% N2 h2 x. X7 v$ V2 x6 B' ?9 L
}
) T$ A& M0 m9 \' u8 J8 L
return (0);
( g- c) `+ t8 v+ O7 s0 m7 n
}
& p% `$ V& t) @$ ^
+ L: L' W7 |- Q [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( J( M# _) g. F7 w; Q
addr = base + cnt; /* pointer arith! */
4 U$ ^! [" R6 q" g
val = *addr;
3 {* r3 B' E/ q- J; [* U
*addr = save[--i];
% [9 N# w7 q3 j4 O( q c
if (val != ~cnt) {
: M3 T$ F5 ?. E" `8 Z0 T7 i& g5 }/ m( M
size = cnt * sizeof (long);
% a/ D4 Y) X5 Z4 F. g0 ^& c# v# m
/* Restore the original data before leaving the function.
+ Q$ E) |0 J& ]8 H
*/
" w( @ B1 e. e+ }" D& X; B) Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( L9 T0 W0 g9 y) D8 ~
addr = base + cnt;
7 u" p# N* L8 A* W3 s/ E
*addr = save[--i];
' `5 B' e- U6 {+ f
}
1 `0 G3 T( X; O1 U) j
return (size);
- m \- N8 |. w" K0 ~# c3 i
}
- X6 A M7 _ w" x
}
$ F* l2 F/ p) V4 j8 T/ [
v+ ]* [( ~- N
return (maxsize);
6 L8 s3 x4 w k8 p0 Q) q
}
/ z5 w# [7 {7 p6 h3 b
int dram_init(void)
# v. t, \5 x8 S) {
{
! Y9 [% p4 m& h4 D
/* dram_init must store complete ramsize in gd->ram_size */
6 q& @) T6 ]; ^5 Y S
gd->ram_size = get_ram_size(
# N4 G. _; f5 e7 a
(void *)CONFIG_SYS_SDRAM_BASE,
. m( _( l$ K7 D2 t, c
CONFIG_MAX_RAM_BANK_SIZE);
" t W x/ _1 B
return 0;
9 W2 J$ e0 |+ C( H. p9 q
}
! H G7 I9 I) P. E7 ]
; E, K: C0 L) m9 Y) f0 U: O* U
# C' G9 A2 C- F. u! L5 |
9 K& O7 {+ |( \' B6 ?- o
+ f( z8 y0 r# r( ?
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
`% F' N# K! G+ Y. G+ A
4 y7 X/ y7 `8 \- D! g C
9 z4 Q: Z! T0 W) ?
' ]0 I" y7 O/ P7 i# Z# K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4