嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ Q/ F( H9 t, M; c( q3 s% S8 ^2 y
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 a7 u' y# U# c1 o8 o
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 s* _. H4 K, ?, r8 f
, T% q& {2 T- p V4 P3 G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( `& V7 [4 J* @! ?, y
) d% v) F1 M$ y2 {4 V' [% c; n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" R3 C. u0 c/ A5 O. \; a- p
/*
& p( X1 w) A3 ^; w+ j0 K
* Check memory range for valid RAM. A simple memory test determines
9 e! w: g5 l7 S8 I
* the actually available RAM size between addresses `base' and
/ _0 m. {& B: x
* `base + maxsize'.
" I& t: @. U) t6 W- }3 f
*/
* ]( ?0 B' H5 k2 I) x/ L" S( @
long get_ram_size(long *base, long maxsize)
0 U4 c/ l2 _7 ?. O2 [' l% i
{
7 J2 u, h2 E6 W
volatile long *addr;
1 V+ r' |! H3 Z1 y; u# n. j3 i& y+ k
long save[32];
( F* W: K* x) S; s$ S: T+ T
long cnt;
: w: U) V$ u; @/ K- @% w
long val;
4 O0 p+ |1 b8 i4 e) }. [
long size;
* E' z3 e0 t0 I \1 [! W- P7 G1 h
int i = 0;
7 n' K- p) Q' Q7 M0 c9 I6 o
$ l6 W6 N1 B" q [9 I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, V2 U, \! u) K7 I4 w* m, n) Z" ~. w$ X
addr = base + cnt; /* pointer arith! */
, v' F: v. r4 z" ^( Q4 c; @
sync ();
N( Y0 r7 }: h# @" M# }
save[i++] = *addr;
4 Z" t; n s$ |, p; t5 e
sync ();
0 ?! U5 M" E f: p+ v
*addr = ~cnt;
, m0 ~9 v4 x5 k; Y" ~+ B
}
! ?/ \; z C! Q9 d. q$ T
2 m! x$ Z0 J! c
addr = base;
. r) A! p; f+ O. u* j
sync ();
9 \8 D! O7 O D$ H0 r# N# s
save
= *addr;
& W6 m2 s$ m. G- w/ O/ d
sync ();
# Q3 r( Q% C8 z b
*addr = 0;
* R; H' f! {& b. L: n, u
5 h5 k- d( k+ f* P7 A
sync ();
0 N/ l8 |" [8 T8 X9 B9 l3 ]" {4 j1 @
if ((val = *addr) != 0) {
% s9 \) f8 c. j' @
/* Restore the original data before leaving the function.
; V( V) W9 l$ V- h3 ]1 z8 y0 C4 j
*/
3 a! U k! F+ }5 {+ b$ v" L
sync ();
6 K- k: v- ]% S
*addr = save
;
) B" G/ e" N5 R' ]% X
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; ]9 ?, q+ P/ i+ V6 ^, n
addr = base + cnt;
3 Z! ^* L" g: g6 g) m" c; [
sync ();
$ z1 j8 R' S/ W& L( e
*addr = save[--i];
5 j/ t. a2 _( h v
}
- m, X$ Q) `( y2 ~. l; ?
return (0);
3 L. L% G) k& w6 @
}
& F. m% C# ^ Q/ v& s7 D
) J' _ p$ l0 M- h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* g3 `$ s+ L/ l2 y Y+ u7 Z {/ e5 m. p
addr = base + cnt; /* pointer arith! */
# E# H1 M1 E' f- `. N; `
val = *addr;
/ `) w1 C5 _3 C
*addr = save[--i];
' |' V; e& N: Y1 u( @) w P
if (val != ~cnt) {
: L6 a' p7 b5 L3 v8 c
size = cnt * sizeof (long);
- ^8 w9 t2 h" P0 z$ |) F5 S# _
/* Restore the original data before leaving the function.
" m+ Q6 T0 p' m# v. ^" @ V8 Y8 Q0 Y
*/
1 I/ S8 C$ F, O* o! ~3 ?
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ {' ?4 D6 m( b; [! t$ v0 w
addr = base + cnt;
% y. X. y* B. ~8 \3 D
*addr = save[--i];
- `/ l, I- I' D% T3 V. v# f
}
, m3 M) F9 X( t- r
return (size);
% n. U* Z! W% B& P
}
( V6 b/ ]' @1 G/ h" j
}
3 _" o6 a$ o# B" H1 h
: c* V; |7 q5 i8 L4 P
return (maxsize);
8 U; e, O( \' t; b1 w7 t; e! `: G
}
4 X; B0 m3 R9 h( i
int dram_init(void)
0 @' S x# o# W
{
4 D3 {! L7 z. }8 v
/* dram_init must store complete ramsize in gd->ram_size */
7 |0 a4 z' I5 v( i1 `
gd->ram_size = get_ram_size(
' J" a/ r' d% V
(void *)CONFIG_SYS_SDRAM_BASE,
: r5 g8 }7 X! C$ O0 M3 O
CONFIG_MAX_RAM_BANK_SIZE);
5 x# ~- N; g) B# d* u4 e% R" e5 r* R
return 0;
7 O) [# p2 {- A6 e) u% x
}
1 k( X1 U) ^6 b8 s% q- I4 ^
; A. ^, V4 E; |" ?. S
# y4 C8 U7 u7 |( Z# Q
9 F, f$ ]6 K! w3 @/ f
1 H8 G6 |. O- G6 Q2 k! H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 O3 f6 N, D; v6 g1 {9 |
7 a, L2 Q7 E8 h! R' G
6 Y4 q& ^. C. Y$ p+ r }/ f0 i
; | m5 m; G6 E4 k' F9 _4 A+ G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4