嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 `6 |1 s0 n$ N7 o# X
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( T& d1 u+ m! n$ ?% y2 y, N. ]
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 D" `7 z$ b' N" ~
6 s0 D* O) [' T2 I+ S+ `! V/ R6 x' a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: M+ a& g6 F+ l* v# Z9 F% y5 B; P1 y
* E, A* Z; v; x4 z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# O' E6 Q9 G5 [% ]1 d J) v$ o2 s S. v
/*
+ n2 a$ D9 c" f% ?2 T j% z* V
* Check memory range for valid RAM. A simple memory test determines
! S. j) k- L+ J3 w$ X* E
* the actually available RAM size between addresses `base' and
2 z/ f9 ?: T& e" }1 `" p7 x
* `base + maxsize'.
& Y# k$ p& t8 ~) l( t
*/
; j" @5 [1 g+ S! p
long get_ram_size(long *base, long maxsize)
8 {+ B; Y( V8 k
{
6 n a3 N1 ]% W" f9 ?+ y
volatile long *addr;
, `/ b8 t2 E: Q) H% c
long save[32];
5 y/ q2 A, o/ a. W) d+ S# b m
long cnt;
1 o1 b7 u* K: J! t# A, X: t
long val;
3 c/ T; E0 A1 F+ O0 D9 U9 g
long size;
: E0 Y* x8 T: T" Q- B( b
int i = 0;
) D* X9 }7 |1 r# U4 f
; J7 Y9 h& D8 i5 x
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% s9 b% w" ^3 Q3 i) C; X
addr = base + cnt; /* pointer arith! */
& `6 }( @( `* q7 S( i
sync ();
6 n0 v' g" I; h" ?# C1 p$ e5 U
save[i++] = *addr;
& Q% ^% b1 C9 P. A4 Q
sync ();
e# K; y0 v* L j7 M3 ?
*addr = ~cnt;
$ A$ i0 V% D; H
}
5 a4 O1 x c7 O1 E, c' ^9 r
% D* e/ R& y% `& A F+ ~) y. G' n
addr = base;
! a H! i1 v- s
sync ();
; s! U" d) a: a
save
= *addr;
( e( ^* ?0 c; g+ ^' p: e9 H
sync ();
; }- g( F) ?: [" T! F
*addr = 0;
L. ~# X( p) M2 K
S- p. T$ g( ]
sync ();
- L5 o4 B7 h4 [% w6 e# C `
if ((val = *addr) != 0) {
) ] L: ~. e! ]6 g) h
/* Restore the original data before leaving the function.
+ Q7 ?. }. |* j% M9 V3 @- m
*/
. J( f4 L5 O9 q) U$ `& c
sync ();
, P7 D, ^+ A0 H1 q1 f' p/ x2 Z3 G
*addr = save
;
" v/ ?5 T0 V4 f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* [* p. r) ^& H: _, M; d5 E
addr = base + cnt;
- ^% ]9 I. U$ G, K( {3 V1 R' V; W
sync ();
1 s8 `& S- l5 ]* r5 }- Z: B
*addr = save[--i];
7 b# Z, h$ B8 M" a( r
}
/ l- ~. L) L4 l! D1 {
return (0);
, t! a `$ b2 v8 Z5 x
}
4 f/ q, k: P8 E# `- |
( N1 i% z! {1 w" p# ]& O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) f3 X s; B6 t0 K
addr = base + cnt; /* pointer arith! */
2 H: B {. ^/ B8 h, \1 X& I
val = *addr;
2 H! @, c- y0 L: M
*addr = save[--i];
+ F+ e7 A% P# f7 }5 C7 v
if (val != ~cnt) {
4 D' V3 G' I" B+ k f& ]7 F
size = cnt * sizeof (long);
7 Q7 z7 Z) D2 w
/* Restore the original data before leaving the function.
1 ~6 L2 N( v" M4 [
*/
; n2 d8 m1 t, s* k4 _
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 M! P) T# Q! h
addr = base + cnt;
7 g2 B+ x7 B4 H1 T, {+ P
*addr = save[--i];
a& ^9 q3 p* h! G6 F
}
4 w% i# r# m3 L! o, m5 Z( U
return (size);
8 U6 L2 D! t7 r! ~$ b) E, b
}
; c0 }9 N) E5 U, c
}
7 \; g2 u# ?" j
# R5 R5 C9 w# Z9 Y' L* k
return (maxsize);
/ z& r7 j* O$ |1 I( e- t4 y) k
}
% `& w5 t& }0 a# |4 @( K) g
int dram_init(void)
* W$ n) r8 C' `/ i- w1 q: T
{
[% J/ B: a, L5 x; T
/* dram_init must store complete ramsize in gd->ram_size */
0 _) I8 A" |3 n9 ?3 M6 d5 I
gd->ram_size = get_ram_size(
) @8 |2 W5 d( b% L. d
(void *)CONFIG_SYS_SDRAM_BASE,
; _# S+ Q; C! C" W
CONFIG_MAX_RAM_BANK_SIZE);
: X* q9 Q$ u1 q+ X: o. t9 f/ E% L
return 0;
3 o0 q5 e( L8 J2 W9 |& \
}
( n- K) f3 Z) z0 H: H! Y! \3 c! k
! m! R3 z+ ^# @$ G" I _( s/ n
8 D# z) A) T3 N1 I3 m
! i: B) o) `0 w' r
7 d! E* J( z, h- W6 p. [0 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. r& S# \' i- O; b4 W
4 o p# w9 W7 P! C# L: }
: h; ]! w% \" n
( x/ [1 J- _8 m' p4 K6 c- [& O8 ]
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4