嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. `, J' m1 o8 e; ^5 H/ R! z- J# @9 d
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: [( h- Z: g8 n0 d# c( D
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) h' I; _2 U" [3 q5 h7 P
. @$ _! ]( T& s! D' N9 I
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; r$ I2 Y6 M. d! V; T% N* T$ ?
; A% a$ T6 C* b1 j
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) G5 M2 p8 v, {& _* x
/*
( c( b! ^; s8 o# k
* Check memory range for valid RAM. A simple memory test determines
% j: F. H5 f, a" L5 ?
* the actually available RAM size between addresses `base' and
7 R8 P7 h% f" F; q. v; [
* `base + maxsize'.
/ P8 Y- q3 ^8 p0 u O0 D1 j! [/ e
*/
1 o; J p% s4 j) H/ J9 D1 P
long get_ram_size(long *base, long maxsize)
2 ~7 l% j4 j+ s" X1 Q: n7 {' P
{
$ n7 y+ q( i& h0 q/ u2 G4 @
volatile long *addr;
1 h5 m$ A: @' V* G" F
long save[32];
- r5 m0 w; d/ p9 r& @
long cnt;
# v7 \! e' U1 k- S: B9 ?
long val;
1 a' |/ v) F0 D' S# X
long size;
0 F6 v( R5 B' ]
int i = 0;
2 m3 ~9 k8 t4 o6 Z1 v
2 O6 ?1 p; |$ d
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 U @7 ?3 F0 P/ l8 r6 B
addr = base + cnt; /* pointer arith! */
' Q4 Y" s8 j* n5 M* N$ X4 Q* E
sync ();
) t$ Z! p$ C7 Q: d
save[i++] = *addr;
+ ^# x; }/ ^3 R
sync ();
1 o7 j3 L) D" t8 `& y1 e2 [- G, t
*addr = ~cnt;
5 @& W6 f5 t: ?" o
}
- C3 K$ f& k G. h* n. O
4 V& Y" i3 Z! _! ?' E
addr = base;
! q _4 h& U5 Q" Z( F4 V$ X
sync ();
. E4 O- j* G) r: L* ]& H0 `* e
save
= *addr;
. |! j; F4 s# o- ^7 H" K+ B
sync ();
5 o% @2 o2 g! k n3 n- {9 X7 Q
*addr = 0;
. K }+ l. C# H* v
5 v. o9 H+ {7 J: }4 ^* d
sync ();
- I" y3 Y! h% w' f
if ((val = *addr) != 0) {
2 r2 A& M" o s# }
/* Restore the original data before leaving the function.
, I, ~! H& u% [# K2 y3 h' S
*/
* w+ C4 @+ Q% Q$ ]+ S
sync ();
3 e' |. }: ? _7 v# _4 }1 z
*addr = save
;
P4 s6 a, d- g$ u7 ^1 @
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: F4 I2 |7 J& q8 `) L
addr = base + cnt;
, p6 g- [/ v0 ^4 T
sync ();
3 D+ v* a9 h8 r" S' Y# P! W& f0 {
*addr = save[--i];
# r$ Y+ q4 y8 Q- ?& D0 F+ b
}
; a6 b8 B K: o
return (0);
$ {$ p1 s" i) N
}
& p3 z2 P, R- c, j
9 o. K* X& Q% f6 R% U# G$ B1 s' K- y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 c: R! Y! v9 C; x+ Y! C# S' E
addr = base + cnt; /* pointer arith! */
. y$ h9 e" E: \- A1 [
val = *addr;
) W; k9 U9 ?; _ f# X. f
*addr = save[--i];
( }) p1 D) J* Q
if (val != ~cnt) {
9 Y& v, j% j1 k# V0 w& {, z0 L
size = cnt * sizeof (long);
: h/ d- ^2 e' u1 G6 s
/* Restore the original data before leaving the function.
( Y4 |* j1 ~; }8 L& v3 _ W% \3 {7 [5 ~
*/
# x4 M5 I5 y$ @9 Y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 c# K' Q! J: ~3 x1 q
addr = base + cnt;
, K+ |. ~0 }3 Q+ Q7 o
*addr = save[--i];
; [2 Z$ Q2 `* T
}
e p! [7 [' i, `( ]; T5 [
return (size);
& M( x# C! K: }9 `& M! l9 m
}
8 A0 _8 N7 I2 q4 ` M) i
}
4 H2 l4 b0 P$ ^* [+ W& i! o# F; Z
7 L1 [$ G# }2 v7 P& [# d' m7 h+ K
return (maxsize);
" O2 [" h/ Q6 a" s
}
6 I" N: y5 O' ?3 Y$ E3 s* I
int dram_init(void)
/ ^7 d0 B" ^# K* ]6 f
{
; r) K. D) F+ S4 w, A! K
/* dram_init must store complete ramsize in gd->ram_size */
/ c L% q: h! L
gd->ram_size = get_ram_size(
( y6 C# f% x" M* Z3 Y
(void *)CONFIG_SYS_SDRAM_BASE,
# e. P# t2 \3 f( E2 Y( \
CONFIG_MAX_RAM_BANK_SIZE);
4 C8 W N/ f- p* L! T9 z
return 0;
' t8 O0 O. O" a8 ^% B
}
1 P" O- R0 t( P9 p" A. R" n0 T
0 f9 }: Y, Y' q! v
; l; l; C4 B3 t: |/ E* [
# g9 c5 P4 D% M* D1 L G& h
- g- J2 t, I- P0 K
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. ~1 `9 z. e! a+ b7 `) X
( T$ t6 B( [# B; G& {) i) ~: C* o0 c
5 k0 Y0 O j- F' ^+ _- {0 M) p
+ S1 N! r6 V( q5 y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4