嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
! {! x8 K- |9 O7 O+ W p6 w& ~
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 z* w) U, X8 q; G |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) l- Z0 A5 D) H" d% ~
0 t, i$ A% N' L) e, [! `& c" ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 f3 V' x C( Y/ Z' `
( v& Z9 u; b* U, _4 V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
1 @$ K+ Y# ~9 L# }: L2 s0 Z
/*
/ z' l' K1 H& h$ |
* Check memory range for valid RAM. A simple memory test determines
7 t& z- y9 B: d) m6 O4 V5 ~/ Q/ g
* the actually available RAM size between addresses `base' and
1 v# v6 Q2 f7 i i' a% ^ f5 j5 o
* `base + maxsize'.
+ {7 K7 u0 ^3 i+ g
*/
( n( ?4 B4 v" g/ k( h! D2 Q
long get_ram_size(long *base, long maxsize)
+ F" q! p. a$ E1 L
{
: O' Y/ m: \. E
volatile long *addr;
1 ^5 H% ]. P5 \
long save[32];
8 c+ p2 S t. }8 \6 @+ O8 t
long cnt;
& a8 j) L+ m& [% p3 l/ I
long val;
) z8 G: N- l$ d6 [# P2 P+ _
long size;
! m+ f1 {5 K/ S
int i = 0;
) E6 d) {: n. n8 w, F
# G6 c( q+ X) ^ |
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 o9 X) n l; \
addr = base + cnt; /* pointer arith! */
) Y5 ^/ L2 M$ S! r u l
sync ();
) f5 x1 @, f/ k
save[i++] = *addr;
8 c$ b b/ r3 J9 M5 p+ L5 m7 d, w
sync ();
$ {. f% a" u' _1 j3 y; ?
*addr = ~cnt;
! q6 l% _. z% \+ p; N
}
' ]& b0 r& [) r9 `& ?: ^: _. S
/ s: \+ }% P/ ?& C5 u# e( I2 Y) \
addr = base;
" |8 t6 r$ C2 u) D/ M9 J) `
sync ();
8 g! U s- |$ {5 I. z( u3 E/ N: b
save
= *addr;
+ L* G4 t3 C5 s( x/ x; R
sync ();
! u5 P, S- X F( q" k& H, x( ^
*addr = 0;
( [+ {- z0 ` N% m! L3 o `8 q I
/ j0 T5 I5 I0 m" s d
sync ();
3 c8 O9 o' W. C! W6 M
if ((val = *addr) != 0) {
; D; |+ |4 y3 E# ?3 s" W( z
/* Restore the original data before leaving the function.
, v7 i" H0 K3 ^3 B# L
*/
7 ~, p5 y7 v6 G- B3 E
sync ();
5 m7 A$ H6 ^% T" Q
*addr = save
;
* b1 g f" B9 R; Q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' l1 M+ Y6 ~# o) f& L
addr = base + cnt;
3 E5 D* C' Q9 m* P
sync ();
8 g% {2 g: i" V: E: ?
*addr = save[--i];
, Z7 S7 h8 r9 u1 y) B1 h; l; |
}
" v2 q* _7 M) H5 Q! O$ \, r
return (0);
5 o& }9 U4 m! c, L n1 J9 j2 t
}
) z! m2 d& P4 \+ Y* c* c
0 }' q0 A8 f, i2 ]$ m5 e
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ _# F p$ {7 C3 ~# o9 o
addr = base + cnt; /* pointer arith! */
3 Y8 L6 z+ L" j E, W
val = *addr;
9 K5 F6 t9 [1 p5 m0 v
*addr = save[--i];
) j- Y+ {; z4 g {
if (val != ~cnt) {
! d0 E: l, X' F6 d" B2 \$ }
size = cnt * sizeof (long);
t7 D5 p8 L9 D) |/ L+ B. D0 e
/* Restore the original data before leaving the function.
4 l: T9 Z% W4 x2 H6 G
*/
9 b- M( @; p2 A! v, F/ m. p: N) ]
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ n" X8 ^! `" h1 |
addr = base + cnt;
. G7 h. g- y! d( c) c
*addr = save[--i];
( x1 k' M" W$ {) e4 ~- ]
}
8 l+ H; B/ `; X& L* ~
return (size);
" f f5 E0 N* _, ]. S# c! X
}
( P# w; C, n$ n/ _
}
4 v' `: z# x4 U7 _+ m' C
7 c: f5 k) o6 D* Q2 U/ T
return (maxsize);
) o, o$ N Z: Q3 B5 Q, l
}
% X9 ^# J, ~3 y2 z
int dram_init(void)
/ r# s0 B' Z0 q0 L7 D7 c p
{
! Z* V+ Y* s4 d
/* dram_init must store complete ramsize in gd->ram_size */
0 k" m* v$ U6 s
gd->ram_size = get_ram_size(
- T" N$ `" e6 x7 |" L' d6 Z
(void *)CONFIG_SYS_SDRAM_BASE,
+ e5 F0 ^5 u6 `) T' C
CONFIG_MAX_RAM_BANK_SIZE);
k/ Z0 M! J! s/ S0 `
return 0;
+ l ^+ [$ ?, B+ D4 ]
}
* |( P$ \- @1 h0 Y7 L/ b
! Y# ?0 y& X/ Z$ o& H
% k E4 U3 \: x9 @' r5 A }
6 Y4 f4 v' ~/ e: t
+ U" e& V8 Z, S8 p# z9 \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: X/ {: S$ B" x
8 Q3 w; g4 J9 s( g0 ~, u
- R2 |/ S7 o- b: S/ z. e% L9 C
* f# t# X" o' o! C- w9 ?( {( W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4