嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 ?/ f; Z; o! P' \8 x( R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
8 H7 T) d- S; }! x. F
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
% }" Y8 m* ]" T6 I0 k8 T7 J
$ ~. c8 H E* ]
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! ?0 B/ e: C" ` ]4 _( y
' _) L' q8 C: `
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" ]4 s' k7 f2 @# S3 Q
/*
% q/ d! |0 P8 g n; }
* Check memory range for valid RAM. A simple memory test determines
8 _/ p, k) f2 q4 _3 b9 i( Y
* the actually available RAM size between addresses `base' and
4 _2 h* j* X7 z( w
* `base + maxsize'.
5 o8 @1 s) ]- W- ^# W4 p
*/
0 f$ n6 g7 D9 u# w" _
long get_ram_size(long *base, long maxsize)
9 E1 U5 H" K# j3 G8 `
{
/ |3 X7 N* X3 c1 K' O
volatile long *addr;
( y4 c( l* {: Q
long save[32];
+ w$ ? o. I3 w" O$ H
long cnt;
3 i/ A* M4 }! O* S0 l4 A
long val;
4 R; E) G3 {" t8 V! z
long size;
) o, a" h2 V( o2 A
int i = 0;
5 i" l+ F& D6 s! L3 w; D& M3 }. m9 W
9 i! \5 V( v& t) D9 n
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 N' V1 Y6 J/ n* C, u
addr = base + cnt; /* pointer arith! */
+ V+ v3 `2 m9 ?$ D9 h; M" N
sync ();
. G% o/ E, c- P* e; [
save[i++] = *addr;
Z U) r0 C& \" T( l3 j* P) U, ]
sync ();
6 ` ?* }; _: R" j8 v# I7 b
*addr = ~cnt;
5 b: r# j4 i) t" V3 j8 Z2 }
}
; S; v0 A' R0 `
6 F" Q' y! _9 m/ W0 ^
addr = base;
w4 u) X! y" K3 `4 X
sync ();
( ]; p$ Y5 c r; o5 p( _
save
= *addr;
7 Q0 B" X" i1 o/ h% O
sync ();
" j; k" c* G) J5 N
*addr = 0;
1 c# o$ l& s7 n$ K- j: J. W& k
" l/ i w, h0 r# I, s
sync ();
4 G% _9 H, {7 ?! ]
if ((val = *addr) != 0) {
% s' [4 m6 d. z
/* Restore the original data before leaving the function.
7 ^( ~% h* y& I) g4 H8 ?" w
*/
1 h+ d: D' @+ q$ A
sync ();
! L5 A, D* ^, d% l5 C
*addr = save
;
( h; Y# \; X: n
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
: G& n* C- f3 e6 S, y% L, C' A* s
addr = base + cnt;
9 G+ t& m S5 L7 M. A
sync ();
% T5 s$ Y( | m% ~$ ?) r) u* E* `
*addr = save[--i];
! p6 ~, ~- @0 s/ D
}
* u1 Z" k j7 a0 @
return (0);
# o/ Q3 ~8 u u( ?) v: P& a
}
1 h. _" e5 Q8 Z- \. m3 O. T
3 ]# A6 F J; Y; D( i
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 p9 Z- D( k9 R
addr = base + cnt; /* pointer arith! */
1 ?# `1 ?8 K5 f G- M- ~! K
val = *addr;
7 F1 |5 l# c" b0 ]( W! d( [
*addr = save[--i];
/ H, H- h i+ p& r
if (val != ~cnt) {
& g% w8 j' @7 K1 _. i0 X8 u) T5 u
size = cnt * sizeof (long);
! K! q+ u8 E: R' q$ ^2 D4 U
/* Restore the original data before leaving the function.
' P5 K( k; @/ i& |
*/
_" t% S9 }+ Z( v0 a: p
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, {# q8 J4 m9 k) W& ? k
addr = base + cnt;
, t* a3 S% t% w4 @; }# ~, K! P; M
*addr = save[--i];
3 ^* z/ t Z7 m% N# R6 Q$ a
}
- H& ^# Q1 I( ]
return (size);
5 G$ G, e; G2 ^4 ?0 r; y' S
}
8 u' Z1 j0 b* P; W/ Z
}
% h/ D( N$ r9 a" }8 g
' V1 c( b7 G$ h, S3 v
return (maxsize);
" Y8 `* i& ]+ o, W ^
}
( v: z) {4 X- G' V3 n6 s, z \" z w" X
int dram_init(void)
* U0 f* Q! V7 ?- S9 ]% ]
{
4 `- M; {4 z" [! H( ^' q/ C0 b+ F
/* dram_init must store complete ramsize in gd->ram_size */
6 b: y; C- e' b; ]$ E2 I2 W+ L1 d
gd->ram_size = get_ram_size(
6 s9 s+ z# |) U5 t1 h `' Z# Y( t
(void *)CONFIG_SYS_SDRAM_BASE,
4 P% k' \9 |$ D/ ~
CONFIG_MAX_RAM_BANK_SIZE);
8 X& N/ p# {4 y
return 0;
0 g' |" T% o6 T! |7 Q! l9 L
}
( B! J, B1 `, w& z
# S/ f4 F w R! T
- S5 b: ?! O" M ], B: u9 {
. \ b0 X/ u( ^! }" \
( N( _* T* R$ D; F. u2 `) a( p w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ l, U7 f1 S2 d6 z% b
$ f9 i- u7 l* N/ C8 ^% ~
$ ]8 \' k; l T% t+ T) `5 O
& [1 \) _, ?/ \$ I+ Y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4