嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ C6 a x% d) B% H
核心板2:DDR2 256M Byte NAND FLASH 8G bit
R: g+ d7 T1 N: i/ w5 e3 g% t
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( a& [, ~" B* ~% v0 ]" c
% v n8 I3 |' a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 b5 l) J/ h: e6 W# M5 Q
8 @& r1 i& \6 Q: P
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 X9 a4 o" t! m) [. _" R9 g8 {+ I0 c
/*
2 J1 g9 i1 a/ T7 F b: t) r
* Check memory range for valid RAM. A simple memory test determines
+ v3 o3 ~& g3 ~% x! S& o6 y5 x
* the actually available RAM size between addresses `base' and
* p& z' ^3 N% P5 X* P
* `base + maxsize'.
) Y8 L4 [3 S. m8 X1 |
*/
, c& _7 z7 T2 E7 b* B& A
long get_ram_size(long *base, long maxsize)
& ~, K U" n4 u( o7 q; R1 O
{
$ p& ?4 V; p7 x: I; r, a( e7 w
volatile long *addr;
; }% [& `1 _0 ~+ k; O7 M6 Q* S
long save[32];
^2 I( i4 r1 u% J' \' u: z) H
long cnt;
2 B" C6 R, }2 V1 x
long val;
9 G' I/ N4 k& j- {
long size;
/ s5 z/ D; j! c4 q) r* v2 t( ]) ?
int i = 0;
5 _" E! b: l* W
3 q: l+ p+ a/ A0 j+ w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( n& S6 C: H( {& E7 G [; v
addr = base + cnt; /* pointer arith! */
; ^! J: L# u6 q% M* c3 H* s( Q6 s: x
sync ();
; A# @, G: F/ ]- Q! { F2 M
save[i++] = *addr;
' i1 w# f& L/ M' s, }
sync ();
* _; J) I$ T) y0 M
*addr = ~cnt;
5 f. `% N( W; x1 `& ~- r' {7 K& k
}
& z9 y+ h [ V% a* s. e
. H" w3 |" _% L; A1 |6 [: m6 ]
addr = base;
7 T J$ x$ P5 d' g0 @
sync ();
2 ^" f6 O2 u" Q7 S H2 v
save
= *addr;
" g4 v; x; W3 i5 r1 q$ e
sync ();
2 t0 R5 e) v5 e. m
*addr = 0;
- R/ Z' E& b7 Y5 Y, b
$ x0 x9 R- O4 e- k3 K f) H
sync ();
; z7 A, J% {- q7 N# j8 L( M
if ((val = *addr) != 0) {
( k- R* |& S1 j
/* Restore the original data before leaving the function.
; I3 Z: n0 \* d0 s
*/
7 n( U7 W: H- D$ B' j u
sync ();
. u6 F9 `+ D& t4 c/ V! z+ Y! _
*addr = save
;
: |2 e' W4 L9 h- j% n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* \# X0 _0 c8 Z' j
addr = base + cnt;
3 Y( i$ q2 A# K. h; X
sync ();
% ^! [* Z- g$ M8 B
*addr = save[--i];
3 a, F( M1 k k. }4 l; Q# ~
}
: t9 B; ~+ w. Z# B+ z( d) c5 I
return (0);
# X& C, d9 O$ n; d3 `
}
7 Y9 [$ F4 u" G- B& `; c1 l
( L& c% u) J s7 F1 L6 K# M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: p `2 v% u4 k4 n# T7 t9 B) X$ q
addr = base + cnt; /* pointer arith! */
# x6 l2 F9 p* w8 A) K# V) r
val = *addr;
' o) R7 d. |! t* S j
*addr = save[--i];
1 {# u! Y7 X" h$ x9 r
if (val != ~cnt) {
0 c$ P; ]$ D- x9 F2 x! w/ s4 f2 Q
size = cnt * sizeof (long);
/ n% O7 c1 `" b& g: R7 o4 z1 Y
/* Restore the original data before leaving the function.
# }* j# t: f7 ^0 k9 o
*/
5 O3 {! W# f3 `6 V( S/ H- w
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; x+ Z* Z- v, u5 n8 u3 x
addr = base + cnt;
+ A$ d# U2 D6 s9 h
*addr = save[--i];
- c: c1 R+ _ }7 N2 y# U2 d. B
}
/ {4 X5 b4 u1 _) s, C! l1 O
return (size);
8 E6 o- h6 G* D2 X/ ~9 y
}
7 _0 b: F* l9 o2 ^- t% ^
}
; c6 h* z/ J$ S8 r
# Q6 c$ ?7 S$ |- a! ?/ z4 Y$ N
return (maxsize);
$ g9 o! o3 \! r! H; H
}
% X+ H* f/ B, b: { W
int dram_init(void)
4 a# ]. W! l3 ?# e5 e2 t; b
{
3 z5 o. G8 d0 a1 W' B& I5 P5 h
/* dram_init must store complete ramsize in gd->ram_size */
: x% Y1 f- f* d8 v- v" p) |- }" u a
gd->ram_size = get_ram_size(
' b, F4 g; p, u8 o. q: H
(void *)CONFIG_SYS_SDRAM_BASE,
: @3 v& n+ O$ g; _
CONFIG_MAX_RAM_BANK_SIZE);
0 J$ r$ J2 ^( ^
return 0;
) U7 P+ C8 L+ j0 H! q' I' `
}
6 j2 H/ Q( K( C% _' T
2 u; t% g* j8 h4 N, ?8 P& I
# p( v9 F3 `$ \, f
5 P. J% {. o. f q. o- k x& L6 p
6 e0 h' }$ t7 K- |* `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 e1 Q6 A+ a3 i) w! M- b4 A
! S5 |( h+ I/ I
5 |8 ~- V0 O" I$ Q
2 V' H# [* e9 T$ U% J" [" H
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4