嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
9 b# r$ f6 a+ s( V- T/ ?: q5 p
核心板2:DDR2 256M Byte NAND FLASH 8G bit
% ?) L" h8 \( _7 N+ M6 Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 m% j- m& }8 t) T4 N6 L
0 e5 S; i% Z4 S$ ?) d I: b) G( U
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ j8 n. j5 K% l. l6 [$ G# K
2 r* O7 ?% |& X. P! p, W
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 s \; U3 K- y* S
/*
4 \. P" x% ]! S0 @9 Q) q2 B
* Check memory range for valid RAM. A simple memory test determines
8 D( }$ c0 S7 a: @5 `, `
* the actually available RAM size between addresses `base' and
! h# O' z# v1 O9 a, z: `
* `base + maxsize'.
! g' {7 F2 f7 {3 Z
*/
3 G$ {" A( Y) u3 ?- B6 S
long get_ram_size(long *base, long maxsize)
! D1 |. R% L$ A- B; F
{
8 }% V. w" H0 Q. ~& ^4 J6 {% S* a
volatile long *addr;
! t- o; H) M$ t3 G7 [1 E$ I2 q4 X
long save[32];
|( o. f3 E3 r% d c$ u/ ]
long cnt;
$ N2 B! K+ ~& i0 H# J" a6 U
long val;
1 Z3 A+ p/ O6 W1 Y3 n& K N+ n
long size;
( \/ s- ]) W" n' t2 m. Z1 o& K
int i = 0;
0 \, `7 J8 a: K# U, _1 B5 ?
% F1 C0 h- ^* f5 b: k; p3 g6 m& v
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 Q7 Z3 [% j$ Y8 v
addr = base + cnt; /* pointer arith! */
5 t( X L5 L% W2 D' b/ i7 O5 r
sync ();
H- h Y- C2 b4 E- \" L
save[i++] = *addr;
; v4 I9 `9 \' o* _' S( V
sync ();
, d, O' U2 Y; } i0 j: ~- X
*addr = ~cnt;
O8 A, t2 F1 m& j
}
9 q$ u$ a% t$ \" y$ d
4 l( X |+ i' ]: \
addr = base;
. N; x' \) T' L( @
sync ();
7 g; `4 s8 U/ T L- [3 P
save
= *addr;
; D R1 c$ L: J+ l6 ^* ?) _
sync ();
, w+ F W# `+ }
*addr = 0;
! S! d6 L4 V. E ^5 s7 P5 o
4 R- U! F! X7 g @% M
sync ();
( }: D: a$ H) ]; b) ]! e
if ((val = *addr) != 0) {
" x9 @2 n6 h* |' w, Z
/* Restore the original data before leaving the function.
$ o+ }( O+ V e) E% u3 m7 H
*/
/ J) ?% X r/ V
sync ();
/ Q3 r) q! h/ Y7 H* C
*addr = save
;
* \# {' J! Y: U' K" E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 c4 }3 [1 \9 U, b% \! G" V4 B
addr = base + cnt;
" k' [- Q' i% T8 [! \; B: ?1 ~) ^6 k
sync ();
5 m" J/ X+ ~. y
*addr = save[--i];
! y% [# J( p, x3 s* v
}
" Z+ e) |/ X9 G* S2 Q
return (0);
: c) a& f+ r' r
}
0 {& [1 Z! c# e/ L2 c
0 ?8 s- c: T+ Y z$ H* D
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 U, |) G8 L) V! y3 F
addr = base + cnt; /* pointer arith! */
6 P& t" R0 p9 K
val = *addr;
/ d" N1 y& Z* ]2 q; D* V3 _
*addr = save[--i];
) e9 N1 j( Q4 u% m! ?2 a3 _
if (val != ~cnt) {
% s- S0 \0 `6 \3 W: \
size = cnt * sizeof (long);
0 g- Z$ u; j/ X& E7 |' [. A
/* Restore the original data before leaving the function.
" ^" S5 o6 c! Q5 e/ [0 Z1 I
*/
% W& M+ s! x z& p7 t" J
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# J |5 j! y! O# J0 ]( U R
addr = base + cnt;
8 C2 f1 b5 |, `/ M; d8 M
*addr = save[--i];
- s& m0 a# t0 F3 R+ Q1 ^
}
+ Z8 d4 \9 c% ?, ~' `3 [
return (size);
) r: i3 p& a, I3 e* Q; r
}
. U1 [# A6 e& a O, n0 q
}
2 e0 F+ A2 N9 S
& s- Z" B9 i: O. B( z/ r
return (maxsize);
4 U4 n! a; z3 q ~+ |4 _. g
}
0 K% y- N; d# T: F
int dram_init(void)
4 \1 `$ R% P$ q5 p. Z+ o7 P
{
7 n1 v0 D0 ?8 |% c- J+ x# r
/* dram_init must store complete ramsize in gd->ram_size */
. v! |; x: m5 j4 {
gd->ram_size = get_ram_size(
G5 H0 \7 A! a9 a0 ]7 P; W9 i4 e+ W" T
(void *)CONFIG_SYS_SDRAM_BASE,
6 n4 |% z" R: m9 l9 N
CONFIG_MAX_RAM_BANK_SIZE);
/ M& ^8 ^7 U/ C6 [6 _
return 0;
8 f" [ v0 t N9 O' ]8 I
}
! |& l- j- f5 q1 n( ^& r3 D& w+ A; u
, O4 S3 H8 B' I: o9 l
7 s8 o+ q5 n- n' c! W" g
$ o* B0 G5 Z2 ^3 b: D- |
- P5 x. O5 |: x0 N/ u! ~8 q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. B: F8 C( W) ^' C! T% }) K' m
% |9 P" ~+ \9 \$ R( i- @
$ q) U) G( E* l. {( V: t
1 O6 [3 o7 m& m8 j8 M
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4