嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* m. b* M4 O# z% g4 o/ ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 R, K4 i* Q2 U& w3 \; }( ]) E5 u4 y
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 K8 \4 |1 d, Q2 [1 I) t
6 Q6 I' [- P" L3 N" N- X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* A. F2 l A4 s: T- H, r
9 C0 j; d l4 ~" [8 j7 ~
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" g: j) t( o8 T
/*
; c6 }3 X' y$ o9 b
* Check memory range for valid RAM. A simple memory test determines
# A: L1 j1 b H
* the actually available RAM size between addresses `base' and
' i! G+ L$ i8 O( d2 p
* `base + maxsize'.
# V* _& ]# E/ z
*/
& Q$ ?+ f) Y) h# q# V) E8 T
long get_ram_size(long *base, long maxsize)
4 W1 k7 c! S; C3 W
{
0 v1 F7 a5 E4 ]
volatile long *addr;
5 v$ I- {' i( p' k+ s
long save[32];
5 y4 T1 w0 s* F; e- ~8 k: I, ^3 c
long cnt;
p$ e7 E6 h! _8 W. ?5 b. t, Z
long val;
# n3 X# K! `- I4 w$ ?8 V8 m
long size;
% a/ t, c! w0 b- e* W
int i = 0;
1 P1 K* w' o8 [5 ?6 G6 ~# I% \
1 r0 E0 a! k4 }2 \# _7 D4 E- ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
( O9 Q, j$ H! O$ B
addr = base + cnt; /* pointer arith! */
4 X) a Y9 \ S, \
sync ();
- U( N% y; m1 b: ^ Q
save[i++] = *addr;
( x7 z% T) ~- y- Y9 O' y5 E4 }5 b
sync ();
1 x4 S& I7 O7 j! J: U' E
*addr = ~cnt;
+ C d. \1 L: L# U& y7 m1 `
}
: k+ Y# s% D. M( @3 G2 q, U
% F4 O( W& z2 a9 q5 ?: O2 V' @
addr = base;
; P' U8 E4 g) |3 N. K" \! W* i
sync ();
! z9 I- a* ?! ^! M1 E, i
save
= *addr;
. q9 Z! e) Z) x) c- [
sync ();
( r0 n& S+ K0 r* r) o
*addr = 0;
5 d$ r# d* i: b3 v+ i# j' p
7 o1 ]9 ?- I2 I) v3 c; b
sync ();
5 u/ r" A; t0 E1 i
if ((val = *addr) != 0) {
8 S. b0 s+ c. k" U& L1 e
/* Restore the original data before leaving the function.
, H' t- ^: X% O$ a
*/
/ m J" |4 F5 `$ T" ]! M
sync ();
X+ o$ s; m% q# z; D3 w8 g
*addr = save
;
( A# V+ c9 ^+ E0 o; @5 t3 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; L4 a8 _$ f+ m! y) k5 y2 E
addr = base + cnt;
: l8 `8 }" J; |8 S
sync ();
( {+ |) @5 G7 I& V7 U0 k3 n2 h$ `
*addr = save[--i];
. g3 C6 ?: b4 x; Z
}
" {- M9 O- r# h, m+ p. O
return (0);
5 n5 K: z* Y& B+ {+ L* G9 @3 v' v
}
1 D' G2 I( r# V" ?7 C. E9 v
/ v8 K" X7 k# ~0 }( f
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 z% u" Z5 F+ [3 G/ o$ M
addr = base + cnt; /* pointer arith! */
/ }- I, ]5 T) F$ `
val = *addr;
1 a5 d# I( Q L# P$ C% n8 K3 ^
*addr = save[--i];
" c" `* Z3 F4 [
if (val != ~cnt) {
. R( g6 U0 J" C# V9 p( r
size = cnt * sizeof (long);
8 k4 Z3 W* N, l6 }1 \* m
/* Restore the original data before leaving the function.
" U Y# x; M( f- v) I
*/
, g- n$ \) |3 x6 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
2 ?# t" w6 {! Z# t
addr = base + cnt;
: o: ]7 ^" U! l5 D! R/ J
*addr = save[--i];
- H1 j) I! ~: V! ~# Q3 d# z" \% V
}
* |7 P1 @) h+ U2 y
return (size);
# `7 f) Y) r3 V$ Z
}
; Z9 a/ b$ j* x, t- m i$ K
}
1 c1 @3 ^$ Z( H6 |8 S4 ]
( V4 }# ?0 n' r6 [" Z |4 Y0 r }
return (maxsize);
* H- E+ [- Y" ]; [
}
0 p) @2 B1 z2 J* v
int dram_init(void)
2 s2 u- ^% m" h& v- X0 N
{
( A+ U0 H- S; W% D1 T
/* dram_init must store complete ramsize in gd->ram_size */
4 z7 a! y8 X+ D( z% p+ D
gd->ram_size = get_ram_size(
; s4 G! z4 \0 V7 r4 Z s, H( |; X
(void *)CONFIG_SYS_SDRAM_BASE,
+ s7 X+ W# x9 Y" r: p5 O; d
CONFIG_MAX_RAM_BANK_SIZE);
& ]3 h2 S" k K2 D
return 0;
- z- \! c F) W1 n: l
}
4 h6 ^2 j' h/ y! H( ^* ?
; b8 }! m; K% i& s6 L: E
, u8 {7 e# H! ^; o) P; k& c
V, I i+ _$ X$ D8 \# l
5 k) a# p5 H8 n) w' q7 E
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
* g" I0 e( u4 R# d! v( T
; h6 |9 i8 N% ~' }9 \) D3 t
: X) T5 b1 q3 [$ Z$ Q
; f6 N1 p8 O! U1 ?, f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4