嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 N9 N& e& l+ q, Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
* k/ B: a8 X- |9 c5 Z9 z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 K$ s/ d+ W, d$ m R/ X5 H2 d& q3 O
2 v N: O9 p! F0 U, |$ c9 i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
: i; P: p+ }# _0 f
8 Q7 a. \9 F0 Y1 L4 C
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 o" y/ G( m) f- L( F
/*
5 l8 a1 f u( g7 e: B3 Z
* Check memory range for valid RAM. A simple memory test determines
( g a$ v( N S0 e
* the actually available RAM size between addresses `base' and
7 \9 T; `9 I; ^* o) A
* `base + maxsize'.
% o0 P2 _* s+ {" i4 F0 ~
*/
+ c) J. B/ F5 x/ T7 a
long get_ram_size(long *base, long maxsize)
( n! `0 p, `: l! p
{
9 L @; ~: ^8 G
volatile long *addr;
& q9 \7 ^; l# l/ B3 S7 K& T4 ~4 `: l( g
long save[32];
+ U4 d: X! E' k6 {1 i+ |5 a9 }1 r
long cnt;
. N% G _- B7 s; v2 b& ~- Z5 v( Y; F F
long val;
* j. \( D/ L* o- ] R
long size;
" o% y, E& w6 [1 v2 B
int i = 0;
' G4 s! @& `, Y5 b0 n' @
3 l* M6 Z' G6 `% f r
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ i" x- u( M* w3 w, l0 V' |4 Z. D" ?
addr = base + cnt; /* pointer arith! */
; m& f% q$ Y9 g5 Z
sync ();
5 _$ L, v z7 W* F. w, ~2 j: O
save[i++] = *addr;
8 D3 ?' |; _% b
sync ();
4 |; N2 U# W9 I. S% N- B
*addr = ~cnt;
6 r$ F( }. P, I$ [
}
: K$ m+ ?' ?9 C5 z
4 w/ u" A0 U, c
addr = base;
- G z. |5 Q6 |4 a" i4 h9 \
sync ();
2 a. `* ~, L( s
save
= *addr;
; U7 M1 o1 b/ b" V1 j5 k( Z) i; U
sync ();
$ C( N/ ?$ R t: F
*addr = 0;
) }5 r; V( b* q/ z
3 `+ Z% t; m! K- O5 H3 P
sync ();
3 i! g; Q- j2 U2 m; p: O
if ((val = *addr) != 0) {
. T6 D7 m- w: R7 ^
/* Restore the original data before leaving the function.
& ] H) \ l# h) X
*/
+ @ y# b# N7 _% A; h
sync ();
0 C$ p3 J- d$ l3 W% w8 s
*addr = save
;
2 G' C( U* K1 f8 L0 m, s
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
O8 z$ X% \. R7 F' k+ U
addr = base + cnt;
( V3 Y1 S. E. q+ f0 I' _ f* }
sync ();
0 N- R7 Q/ g" p+ O
*addr = save[--i];
1 ?) `$ Y9 Z3 ]) y9 k3 u* {$ z: |
}
) }4 m4 P. F3 Y- j2 g' Z [
return (0);
. R! r6 ?3 H8 ^4 s. L9 h
}
B* `8 Z+ A9 \0 f. M+ |* S
% w7 V9 V. V. U
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; d% o7 C' {; l9 ?8 @* |6 _
addr = base + cnt; /* pointer arith! */
, h0 r7 S8 I7 } w' N6 R& [. g
val = *addr;
3 [0 P' J4 t& n" n; ^: n7 ^5 ?
*addr = save[--i];
; J/ K7 {2 D* s! Y$ l: S
if (val != ~cnt) {
8 q" r$ m( e! x( F% R, J9 r5 {* M
size = cnt * sizeof (long);
+ `7 w9 b7 S+ N/ T5 \) Z
/* Restore the original data before leaving the function.
0 i1 Y( l4 T' _
*/
( ]. V6 A( I8 j; C3 A: k/ x3 t
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# v3 {$ Z9 h* p4 F( e; z: d
addr = base + cnt;
, B9 b" B) J2 G s+ N
*addr = save[--i];
O- S/ _; l$ | y$ v- E
}
4 u* ^6 V3 I/ ~& p- b W5 s
return (size);
7 H2 N, d0 V5 y8 e
}
4 m4 n4 |, n& j
}
" ^- r8 w6 T% y( c- k
* \' [ b+ h9 W G8 S+ y) I
return (maxsize);
7 w8 G# c8 y+ i$ p3 f; c
}
0 v: l% ~: h( ^" ]* ?2 ^
int dram_init(void)
4 B; s9 Y V" j; @' }
{
" f8 F* T1 U9 Q W9 `+ e1 V' [
/* dram_init must store complete ramsize in gd->ram_size */
}% a7 l N, p8 n3 @* |) H
gd->ram_size = get_ram_size(
2 E' ?' y% I: q
(void *)CONFIG_SYS_SDRAM_BASE,
- k" m' |+ k- F* f# p' x
CONFIG_MAX_RAM_BANK_SIZE);
& ]: k' z( `" i( b0 G: w
return 0;
. j% O" h- T* l/ c+ V
}
3 E" k8 K5 w# ]3 Y$ p* v4 N
, O/ |1 n. a' |7 `" g6 h
8 T- ^5 _" k. L+ }
% q! l3 n- l# x5 z" p, T! }
3 ] F( n, j% j
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
. S6 J" v1 T& M# o
' J7 X, p0 [8 V7 ?
4 D6 k) z1 o1 o4 g' Y
& d q) H% \/ f0 _& t
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4