嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 q- q! t |; x7 Z0 E6 ]" Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 s+ |: `4 L. p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( n4 }" W5 A7 S9 L$ E
& X4 z0 h$ P0 R* F& e
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
9 o; \2 i- @9 f. E4 F3 x ^- O$ {
5 T9 M$ O7 J- r+ a" T! V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: K) v" G$ b8 Q7 |4 W4 P% _
/*
3 h. }; T7 Q1 e
* Check memory range for valid RAM. A simple memory test determines
- q! h* \1 c4 T8 l
* the actually available RAM size between addresses `base' and
6 M- i. R( \% N. K4 ]
* `base + maxsize'.
( o+ a3 ]1 a. Y- i6 J$ v
*/
9 Z2 H/ B& o! v9 f1 q
long get_ram_size(long *base, long maxsize)
0 I5 `4 p9 D# Y
{
( q7 S: V1 C' c l& J+ Z/ M8 W
volatile long *addr;
: }# @, b' f5 \! E( W
long save[32];
" M9 {6 J& P0 E4 y; }
long cnt;
1 t* u: J+ Z! J* x2 v9 h. s6 F
long val;
5 Q. Y0 H9 L) N3 g4 {; M3 B. w
long size;
c5 q6 F4 d# p5 \7 ^& @4 O, {+ I- j; o
int i = 0;
. y) I% C6 b3 J8 r' Q* X
8 S6 z2 z. q8 L6 l4 X1 u
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 n; `: @5 u1 S. I" j
addr = base + cnt; /* pointer arith! */
( \' Z' n5 G z
sync ();
$ Q5 K5 m1 i* S% ~
save[i++] = *addr;
' C" N3 w; e, g6 R8 l3 o# p% }
sync ();
+ I# [5 v. g) Q- U& c
*addr = ~cnt;
9 K/ t3 T, a# {* z6 [) z' O. _
}
" L' T/ a" r4 O& d2 o3 D. p
# M( Y0 ^, A3 U3 |* ^! C9 _6 r
addr = base;
1 u, L( Q/ l2 o3 N o) ?, K+ f; M
sync ();
& Y9 w4 d2 {0 O$ w2 n* g
save
= *addr;
) p6 d/ B. ]5 k6 @
sync ();
5 }' t$ \7 t3 c& e8 _7 X) d
*addr = 0;
. M( G! F8 G2 ~" @1 c* |
, Z& F; q3 g: i4 p
sync ();
3 W) g7 y6 D3 O8 B/ L
if ((val = *addr) != 0) {
9 z" ^- V/ I8 s( `+ Z: b+ S
/* Restore the original data before leaving the function.
+ s. L& _, O/ K r) [+ f- ]! z) x
*/
5 S3 P& \1 I$ w. \5 `5 l, T* S. u
sync ();
8 t m' b# _! g* n5 _
*addr = save
;
6 E' G6 g8 |0 Y. _" F! \; Y# S
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# B: ^! ~( _9 T
addr = base + cnt;
+ z7 I1 ~6 t5 v0 x- m5 U$ Z2 L
sync ();
" n* n) r+ Y! D. j" a
*addr = save[--i];
; h& D8 h/ p x# F5 _) F1 a
}
" m2 [3 {- S2 i% m) F5 ?
return (0);
8 p: e8 |* a1 x* \% Z
}
, W; j9 k3 f9 l* x5 V
; o) K7 h% b6 b1 A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 H q$ l: F* X
addr = base + cnt; /* pointer arith! */
1 U+ S$ q& T& x d% z$ p
val = *addr;
S. n* }: [0 T% E- E, z* n
*addr = save[--i];
) t2 T; E* }8 ~$ M/ e/ @
if (val != ~cnt) {
% ^8 E5 E0 l/ h6 }' u
size = cnt * sizeof (long);
\$ h: A* f$ {
/* Restore the original data before leaving the function.
( I* X- q9 Y$ j7 d- |4 o
*/
" Q0 b3 {+ _( i9 M2 a" j( N& F
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% H0 w2 A2 x' |( v' @
addr = base + cnt;
" w, G9 K9 s! P! N. O1 s2 o( |
*addr = save[--i];
9 f4 i5 ^7 W4 C7 D
}
1 `' T u3 P5 x5 ?
return (size);
O0 T9 l- a* t
}
6 | N5 `$ ]+ U0 }9 P+ ?
}
" s4 \& i4 c: [
2 t6 D1 B4 V+ f7 Y) {% X; V2 Y
return (maxsize);
% ^. |8 {2 k4 U8 O+ y- d, w
}
/ j$ q% h! k1 `" W7 i# {. M
int dram_init(void)
8 i2 o- J& n# N* Q8 M! ~
{
( N" P9 Y2 f1 p/ P) }
/* dram_init must store complete ramsize in gd->ram_size */
, Q# }, c p1 r' i
gd->ram_size = get_ram_size(
, F8 Y- a) M7 ` B
(void *)CONFIG_SYS_SDRAM_BASE,
9 B" T! s9 W) l& ?; i- w
CONFIG_MAX_RAM_BANK_SIZE);
+ \, U. X, }: f4 m; A
return 0;
. ^) ^5 f9 E5 H* B7 A
}
4 Q% z4 J! n) K) V8 N7 k7 ~
5 t8 D- R% z# I9 e, M
: K2 I @, p2 Y6 {1 ?# L, B
% N8 o* v( X C7 ^" j& a) E1 r
: w8 G1 a7 f8 h& t9 W, f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& O- a) v0 c& w
- I" P0 I7 w' f: O/ F" X
3 [/ O& F7 n. ~/ o
f. Z( u) v& _ e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4