嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# V; p) h% Y8 M! F
核心板2:DDR2 256M Byte NAND FLASH 8G bit
. M% }5 [* V1 b! s' a6 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
|. P( _# U0 z4 n% O( k J4 I
7 J) ]' s7 H5 ]; z/ W4 a0 {
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) y% _' J' u: ^" O: c9 M) |
% s2 e, k; L* e( q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. r% b1 g$ z( T* N
/*
2 S" F. N* |( o
* Check memory range for valid RAM. A simple memory test determines
$ b G$ d W2 }5 a
* the actually available RAM size between addresses `base' and
5 l& p9 Z9 G; Q! Y# A. I* U9 J+ B5 r
* `base + maxsize'.
@- x3 I4 T; A/ \
*/
+ ~/ Q) n# r6 t2 J2 k1 Y, p# L
long get_ram_size(long *base, long maxsize)
5 ^- U4 V3 {: @. s/ A
{
3 _6 s$ w- f6 G% X
volatile long *addr;
2 s" t6 w# J, ]* G6 {. r" C
long save[32];
/ P+ t5 z5 W0 D' H, S
long cnt;
4 J* K# E* }" f
long val;
# g- J) O V/ u
long size;
# P3 }3 }* U! {7 N% ^ q& S" |
int i = 0;
6 x. ?. X, c: P- d
9 _( t! Z: @* k6 A0 s6 I ~; n& }1 l
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 c$ \$ N. X; I# P2 v4 ]
addr = base + cnt; /* pointer arith! */
9 t" A2 i/ j+ L. _
sync ();
/ c9 Q: u) |+ }1 d
save[i++] = *addr;
' c& p* m! q. ?: [% Z
sync ();
: d0 \3 W5 H: e2 y% K3 d) o
*addr = ~cnt;
v1 P# z; Z; I( Y% Z
}
$ R: ]7 N4 ^& B; b7 H' N) t5 I
, R+ Y# G9 a" E0 l
addr = base;
8 e( w4 C7 E% T& a5 B+ Y. S
sync ();
2 o; j: `. {( S% u% e+ M! `
save
= *addr;
" ]3 Z" A! a$ Y
sync ();
- h) C) U& H T% [. r4 j9 f8 o
*addr = 0;
$ ~1 k8 l' @$ S+ x5 Y
" y3 P' m& [( x7 M7 }' G
sync ();
8 G9 R: F# {6 Q+ Y6 S: X# V
if ((val = *addr) != 0) {
9 {8 {/ m' H$ L$ P$ d
/* Restore the original data before leaving the function.
' y/ n2 q$ @. E) n' y
*/
: N' `; m, F$ e
sync ();
3 _, Y2 S- C! X& }
*addr = save
;
! ]7 v: T9 u5 p* E- H" g
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ U G0 D* i; X8 M5 g
addr = base + cnt;
# _% j$ u c: S) j0 y: m- @) f
sync ();
1 @0 d, ~7 B/ o) W8 `- h
*addr = save[--i];
% g+ j I/ m* D$ }% s
}
- m1 T* ?6 S9 X4 q! I& V
return (0);
4 F+ G; F# \; E2 T' B
}
% |7 j; A; S) n9 W: F- m
% J% W8 I" B! I2 J3 F- G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( l, q! p6 o, P- V3 h; w
addr = base + cnt; /* pointer arith! */
" `4 \, [: x. O, v/ l
val = *addr;
/ G5 l0 F- L/ m: f
*addr = save[--i];
6 J- \/ @( k/ ?
if (val != ~cnt) {
: r& G2 F* j% y5 E
size = cnt * sizeof (long);
. {; C4 l0 i a! c- S, M
/* Restore the original data before leaving the function.
9 v/ m) }5 P2 Z3 c
*/
8 L7 e# r# W& `# a+ r
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; s, V W. B* g; p% {" w
addr = base + cnt;
, y' n' u8 V, U6 Z
*addr = save[--i];
+ K9 E. ^1 n% ?: ~
}
. J7 Y6 W) M9 w1 Q. g$ e0 i
return (size);
+ v# @6 o! q! u8 {5 `: X
}
5 q6 a. \) e2 J8 ~6 H
}
1 @4 r" z3 C: e! f
. w* v/ f% l9 H3 Q; |
return (maxsize);
# d. R+ b5 J* h/ B: G+ t3 o0 o
}
* O* O7 K3 q: a* X: @* v: g: Z/ l6 j
int dram_init(void)
7 q U4 R. ]3 b. K2 w
{
# }6 |5 u/ X3 u: \' G9 u) u
/* dram_init must store complete ramsize in gd->ram_size */
) G5 z" J- l- f$ A# M7 F
gd->ram_size = get_ram_size(
0 Q' D3 j6 X U j
(void *)CONFIG_SYS_SDRAM_BASE,
7 v- q) i" ] P4 ^
CONFIG_MAX_RAM_BANK_SIZE);
8 {2 ?" q$ p1 x/ p$ ~) n' _, L" m
return 0;
2 ?+ r- A" a. p( Z8 Z; t) m" {& V9 U
}
$ G0 b9 X9 t% Q
% k( U+ L0 n8 b9 y
6 {5 W) s" N% j& _
0 f. b! O- X2 C+ `# J
3 v# O" K' o( }$ L% Z! w6 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
3 ]8 q5 _; s/ i5 b' S
' Z0 u, z* j* Y2 N* P" v
+ {4 {: b. ?5 l8 X" v5 W
* i+ T7 _% b0 w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4