嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; Q! u3 o3 v- M: O
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 U+ h1 ~8 |% B- X- r; u5 B
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* L- I# P# X7 O# D! A1 c; j# o
" s, R* s( x. U' z& e" m/ p2 h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
1 k$ W3 h6 C( F6 Z
, N# h; m& j1 P4 k: k
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: R- I6 `# Z6 p9 U# F
/*
+ S: b1 S/ ?) k+ a0 ]& V
* Check memory range for valid RAM. A simple memory test determines
/ e; _5 r# Y- g' M+ j; L1 J. F
* the actually available RAM size between addresses `base' and
S0 h2 E8 y7 v: C
* `base + maxsize'.
! r* y7 r& ^# H j# P7 i% m) e
*/
6 F$ G- {# G) ?& s9 F
long get_ram_size(long *base, long maxsize)
) V* ~4 s. {& x o5 c; u0 H
{
+ V$ I* a! ^( ?/ {0 Y
volatile long *addr;
' P& ?/ |* i) Y! W( `
long save[32];
# V: Z: R( f5 v6 b1 ?2 u
long cnt;
/ [" q. ?) Z0 ^( D7 Y% Y( Y
long val;
% u/ Q E0 J" v2 c
long size;
/ P: M ~- O# o/ h, L1 h
int i = 0;
; A4 ]* Y- x4 I( h
3 e3 U) X2 `* _) }' @8 Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 J7 A' L$ V% ]4 J
addr = base + cnt; /* pointer arith! */
/ j" q7 I- q7 F9 K
sync ();
% @6 [- Q' L# t( v- |8 C
save[i++] = *addr;
3 k" g' o# s# o; O9 `& y: Q9 v
sync ();
1 ^& t! x; E7 ?2 @0 H; ]. U
*addr = ~cnt;
( |4 G4 B1 U0 [! z/ d# }
}
+ P. h/ Y2 a1 D* h5 N8 D9 K+ {
6 W5 G, D O& }# |( r4 b y
addr = base;
2 ]+ i4 r5 C9 C3 W. v8 Z# G
sync ();
8 e' ]. ^* M2 H7 n+ x% m6 }( D/ ~* o
save
= *addr;
! J3 Y7 Y! h9 i$ Y" ?* e
sync ();
4 O! F0 z" r( W6 W4 w9 e
*addr = 0;
7 a$ l' } ~3 b$ k- `! t: q
# D5 q H& m( @( x b5 J
sync ();
) @3 `. d, q& K; i) t* r& R
if ((val = *addr) != 0) {
1 i% D- ]. Z& Q/ c+ C3 f! W
/* Restore the original data before leaving the function.
6 W3 f. i- ^/ \0 `: a4 `7 c
*/
8 b3 O! D6 A" h) R7 K
sync ();
: Y2 l8 j) R, `( E/ N
*addr = save
;
! E% S5 I# w8 }' I" k+ f
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' ^: t$ J0 F" z l! a
addr = base + cnt;
; w. Z& a" W: I( S& }) ^ m
sync ();
' S" G; Z3 A4 q
*addr = save[--i];
6 |7 ]* G2 d8 D
}
- h# G6 B8 M% _( u* ]
return (0);
& U5 t$ Y; { N3 ~/ x& a7 P
}
; l" v2 }" Z" B ~0 A3 d
( Z# H% F8 q) i2 F% b; |! H A
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& h3 R8 _1 z$ v# g4 I. N
addr = base + cnt; /* pointer arith! */
! U: U- @3 J, c" F: _: r( E" J7 O2 R, d
val = *addr;
8 W9 Y# R' Q* z
*addr = save[--i];
* b) l' u* `# c7 e/ D
if (val != ~cnt) {
' B: u' z; H4 O- r7 f
size = cnt * sizeof (long);
6 ?! U' }; C6 a2 t) N6 S
/* Restore the original data before leaving the function.
. C1 Z5 W" N9 Z' ]" X5 w; T
*/
$ Q6 O8 Q+ v0 h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( K# v: y, `; N
addr = base + cnt;
; @8 q, U$ u7 s0 j; }
*addr = save[--i];
3 s' q& W1 K* M/ ^+ M) s
}
6 R% r$ o" d, l! N
return (size);
8 n+ P0 D2 X( p
}
( P% u! E, R5 E& z; t# ^% c
}
, V6 `$ N5 ]7 B+ [1 O# a' p
\& p" |: Y+ f, J4 N8 ]
return (maxsize);
v4 F4 E& {7 l$ {" G
}
' X0 J l" e/ ]2 `: `
int dram_init(void)
5 r- y9 _% x% M0 D$ H
{
" l" O6 @1 G& v. z* s' q' Z7 S
/* dram_init must store complete ramsize in gd->ram_size */
( l' R" \8 [# l' u: D8 ]1 _- ?
gd->ram_size = get_ram_size(
9 R" f4 X+ F: e4 c
(void *)CONFIG_SYS_SDRAM_BASE,
5 F7 H- H/ {2 J
CONFIG_MAX_RAM_BANK_SIZE);
8 ?+ j0 c! F3 C u @$ g
return 0;
* h( T; |2 D% P; m
}
! ^7 i1 [% t/ S4 A3 v
1 `* l7 t- ?8 `, I3 v) X% s# U
; _6 |" F! t7 R' g$ v$ }) Q
* x0 p5 t% I; L6 D" [6 L, v/ ~
: Z9 e8 g( l# ]! ^6 v- Q4 ~
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& D8 v* |: E9 r& J4 S' { f
, d# R, W- `9 E7 [
+ a: [: f, H' y
% ^2 M# Z1 u; o1 N; F) _
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4