嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
~7 k7 Y6 l! |% ^/ g: i4 D
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; N8 f6 A |' i9 L% I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 B; g7 w6 [9 ]* d9 V- T& o
# |, i+ H1 @+ b# @) M, ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 Z. X9 r7 h% v1 n k4 _& B6 Q* k
$ g' H) Z: ]7 u! r. r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' \( `% S% g) z
/*
0 G7 Y J W: W
* Check memory range for valid RAM. A simple memory test determines
9 o9 [; D5 T/ H& u. @* `
* the actually available RAM size between addresses `base' and
2 b! R% S+ I8 K* y8 U) F% f
* `base + maxsize'.
$ `$ Q6 u6 Z, t9 L3 Y
*/
1 I* X9 p$ j' l6 j6 @6 @7 i
long get_ram_size(long *base, long maxsize)
& S: r. k/ m0 M Q) y
{
) D3 W) v# S* g: q8 d) H
volatile long *addr;
$ ]" k, d' z; i) G! h6 m# W
long save[32];
0 u9 N0 b6 M+ [& p
long cnt;
% k7 ^% j% w7 h2 n `) A; R
long val;
7 n- U8 j% z$ d$ W
long size;
2 V5 w: K- m6 Q/ g2 f1 N/ S2 m
int i = 0;
/ T9 U: d/ O6 x: f2 }
* z4 F. l; a- |* q. C$ Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 g2 d- @. M Q$ ?5 @
addr = base + cnt; /* pointer arith! */
+ ^1 X: Z. X6 I8 k$ [# \
sync ();
9 F5 b f4 a' i$ c9 i9 |
save[i++] = *addr;
, ]$ H4 v7 f2 G
sync ();
* C7 A. Z5 X9 \ _8 Z7 H0 d. l
*addr = ~cnt;
* y- J& O A' P4 `0 K; }/ _) w
}
% O# q2 z' C# f0 D, G
& q0 z6 ~9 t$ E, ]( b
addr = base;
# q, O* X# X, o& g/ d. C- }
sync ();
6 v; X6 g4 x1 B& S) S
save
= *addr;
& E- J2 u: n7 I1 }* O
sync ();
9 v& u3 h* b }( Z- Z8 Q
*addr = 0;
/ H0 M' T( s0 k5 G! q/ @, L
9 Y) m. K& J8 o! H
sync ();
3 \# ?4 e, x" O. ]8 i. l4 L3 U$ g; Q
if ((val = *addr) != 0) {
( v P% A" g9 V0 Z# Y" ?- y$ Z
/* Restore the original data before leaving the function.
# H' V% ^' a3 A
*/
7 s4 Z" {- V$ M* X
sync ();
, g$ O* ?( f* p6 `$ A
*addr = save
;
# h; r u+ ~ J7 g/ ^7 `2 u6 }1 n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, N3 n% X! W1 g/ F1 \6 `
addr = base + cnt;
1 _6 E: n( K( l$ v+ ^4 f
sync ();
8 L7 V4 O; V6 y# B" P
*addr = save[--i];
- o) X- S: _6 b( M! j5 L' K" w
}
9 Z& _& x2 u3 I
return (0);
C3 x1 F8 x4 v' S0 k
}
% |; y, z3 m; X o% N. _% `
$ \8 U$ u0 o% R& l7 H0 r& [
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ {" Y! ~, k5 ~, b4 J' g* ~ { D" X
addr = base + cnt; /* pointer arith! */
& U) j; R% }) |3 N: T1 \
val = *addr;
% R# B) Z% L6 d& f, Q
*addr = save[--i];
_/ e, F/ H& w1 n& j
if (val != ~cnt) {
0 n$ Z1 l9 B$ e
size = cnt * sizeof (long);
# u8 S# u4 X& V2 d
/* Restore the original data before leaving the function.
4 N5 a* W$ }' r9 d5 Q
*/
3 o5 {9 f7 | G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ _, U* y# T3 J! R# v5 x
addr = base + cnt;
" L c# u0 u, X/ B" @# g4 A
*addr = save[--i];
5 T) }. X" C% t {$ o! G
}
( l# ^' w' [: f6 f+ f( C
return (size);
% o1 O/ D0 b& `1 a+ M$ x' }
}
: p" f/ a( p* w% ]
}
8 I, |% x9 @6 o* k0 `+ A
8 w- ~2 X, p6 G& L3 G5 c2 M
return (maxsize);
6 |2 }3 Y# N1 ^' f1 O
}
6 J( U, }8 d: \6 K
int dram_init(void)
8 t7 {( E( b0 e3 q
{
# W) e1 Q( k1 [
/* dram_init must store complete ramsize in gd->ram_size */
5 J+ i" ^) H; a9 x' {; ~; {
gd->ram_size = get_ram_size(
8 V# ~ |0 E3 W) b" N' N0 K/ d0 ]$ y
(void *)CONFIG_SYS_SDRAM_BASE,
2 J2 ^3 _9 P& t4 S4 ~' V" t, h
CONFIG_MAX_RAM_BANK_SIZE);
7 u H' ?) |% [2 q. F4 `% X U
return 0;
* u" }( G. S: D% }2 X6 _
}
/ |1 ? ~" G5 Q' b
7 B4 _; D) p' @
- n5 q3 s3 G" S5 F6 p, x
7 O8 v9 i, E8 T5 ]( W8 `
5 d6 G, [ f$ S$ I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* T- u* u: t% O& U0 v! y5 a6 z
5 c6 `2 O3 ^0 d+ B7 ]8 f
; q) ^0 c/ M) g7 y) n; h/ j
! i2 d+ h! [. K X( l5 z7 {
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4