嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
+ F. t) l% h4 }6 ?$ u9 d& Q
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 P9 i+ m; t) X( P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% ]% j$ t2 r' O9 H
1 B" K6 u0 X' r2 ^! [) `
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
, @2 S3 Q& O. T4 _9 {; T
% U7 u! l2 L4 z/ z: y8 t
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 v5 A( G3 J" }
/*
5 D; S6 c# X: m, i, c" b7 B
* Check memory range for valid RAM. A simple memory test determines
* J9 g8 c) {6 E( G+ t. e
* the actually available RAM size between addresses `base' and
; O: o4 q6 X4 S
* `base + maxsize'.
" Q6 Z1 ~& q3 E) Z: s3 I
*/
1 x! V* K) N1 {
long get_ram_size(long *base, long maxsize)
3 Q8 b% i1 o3 H) A# v, M* ]
{
, X& Z; b. r! Q9 h& ?
volatile long *addr;
- L& e1 e$ f/ x7 Q* M
long save[32];
, _3 i: b( o% M1 a5 v0 A
long cnt;
5 }$ R7 L. d& P+ f" I% H
long val;
7 s1 } N& `( l
long size;
/ D& ]6 w, N# U3 P
int i = 0;
# e0 d" E1 i1 T1 m4 ^" l9 ]* z! X
" q8 @* J; k; i6 L3 } v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 }# R3 T0 K4 i
addr = base + cnt; /* pointer arith! */
D% z/ j4 g* s# x4 H4 F
sync ();
% a) L: l- Y( A3 I
save[i++] = *addr;
+ P8 J+ n/ r; U3 v ?
sync ();
/ C3 u5 [9 h4 N' C$ }
*addr = ~cnt;
& f$ Y. n1 x9 _ N V
}
2 m5 G. F( f2 G* I* ~ x/ `5 ^; K6 ~8 b
0 S ~& {4 s a( o3 z
addr = base;
; q0 [' @+ j& D3 F; t$ _) E* }) B
sync ();
9 [; j* S Q* H0 \& F6 {9 n
save
= *addr;
8 A% A( M- u6 j9 C. J- w
sync ();
' l$ e) f4 B' \
*addr = 0;
4 ^& k- Z5 V0 W+ ~
3 l/ p, |- C+ f. Z& F& Q
sync ();
5 b' I& g& [8 `! o7 L
if ((val = *addr) != 0) {
' h& x, K& K' R
/* Restore the original data before leaving the function.
2 v0 j/ [4 x' U* [
*/
8 @+ t! D4 L$ I( Y7 |+ V
sync ();
6 H1 N$ k5 G P- {/ }; f! y( E0 |- X0 `5 L
*addr = save
;
9 U6 t6 X0 s1 p* N7 I
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' M" k; ~% R( P* {
addr = base + cnt;
) _/ ?! z" V I/ Q
sync ();
9 R; I; g7 R( ~) w0 U: S) D
*addr = save[--i];
9 w( H" W# y' v- K
}
3 K% G# S5 b% t/ D4 E7 h
return (0);
$ |7 h$ d1 }* N7 r
}
( Y0 N8 e. G5 B
Q$ q% G% a5 S+ c- U2 R+ W
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ g$ S7 L. ^. h; d( e- M
addr = base + cnt; /* pointer arith! */
9 V) g$ n6 m5 s
val = *addr;
- i" G5 \5 r3 ?" b) S6 N% _; T4 n
*addr = save[--i];
( j1 u" B0 r5 e
if (val != ~cnt) {
9 }9 Y: a+ q+ c4 c
size = cnt * sizeof (long);
$ b$ ^3 l& `! _- q
/* Restore the original data before leaving the function.
5 f7 N& @& Z. j! P0 E; f+ W
*/
1 ~( g) G' k4 q1 x/ e5 v5 G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ Q; }( \% i- a+ o' h
addr = base + cnt;
. `/ D$ b( Z1 D
*addr = save[--i];
7 |. s, e1 A4 h5 Z0 j3 T
}
6 E$ y3 E5 V9 n7 j
return (size);
, p& I) D; Q. e1 U6 Y7 W0 {
}
$ W r& T- O0 e. b
}
, u" A' z3 L) Y& R3 y7 p
! A% ]. j( A- @/ q
return (maxsize);
0 b! \; e# `0 S' O; {
}
2 _" O e+ H! `! t% g: w
int dram_init(void)
4 I# q2 U% v2 S
{
6 @- [7 w: p6 b9 q
/* dram_init must store complete ramsize in gd->ram_size */
6 N& p4 f% c, H; Y
gd->ram_size = get_ram_size(
0 l# S- g' v3 Z- ^6 {. Z7 J* k$ H
(void *)CONFIG_SYS_SDRAM_BASE,
% _* I5 v# S. a* g0 F# ^1 h7 [' V
CONFIG_MAX_RAM_BANK_SIZE);
) X' s( ?; L3 @+ f
return 0;
+ R0 g- U* w/ r) Q' }
}
1 A9 b- @( X: S
) g2 ?5 ?8 u7 Q/ S# j: K
, T; q f+ c D$ q/ f' p
: `# o* D. D/ G
" L% _6 ?" x! O* M8 g0 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! U6 E# I- d. p) H3 L! J: H, O
7 j. J0 F. `4 f1 L( M" d% L$ T Y
$ v" E: i8 Q4 @
2 `+ h" S9 N. ^) f
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4