嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ J/ B4 t2 }! C, k E9 K+ B* i. T
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ _0 X5 p0 v! x' e7 {
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: X4 Z# R4 S4 u5 C: b
- m( A" c+ z) D/ X$ a5 y, h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 X0 p! X+ D' ]% q+ e3 `
- s% X4 c( o) h( `0 V9 |# X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
d6 J7 r$ p) Z& t
/*
* g: w1 T4 t: x# `) Z: U$ ^! Z K7 R
* Check memory range for valid RAM. A simple memory test determines
4 I: a ~( \8 k6 A- C
* the actually available RAM size between addresses `base' and
- _2 ~2 g$ _. {* W
* `base + maxsize'.
" M) g( _( ]' i
*/
8 l4 M- _7 x, X, `: j) B; [1 A6 w
long get_ram_size(long *base, long maxsize)
9 {" {3 h' s7 g. t0 K$ d7 H# D
{
/ F2 I- A' s! A6 T v3 A2 ?
volatile long *addr;
2 j( i! S( g; F
long save[32];
0 \( z+ @. Z# i% s: K3 e
long cnt;
. |* ]6 N% @' Q
long val;
; `, t$ e; ~- p+ K! c
long size;
: f; A, _5 H& D+ c. s2 M2 ~
int i = 0;
' z8 M; j( \) b+ S; a6 O- Q
) k" g) B, B) k/ R7 ?) \
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) O/ C A1 i$ n8 D8 {2 [* r: O
addr = base + cnt; /* pointer arith! */
; D! r) C H& p3 a. ?+ q5 s r
sync ();
9 A' I: i. L- I2 S% y: [
save[i++] = *addr;
5 f9 m9 x$ M7 m$ m9 L7 d
sync ();
" d( U2 I8 X+ N* t8 I" _4 G3 I( c
*addr = ~cnt;
# \% q# h, c6 g: ?/ }
}
6 Q/ e4 k3 ~$ @4 {
7 n: h9 x x0 g- w4 {
addr = base;
9 w# g$ w8 m- h7 h* b! Z/ ^% v% W$ _
sync ();
5 D; I6 n1 [) F; Z
save
= *addr;
6 K$ ^& o" L% q- \( d
sync ();
& L2 s8 `9 m) w1 w1 F; F( S
*addr = 0;
/ }/ ~- H5 w8 @/ p
% }% ?, n5 u& N2 W6 `2 I
sync ();
v: }7 Y4 \2 S; a
if ((val = *addr) != 0) {
( M+ n2 L9 p6 _" W! d4 \
/* Restore the original data before leaving the function.
1 `7 f' z% J, b5 L' I4 U2 A: h
*/
. G# W0 X, r0 @( E3 U4 c* h& D
sync ();
" i1 ]( l, c0 o6 z6 b
*addr = save
;
1 c) U/ B. _ s# c0 c1 L3 t
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 T7 e1 t& N5 U9 f$ r `
addr = base + cnt;
& b0 \$ b* Y4 `, f
sync ();
6 ]8 G+ j( Z Q7 o7 [6 U: F4 M: E1 ^
*addr = save[--i];
/ F4 ^5 D+ Q1 l- k8 F' t
}
! u* v& [: K! n( Q9 e' {
return (0);
- R# T8 L- \" E# ]( t/ {. w' ~
}
0 Y* Y" Z( m- j7 }
1 I3 g8 X* k( G1 |5 d1 \
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- J+ F/ l( `4 n' ]7 |% _
addr = base + cnt; /* pointer arith! */
3 {; A8 d( G! ^1 q/ k7 V% H( {7 J( A" _4 k
val = *addr;
) w" A1 ~2 y" u5 A8 C! y, o
*addr = save[--i];
& D% e; i7 @2 e2 @1 Q
if (val != ~cnt) {
$ F" W3 V. Y" ~4 ^+ g% P1 x
size = cnt * sizeof (long);
& _) c# f. k# E( {, G! C: T8 C/ ~
/* Restore the original data before leaving the function.
' n7 [+ V0 w: r$ U
*/
! S8 i( ~/ B) [" k9 R$ J. L1 p. O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ x4 n. z0 A0 e: _
addr = base + cnt;
. \/ e4 D* s9 p- H
*addr = save[--i];
1 Q0 ]) }! m9 \0 E4 j/ b$ |
}
+ @; J6 H5 p- P$ H9 t/ e
return (size);
7 G( l: e' t7 Z0 Q( W/ `* {) v+ m
}
f+ I# L9 Q0 p( Q; i
}
5 q3 e, K, x1 Z8 V: h2 B# R
3 n" F! Y# x) p l
return (maxsize);
$ h" k2 F0 Q& `
}
" e# G" [' X2 V. {1 `" l
int dram_init(void)
% ]8 ~6 c, ] _0 ], h/ N x
{
; l7 x. ~1 Q, S- n) i2 X
/* dram_init must store complete ramsize in gd->ram_size */
. t! G) B& U4 {0 r5 m$ W
gd->ram_size = get_ram_size(
3 f& ]+ Q& L; A, e! j
(void *)CONFIG_SYS_SDRAM_BASE,
- z4 W- C( H4 ]8 Q$ w; c
CONFIG_MAX_RAM_BANK_SIZE);
v: w( ~! ?' ~) t
return 0;
; u5 L9 q* f, t# N
}
: E$ B, j% g- l& I4 {
- v2 v5 ^- ^% c: c4 _8 ]* c
. n. M3 G2 y/ \- r1 _
( @+ ?: l# P1 }
$ [1 h9 V) b3 W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
8 ^$ K' c% k3 M6 y
( J; d7 I# l( ~* e
4 y% z7 ]" J$ e. _9 y; Z0 h1 K& o
1 G/ e! w. | s$ O' R8 c# G
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4