嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; B$ F( U$ {* U! a- M) |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
5 Z$ [4 T8 X) T* g; H1 _0 P' X
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( r9 d4 A* |3 c
8 k& P/ E0 z7 t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 c9 _# R# v: @
* y$ R. f) B3 @, h. u* Z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" w4 N2 n6 S' O' b
/*
% H2 @7 E! {+ `( K
* Check memory range for valid RAM. A simple memory test determines
& z( M5 ]4 K- L8 A
* the actually available RAM size between addresses `base' and
6 _; Y$ b4 i( E9 h$ k' `
* `base + maxsize'.
3 G% ^: g W* z$ Q2 E8 \0 A1 \
*/
$ P( t* {1 d& X. g8 v8 @
long get_ram_size(long *base, long maxsize)
$ W( {+ F2 w8 {+ Z
{
/ Z% D2 u) j4 d7 {9 j9 B
volatile long *addr;
: ]/ h9 ~6 c F# _" ~
long save[32];
- O% `+ u8 S' c$ v, v( d
long cnt;
. `/ t( E6 R+ v, C' |! K; Y6 X
long val;
, i" L% A$ C3 q/ u) B2 g" ^3 J: W
long size;
- `8 f1 Q2 g. q* v( g
int i = 0;
- @# G( F% u$ l& t3 Z5 }9 W
8 b; {0 i5 |" J' M& w* E6 u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 d* q' G$ U7 }" `) r( r( \
addr = base + cnt; /* pointer arith! */
% }% n; C0 Y" y" _7 T9 l, y7 {" A
sync ();
* S6 `9 M" u: P/ }. w e6 J
save[i++] = *addr;
7 k- q2 }* Q# \" _0 p
sync ();
0 l& J+ K: ~! @* I- Z" I& d4 r
*addr = ~cnt;
2 L( I% U+ o Q
}
' i% J. o) s' i4 T7 B& u
: y. q- z/ O% }; O
addr = base;
4 f+ K5 p4 \2 z- | I
sync ();
7 S [* N) w& p
save
= *addr;
, E7 W: O4 j- q9 b0 j
sync ();
& A$ y5 i6 t( C K) I4 F
*addr = 0;
- w9 J" t: D& k( y! |& s
" ?. R5 u& S& f. ?) T) |
sync ();
* o2 d0 m2 Q' p* O. P
if ((val = *addr) != 0) {
: K$ c, U8 R6 I4 y. g
/* Restore the original data before leaving the function.
, C/ s& \) |4 T0 W8 ^- L2 g
*/
F' c3 v0 X8 K0 l) E
sync ();
! ]8 I, E1 f5 p
*addr = save
;
n6 ?5 }. C$ X* r2 b# o2 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 Q7 x4 [. o$ i9 N3 g: w% O( f
addr = base + cnt;
9 p, [. P+ [4 o3 h3 y. `8 p
sync ();
+ u( h$ p) p2 o
*addr = save[--i];
' Y, ?# X$ b7 ]7 y" b" O+ F1 B4 i$ N
}
5 e5 i7 }9 e+ L2 o: g
return (0);
; a, T& I2 {7 G2 R/ [1 U$ i3 _: _
}
& d/ ?" S5 W" u0 s2 E# F; A
$ _% Y& U+ W4 c; z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 R ^( x" G$ }
addr = base + cnt; /* pointer arith! */
1 L* W8 E0 Y: S
val = *addr;
1 I) I( c4 _! Y: n1 @
*addr = save[--i];
6 k2 I( I% T4 t+ `9 o, W
if (val != ~cnt) {
- w+ C& f* b$ I# w! t
size = cnt * sizeof (long);
% l9 E5 [, \! R, V
/* Restore the original data before leaving the function.
, K, _5 n" n' j) R$ ]1 f t
*/
* y; V# E* t; f" r/ m
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 u; S' r, M1 g
addr = base + cnt;
5 D$ _0 f% a0 R3 Q% Z
*addr = save[--i];
( g4 c1 h' {3 N4 R; z% ~; b* G
}
' w2 X8 v f( H+ i+ k4 W
return (size);
- G% }. M8 K: A! J( e
}
R. G D" \% i- c! K
}
, H P! u5 t; }5 h
, p9 [( ~; n; V
return (maxsize);
+ I2 e# V, N4 o# {8 x3 Q
}
5 B! g( F( _% A' E
int dram_init(void)
8 e& k) d. J+ f" T6 M& k# H+ h
{
7 ]; L9 T- p4 v
/* dram_init must store complete ramsize in gd->ram_size */
* y& f) `$ g, o _! m2 Z- c
gd->ram_size = get_ram_size(
5 W2 ]" q/ \+ ~0 E
(void *)CONFIG_SYS_SDRAM_BASE,
2 V/ H* u O/ @7 h J# k& w: w" k
CONFIG_MAX_RAM_BANK_SIZE);
' q( `" }5 l4 s9 p8 K8 i
return 0;
' v1 I: H7 f! s1 \/ \
}
: ] A7 M2 b# c0 L
. u) S& l2 f1 k; O1 U5 f6 v) Q2 D
. e' X, o- ^( s4 L; f2 s: k. B
! {8 ?3 z3 ]/ _8 b0 L, i* r% y
9 z' f3 Y) O I, V, n2 k# Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 l* ]( F9 H! [; J6 L! R, I
' K' V4 j; v, e
" l8 ~8 @' Q0 F6 L' _5 ?
' q+ m. r% W2 g* O; C2 v
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4