嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
2 E3 _* h4 \7 B, Q( N5 I
核心板2:DDR2 256M Byte NAND FLASH 8G bit
( H" y% [% P4 X9 q& s, J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
I% R7 F3 ^; T/ p# y
W6 P9 S8 A, ^" \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
8 a8 E1 a; R$ k4 i
- B2 b2 D4 u* [* g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- R; {" c0 Z8 F+ S/ c. T: w K) I
/*
7 u; r6 x) Z% \
* Check memory range for valid RAM. A simple memory test determines
6 E0 {- Y& u3 T- z. L% F
* the actually available RAM size between addresses `base' and
: V6 d* a; ?/ w t
* `base + maxsize'.
1 e2 ^# I0 ]4 X; X& w+ i6 e
*/
6 d7 P1 R$ k' _+ ] M
long get_ram_size(long *base, long maxsize)
" O0 @4 b5 U8 _# C) W# Q
{
5 \( H3 j% Z+ h k# X
volatile long *addr;
' g- P) q+ G$ M0 I
long save[32];
1 b+ s) u* _. `- h3 D) `% p
long cnt;
. ]7 d8 o6 P5 n( f' P1 V9 M
long val;
9 }" k+ V) q2 {* B" Z
long size;
. q" ?# d% B( @7 o7 F
int i = 0;
) o& e$ N1 o/ q7 Z6 F, ]
. F' ~+ b; Y" k: d/ P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& s; }7 N; c5 I% L- I
addr = base + cnt; /* pointer arith! */
( C0 q; Q1 H: o1 t$ m7 N% v
sync ();
" T. D! n/ N( e: M
save[i++] = *addr;
! }+ b7 b9 l3 r" Z
sync ();
/ m+ N# |3 g. J; {
*addr = ~cnt;
- l9 t- Y: P: D8 R! U `
}
! f; I: g) y, I( F. e
, @ n" G6 d. `; k/ Z8 a
addr = base;
3 M5 f1 p1 Q$ }& P# o
sync ();
- j2 f0 Q6 j8 E# w
save
= *addr;
1 J7 n' m3 Z$ ^6 B
sync ();
; D! U/ Q# T. U T1 H
*addr = 0;
& `+ t. }- d' n( a7 `( ]
7 B0 y) D* p b5 z6 ^/ G
sync ();
# F: b$ D% o4 H" J8 ]
if ((val = *addr) != 0) {
) B4 T% m% ^7 i6 G+ C
/* Restore the original data before leaving the function.
# A1 z4 c! w, q( [
*/
% P4 O* h1 `% e; J+ _' a6 [
sync ();
+ w6 d* O8 D# v+ V2 @( P! Y6 Z
*addr = save
;
8 Z" H L9 l- h1 [, Y+ P
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) u$ ?' a. G; m. M
addr = base + cnt;
2 b# y8 f) _4 N1 v) }
sync ();
; ]$ n. j" Z% \
*addr = save[--i];
# X+ P( o9 N2 ]3 \
}
$ `( a0 Y6 Q/ n. d |, v# {" k4 ^& C5 @- l
return (0);
" h8 m( D) @9 [8 d( o7 @& \/ F
}
- { T: q" I/ _) u
6 X8 J; W7 ~6 S- q" x) ~
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ I) U6 v9 W9 k
addr = base + cnt; /* pointer arith! */
' x) i0 D% H& y4 ?
val = *addr;
9 ^$ B/ s, Y5 B1 p$ f
*addr = save[--i];
5 q t0 S1 X- {. N$ U
if (val != ~cnt) {
; ?; Y* S' o6 W- O
size = cnt * sizeof (long);
9 B7 {0 ]. w8 G; I
/* Restore the original data before leaving the function.
X# @$ I! \. ]) r' o% x- G
*/
0 J$ w0 F0 D7 ?4 I# s. O; O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) D9 L9 [' T5 x# u
addr = base + cnt;
! x0 V3 o" z/ j
*addr = save[--i];
5 G6 a6 B# x& h3 F. H0 T( q
}
0 u9 _; T) ]9 t; f/ R
return (size);
2 |/ D5 }4 f$ y: ] s3 k% z
}
: O- n" V! ?8 g( H, U6 Q
}
0 c9 f: V+ b' |6 g p! Z E3 [7 m
% E6 J8 ^/ I9 U% k' Q/ ]& d: f
return (maxsize);
9 E: I+ i1 p+ C- s, i, M2 ?
}
( `2 u; ]: B6 l6 G
int dram_init(void)
( t7 b. T$ V) Q# g
{
0 }+ e5 x! C* N5 b3 }5 K* N o
/* dram_init must store complete ramsize in gd->ram_size */
5 a7 J0 N0 Y) t& b* ^% j
gd->ram_size = get_ram_size(
2 k1 D; ^6 K( q; L% x
(void *)CONFIG_SYS_SDRAM_BASE,
' n3 w i _* `; s7 H* c2 P
CONFIG_MAX_RAM_BANK_SIZE);
! x, N( V0 H$ o, L% L g
return 0;
1 l5 ]7 K' Y+ a+ f
}
; ]- j3 j* ?! i" k/ t2 k3 B8 ?
4 z% I; E% [1 z8 U# j
9 ?0 e/ M! F6 n
% ]/ h/ S- s H9 X. F3 Y9 o
- c9 H, @5 v. J6 `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
: d" {# ~/ W& A% F& M& L w
9 {& U$ z8 A) R) O0 h& q
3 A) n$ ^/ w. }1 C
* D5 e7 u+ s+ I' P. Z: ]9 z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4