嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 \3 e3 \1 S2 f8 B0 ?, [
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 T/ G- k5 Z4 N. u; ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' }! f4 x* A+ I. ?- F; m3 E, ~: p
' z- }; _" X* k" x* z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ u( a4 k7 s& y8 Z* j& Q, C3 _
4 F: k# P, ?$ Z9 ?' F, k9 N+ y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% t u; ^# t2 k& `
/*
8 \0 @0 h; ?7 H: u: n6 C
* Check memory range for valid RAM. A simple memory test determines
; K& K3 B3 \7 j' a7 G9 C2 `
* the actually available RAM size between addresses `base' and
) g% ^# j! T T- @! D
* `base + maxsize'.
; v+ u5 S% l- K4 k6 m- O- G0 k2 H
*/
9 r& U) v6 x% D# O, d
long get_ram_size(long *base, long maxsize)
4 k- h) q+ x( b; J
{
0 o, {& e& |- d6 ?5 S9 g9 q
volatile long *addr;
/ q1 b# P u$ y) J5 e2 I- i7 d, w
long save[32];
$ g# Y/ r& j7 B4 |
long cnt;
6 B- |7 W8 y8 w/ o3 P
long val;
5 q0 P5 D0 K3 c7 z: ?2 d; D6 ?
long size;
0 y1 R5 M/ y1 Y( m; K
int i = 0;
: D/ a S1 j" ]7 M
7 e8 S. U% l2 Z# K* f3 }. c
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% f! c/ a5 `, E$ ~
addr = base + cnt; /* pointer arith! */
' v" u/ H$ t5 e) d
sync ();
' H8 w' ]% i. J. t/ f- w# F6 Y$ R
save[i++] = *addr;
7 I1 ~- V* s* Q
sync ();
9 @2 U7 [& E ]. ]
*addr = ~cnt;
- _0 i/ P8 F+ x5 ?1 }
}
0 O9 K: b* P1 p' P
# O$ U g: l. R3 w T, n
addr = base;
2 ?) T' p* r7 n
sync ();
0 K: d) W/ x4 [
save
= *addr;
, Z, G& W: A8 [4 [, @
sync ();
o0 K+ [* c: J
*addr = 0;
; u) Q: D7 l; W% D9 ~! w% N
8 x; f2 ~6 f o/ ^
sync ();
& r0 S2 w1 y- G
if ((val = *addr) != 0) {
1 D) m+ t$ ~5 B; O7 `
/* Restore the original data before leaving the function.
9 O# c6 m9 Y6 z, u1 L1 |
*/
8 \! e& z/ f4 _7 G
sync ();
0 f7 Q7 `8 ]4 b' H1 @+ ?
*addr = save
;
4 K b5 l# \) p% p& T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% C9 Z2 s. Y7 X$ S1 Q, ]
addr = base + cnt;
: l0 t9 A+ t: s+ M' K0 O. z) u
sync ();
( T2 j* g$ y) ?/ i6 r0 F5 v% y
*addr = save[--i];
) E; r4 D4 n# y1 g
}
8 o6 ~6 H. Y0 i0 J
return (0);
5 f/ c' u" L0 A1 H8 s) q1 o3 T
}
0 U9 M9 V4 P$ V. J" f
7 r, D3 k8 l! L7 Q% S+ B: }; G
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 P, u2 ^6 ~4 \
addr = base + cnt; /* pointer arith! */
8 z$ x0 a7 h8 l* [# u
val = *addr;
$ O4 I- k! {% Z5 ?1 f
*addr = save[--i];
7 `& k3 n) D" N- p$ L* C2 a3 q
if (val != ~cnt) {
/ ~2 [6 j7 L5 G# e
size = cnt * sizeof (long);
# i0 _4 Q5 v/ D$ ?' p' C
/* Restore the original data before leaving the function.
6 {' V; j& P- s7 B% M* W( c
*/
9 @2 X$ H( Z1 C( @% x# b) L3 K
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 l0 |4 U X7 a, g4 H
addr = base + cnt;
. [- A' z; f! X4 f( o
*addr = save[--i];
3 b# O8 R9 U$ r6 k- q, q4 ?! n5 V
}
9 W, `# V& N- Z7 G a. K/ h5 K
return (size);
" K' J4 V, G, n0 F: Y
}
3 d% v- d* l; a2 X( M* b* W$ O. r
}
5 L* t; x. Y% O) M2 X' L
6 [2 k4 l2 R& `
return (maxsize);
2 I" n7 c- O: i. p$ E- l/ N
}
* }0 b0 n) s) E1 l) i- O: D
int dram_init(void)
& _2 }* ?* S6 f8 ^7 ^7 t8 @
{
% |( ^& {- H" t1 L! x
/* dram_init must store complete ramsize in gd->ram_size */
7 |7 S9 t6 f3 G! a# g ~; Q: n) S
gd->ram_size = get_ram_size(
& U: w! Y# e( v8 @: T
(void *)CONFIG_SYS_SDRAM_BASE,
7 H# i+ j$ b/ @# J, j, [9 A
CONFIG_MAX_RAM_BANK_SIZE);
m/ k" i% p7 o% R
return 0;
% n( w) y6 c4 [
}
* |0 ]0 j, N/ n( b# I
G Y. a! ]6 [ v, T7 z4 }
0 P/ \- `; j" b' M" d
1 z/ x/ C4 a/ P6 v, V6 v6 |: A: f
' Z/ P! Y8 b. K+ i7 `$ Q# b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
/ ~+ ^, I' w& R0 T* X
' f. }, C- G6 F
% ], H0 Z; \7 U6 N5 i
1 ?5 N/ r- T" E1 N1 n
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4