嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
w9 B4 d. _* I4 ~/ M
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ T" x4 {* ?; C2 Q7 h5 w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- E5 y& V& X6 A( d" c8 k& `$ `4 J
2 d# w7 ?! B/ H0 y5 M5 q) A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ ]2 m, u, D& f, l/ k; \% M9 T% |
# O( @7 W* x0 A; Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
) w0 w% S0 u* y8 m6 k3 R* q) b
/*
9 ]2 W" M% O7 Z4 x
* Check memory range for valid RAM. A simple memory test determines
' t6 O2 L: w* ^* T* t1 [
* the actually available RAM size between addresses `base' and
% x' k! H+ ?0 X+ h0 `+ H7 b
* `base + maxsize'.
- D9 ^/ d9 b0 J3 @2 s' A* C
*/
4 {6 A" J V: k
long get_ram_size(long *base, long maxsize)
; X2 E `$ J8 D& v' t4 A, B
{
/ P4 t( ]! J) V$ o' L! P
volatile long *addr;
% l; u& A: S, c1 g& ~( D9 Y" u( k
long save[32];
! y' `4 B7 S. x" A0 m4 d
long cnt;
! ^! B; C- `! @7 K2 Z. m) D
long val;
% E& H: g* n) P _( T7 v
long size;
8 [/ K: Q! ^7 x, D5 M/ K% G, s! @ L
int i = 0;
& S; ~+ y% ?7 p
9 D# Y) m u, ?- |; u/ ^6 I
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" }# u: E+ m; J) a
addr = base + cnt; /* pointer arith! */
2 A8 R% H& L5 b# |1 n/ y; Z
sync ();
9 m0 Q) O2 D! P+ U1 t8 }
save[i++] = *addr;
' Z; v8 m- y# a4 z0 c/ W% S" Q Y
sync ();
! G8 U9 n+ D6 Y, O
*addr = ~cnt;
4 v4 W7 @) P7 E
}
/ z" \0 k) I1 Q' A5 q& }
0 M& V7 _8 Y0 J+ q5 Q% o
addr = base;
* E% [% o; T6 o7 N% D
sync ();
( z: t1 }- |1 o9 Z: z) L5 D
save
= *addr;
( h3 n7 Y$ f7 r8 m+ @+ \
sync ();
6 d, j* ^2 G v
*addr = 0;
$ T! Q$ Z: ]0 t: C6 B
4 l# P# Y/ k7 I( |3 {
sync ();
+ ]' }' S' g6 K6 K ?3 L% m; \( Q
if ((val = *addr) != 0) {
5 l5 k; A P& M' Z: _, r
/* Restore the original data before leaving the function.
% z% ]1 x% {. X' a. k* d2 C
*/
( U1 A$ I0 G3 ?) V& Z( V
sync ();
& V0 K u& q* m! h( d$ _
*addr = save
;
0 p% O/ i4 \( e
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* J* |3 @; e2 l- G. B" S M
addr = base + cnt;
' |- T" D1 ^9 C; m
sync ();
8 [0 ^; F: E; }+ G( p
*addr = save[--i];
. W( f4 z: _3 ]* n3 B
}
8 Z/ R% }' [5 z1 @; `
return (0);
* t& S! D- G, e% x% c" n1 x
}
& Y0 j% L [# r: ?
( }9 j$ A" ^2 V$ f" b2 b, x
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, k x/ X( z4 Q0 M1 R0 s) n
addr = base + cnt; /* pointer arith! */
6 O8 |% C0 a% V: p' Z, R8 h) G
val = *addr;
; l/ u6 x, B0 w, W; E% ^
*addr = save[--i];
& }- l1 u; _4 z
if (val != ~cnt) {
9 M, w2 {: Q' U6 S* w9 |& m
size = cnt * sizeof (long);
' K- m% q0 z0 ^; K* e
/* Restore the original data before leaving the function.
: c: U( ~6 d& o: }& ?. f g
*/
' B6 f6 Q; q- N+ f: v1 ~
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' p1 a7 f, g, n1 }! [
addr = base + cnt;
/ A4 P, c6 t% r/ s0 N7 C! r
*addr = save[--i];
' ]: s3 z; u/ q7 x- Q; ^
}
- Z( K ?- A, A$ [7 e2 `
return (size);
8 S1 a6 X+ v D# {) n7 `
}
$ z" I7 g' p: f
}
+ d1 w3 ^. e; T+ K
' A) |# p" U$ m: }* b% F" S7 n
return (maxsize);
# z6 m* e4 E1 i) a" g6 P
}
" z' y4 O9 X+ z/ k
int dram_init(void)
6 J5 c! X) X8 ?0 h7 W2 [
{
7 @6 [0 N2 m8 ] K
/* dram_init must store complete ramsize in gd->ram_size */
: Z9 ?6 l( w n { w
gd->ram_size = get_ram_size(
& H* }4 u+ b S, g" C# `& X' L3 F
(void *)CONFIG_SYS_SDRAM_BASE,
$ C9 ~& o+ ~' o: n' Y' o/ s
CONFIG_MAX_RAM_BANK_SIZE);
% }* @" A' `7 D
return 0;
: s( p h% G* H9 O; w/ I
}
# [8 A5 s$ A! W7 [( V2 R- t/ L/ q
" f& ]0 c Q' o3 B. T4 s
- F, @' s( b3 ~8 ~$ y$ h: ^
/ e3 a1 g! E' J& A7 p4 x; o! f
, h% W( q$ a9 L; I* ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
! V; r$ I' w- ?9 N7 `; p
. p8 f3 i& C& z: r g7 K4 |) _: H
, F5 h, }, K% o0 C# y1 h
. G' J' C6 K# c, m B$ r
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4