嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
g6 A# s; b4 H% ~5 C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; d4 k5 z" Z7 l% y* d% H
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
S2 U: {# d$ h. [8 G' l
. l0 x3 |3 z- n0 ~2 H' h1 R, G% [ G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& N3 y4 \% B8 d
8 t8 B2 i# D: i' J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ s. P a8 b5 ]2 d: K
/*
2 F. x m& O$ m4 B+ z
* Check memory range for valid RAM. A simple memory test determines
; I+ D: \9 R6 {- c1 l, m
* the actually available RAM size between addresses `base' and
2 k' A5 E7 l0 C, k
* `base + maxsize'.
. G9 A- `+ O6 C' a
*/
3 G5 n! a3 H, B
long get_ram_size(long *base, long maxsize)
3 z- u; T' e7 L& L. v
{
/ u5 T; W0 T( \5 O8 d; K
volatile long *addr;
5 X( x2 a; F* O$ n# }# l
long save[32];
: u: y: Q/ e2 W5 X
long cnt;
; s% `$ ?9 l2 x5 N
long val;
- s- i7 u( |/ m5 `9 Y/ ]
long size;
* F( ^5 Q8 ?8 ^' a) a n' s3 B: \
int i = 0;
. |# K( B5 U- A/ `7 C8 S
# {* C! D7 Z+ W
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" `2 G! n! ^% a. b* g
addr = base + cnt; /* pointer arith! */
8 E2 T0 Q0 l+ a4 y1 n1 N1 y7 U
sync ();
2 h% P7 e; q# I7 Y
save[i++] = *addr;
0 K# a8 ^% U& b% o' ]
sync ();
1 e y) b: }& y9 h7 J+ j
*addr = ~cnt;
. d( O4 V: Y4 ~
}
9 i+ I9 v) ^* v" Y8 k$ d
; K" W! `" ~7 N5 R
addr = base;
~9 k, z1 u. P, Z+ [1 t8 _
sync ();
/ D% k$ J/ Y4 l( _
save
= *addr;
~. H) B" N0 F+ z
sync ();
; C8 l, I* a0 a( f
*addr = 0;
4 x/ T2 z7 s' P" a7 ` C
* v) @( x6 o& q( F* f, `
sync ();
. q+ {5 B! f: y
if ((val = *addr) != 0) {
2 ]$ W, T" ~$ D1 Y8 Q
/* Restore the original data before leaving the function.
1 s+ }& i I* Q; E1 Z7 I' T
*/
" g6 s2 A" w, z* y; I5 S, F& T
sync ();
. M c$ z1 ]2 F
*addr = save
;
1 U) l. I0 p$ I7 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. T2 E3 k7 f7 b4 t0 u# _
addr = base + cnt;
4 K; \1 L+ |5 W; U9 e& c4 m
sync ();
2 P% W1 v/ R% D/ m( [, K& {( w. _
*addr = save[--i];
- {! [6 E' m$ L! V
}
9 K- S y% S) q$ e( L$ f; t4 ?
return (0);
7 C( ? D; ], {; |1 C. L8 t
}
H9 Q; _! ?& U, i0 K, P
0 `6 K' U" I, @5 u8 [+ Z) A% M
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. s) b% G, U% n8 ^
addr = base + cnt; /* pointer arith! */
1 u2 q- L7 C8 C
val = *addr;
% ]1 q) L9 Z3 J/ H* P4 m+ Z9 d. _
*addr = save[--i];
4 R/ l1 e6 f9 e0 h5 p6 M" Z
if (val != ~cnt) {
2 {9 R2 ^6 B {6 L. @
size = cnt * sizeof (long);
9 G, l% s7 ~3 D6 B$ g# ^
/* Restore the original data before leaving the function.
5 K# {8 b$ ]- i& z* g
*/
/ J7 t, U3 \% c) O- p* h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m5 ~ X8 G/ D9 s
addr = base + cnt;
2 Z0 i6 ?, k+ C' k! Y, A" \
*addr = save[--i];
) l2 k8 @! S8 ^2 H
}
& y! F; \ _1 e8 c% H
return (size);
1 b5 D/ a* {% G% ]3 ?$ f: t) P
}
5 P9 Z( e# g! N; N0 R: Y
}
! [( x+ ]( {. s; K
- q8 C1 O, [' G$ G
return (maxsize);
{9 l2 S" S6 ?+ Z
}
. c/ ^7 o+ r, K% z8 E
int dram_init(void)
2 {; ^4 y& p7 @; c
{
. [* ~7 u: B2 u3 Z! e, } U) z
/* dram_init must store complete ramsize in gd->ram_size */
& c' y: P3 W. V0 u& m
gd->ram_size = get_ram_size(
" u9 R3 Q( W Y/ A* b
(void *)CONFIG_SYS_SDRAM_BASE,
2 O8 |& t3 W5 k( e$ |- |2 v6 U4 F
CONFIG_MAX_RAM_BANK_SIZE);
5 [ }1 [4 ?/ y9 q6 F+ m
return 0;
2 A- `( x' y4 j! z
}
: S2 C# s, g% r+ A' l
3 M: a g; t$ v$ Q8 n( D, \* A
5 z! A: `# X+ a z4 r6 c
) N5 |3 a7 j. C3 A; {
6 @6 O+ B( _ K( m
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) o* `' n6 n' e% P- s6 A& d
+ h8 C+ t- Y: u) L
" T. o/ t" g6 x6 j: { Y$ ~9 ^% F8 h x
1 l. C4 q5 l9 J0 s
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4