嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
# g4 Q: r6 G+ C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
/ T J" r1 z: o. q; s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 i! [. U: ^; j5 v0 }; O
: F* x" B6 P& W+ `* |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, u7 n$ i6 V7 _% I7 z( H9 {5 E
/ \6 c4 W7 M6 X4 |
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" t' ?* B0 ^0 t8 e7 N
/*
$ H# b. b2 l/ u5 w+ I
* Check memory range for valid RAM. A simple memory test determines
+ R i P9 G2 q" T% ]3 h8 O
* the actually available RAM size between addresses `base' and
0 h% z' X1 p3 n* O$ ]- S! h5 `
* `base + maxsize'.
8 J8 R2 ~; {' T( m, c* C/ ~
*/
. S4 B+ K n# T& L; l& J. R# g: N% t9 }
long get_ram_size(long *base, long maxsize)
: h9 b. O3 l3 b7 [' P# j9 e8 b
{
, R1 m( W6 h1 ] }" V8 u
volatile long *addr;
; l; O! R5 ?! V* _3 n$ t& E
long save[32];
9 W* E2 D& s- y% L7 B
long cnt;
E/ {! f3 _$ w6 w
long val;
! ]4 D. W! Q8 y/ V S6 U9 p
long size;
8 X8 r) B; j" b S
int i = 0;
! y0 ]* R; ^) k' x3 q
6 _1 b) v m) F3 B& {1 x. i8 n
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" f- h+ `; ~% N: h r1 K9 Z
addr = base + cnt; /* pointer arith! */
/ i) V" B+ u: U( X2 b% O% S
sync ();
0 s' ^4 v O( h) x' D+ `2 N
save[i++] = *addr;
. C! q" V0 I& T/ p6 U3 i2 ?' n
sync ();
0 t2 n$ a0 ~ R% e
*addr = ~cnt;
1 Y% |4 |# b- {0 d- P! s9 y/ ^
}
& r. Y% y: {3 w( n8 i. V/ }
6 q# m7 t9 e" u: ?. b
addr = base;
$ F0 ]3 `! f$ S, T, I
sync ();
" k' X6 X v) @) ?' h: s; x- s
save
= *addr;
( C/ |3 G1 r/ b9 Q
sync ();
$ z, S' A! \9 C9 W* H0 x" G
*addr = 0;
3 Q# I7 C* s& ]& c0 B
7 x: E b k; M2 x0 y
sync ();
# b# _; m* L2 Z9 z7 z
if ((val = *addr) != 0) {
# u0 L R# E/ s/ `( p" O
/* Restore the original data before leaving the function.
+ f+ C8 S& ?5 C
*/
/ c; r8 D& w4 ~; {: P
sync ();
; b1 j( l* M2 J3 F
*addr = save
;
9 |4 V8 i- \; o9 b
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, M3 k0 f; C: [1 v; I
addr = base + cnt;
+ g) J* M8 g$ [, W; S+ s$ T) E
sync ();
2 K+ @9 u, s2 L1 @8 E
*addr = save[--i];
" _7 [) N7 j! K; h" N/ o
}
& |5 ~ R' ~. J( R; t( y% |) F# S: y
return (0);
' j$ l: d7 x" |, `8 Z o
}
& E& w; W( C% Q) B H# [
0 n4 s" k& X Y2 Q$ s
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ m9 j: X8 Y% C( q M1 l
addr = base + cnt; /* pointer arith! */
( N+ v- P$ u' ^, e& L
val = *addr;
4 [; v% ]& U. Z5 F5 N8 i
*addr = save[--i];
6 D- u7 _5 Z. M& |) h9 l
if (val != ~cnt) {
! A0 a& {# y$ O: F
size = cnt * sizeof (long);
T5 W$ e5 F0 w. R2 M6 w
/* Restore the original data before leaving the function.
& b' R4 l6 Y& H% C$ ^
*/
4 A0 w' w& a0 m: t: y X1 Y2 ]; b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 m4 s4 Z* f1 W2 o, c7 \- P
addr = base + cnt;
( e; x; o6 S& k9 b. b! X% ^
*addr = save[--i];
n V8 f! {" P/ u' d
}
6 c2 a: p2 a5 Q) e
return (size);
3 Q. _% x/ _# y) n
}
$ J% e, _, W4 A8 S5 T; @( m
}
$ v) z! W2 j' S' y2 u3 A; M
7 L2 S, Y. I; w3 w- G5 i/ e& u
return (maxsize);
% q( \! v9 @. C7 U3 s
}
8 v/ k& _9 Q' T( K" h+ Q4 o
int dram_init(void)
9 Y: y8 Z; F5 f6 j6 |
{
/ b% G. k6 P% a4 p% @* c
/* dram_init must store complete ramsize in gd->ram_size */
3 R, v* ?' p8 ]5 R: d
gd->ram_size = get_ram_size(
) N a# _0 `+ t" ]: l
(void *)CONFIG_SYS_SDRAM_BASE,
8 o. I2 X* k5 w4 a' G8 z5 M2 L
CONFIG_MAX_RAM_BANK_SIZE);
$ e2 g$ J3 L9 \4 \: h
return 0;
6 B9 ^# j" B$ Q1 L- C$ j% D& _( T
}
& x0 Q6 m* v9 A5 m% ~& v/ M" u9 X
& W; D$ ]& X f/ G; ~
2 h, K! S, z7 o( ^8 t; ^6 ?
" D8 ^8 ^4 c/ U: N# p6 d2 U" l
% V3 F: n0 ] x8 }. U( }2 W) e
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* }! T$ d c, z1 u; N
' Z. ^; n* r7 {, S( p7 |
6 ?" L* w/ f8 Q; D) y
- W/ D" i, ^( t8 y% s% L# k
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4