嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* j! T Q; U0 h3 Q. t
核心板2:DDR2 256M Byte NAND FLASH 8G bit
6 q6 g3 o& i* U, k5 v6 a ?
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 ~7 w! |% e9 J/ l
4 u2 @" K" f* H y7 z$ D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
& r2 q% O* \4 X( X+ u; l" R
4 `" U7 T1 z4 Y7 G1 N
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, G+ W$ ^- ]! l- Y ?
/*
3 j. j7 L7 D; J* K! D( t
* Check memory range for valid RAM. A simple memory test determines
4 }/ R8 U. P* y& C! J' l3 m& K( a
* the actually available RAM size between addresses `base' and
. X6 F4 _* z) H% i/ [9 [! \1 r2 `7 d
* `base + maxsize'.
7 Q' u& l( j& u$ J; n
*/
% z2 }5 `/ |* b: I
long get_ram_size(long *base, long maxsize)
6 F* C1 o' ^6 G
{
% p, B* Z3 Z2 [3 I
volatile long *addr;
+ N+ N& v8 \6 p" l- A" ~
long save[32];
4 H! e' F: j1 \3 P2 F( j
long cnt;
q8 N& M5 z& L8 |7 T$ D& d: X
long val;
% q" b9 ]! t! S8 X
long size;
+ v; O! j% T7 R: x6 }3 x! }
int i = 0;
/ A' H$ z0 m: I
* g9 [, [/ W) }8 Q# }6 S1 ^. \0 [
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- Z5 |* k0 G7 v5 M
addr = base + cnt; /* pointer arith! */
6 h, z1 l" H0 X4 n) d" i
sync ();
5 K6 J! |9 Q! N- Y1 Q
save[i++] = *addr;
% e6 J; y# @) A0 v; ^( h+ M' n
sync ();
, \- Z8 W0 s7 l& F, i; [8 `) d0 F
*addr = ~cnt;
$ q1 b9 ?& {1 S4 `
}
" `8 c8 W& h% Y2 ]
- h) {) Y7 x* l4 k1 S
addr = base;
: v, h3 S' Y7 F# P* ?- R
sync ();
8 t- H v# p' F8 u. K& y
save
= *addr;
( [6 l/ G. I O" s* w; I
sync ();
R/ k% _) P3 m4 d2 b; Z# ~
*addr = 0;
$ F0 J$ o# q; e
2 R A' ~/ U& W9 }7 e6 Z8 |: w
sync ();
( `3 M4 n2 ^7 J+ `( q
if ((val = *addr) != 0) {
: b8 J7 R' \. Z4 u
/* Restore the original data before leaving the function.
1 b2 H ~/ X& R) L" g
*/
1 f/ I6 {' w6 |& d% r5 Y
sync ();
) m2 j) q# w* _' W6 ?$ w
*addr = save
;
8 x& J% ~* \. n1 l6 h! F
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' k k1 R0 O% W
addr = base + cnt;
0 \; \, e+ D: S, y
sync ();
9 D O( W/ y& b5 M% M
*addr = save[--i];
1 V4 _5 q' S5 q3 Q) ~3 n7 m9 n
}
6 T _; C' r4 v' ~4 U f
return (0);
* x, \" F0 |. K0 r
}
1 x# x$ a; L3 v" A
- H0 P0 }+ Q; W) l
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, C) {) n! i$ h$ f
addr = base + cnt; /* pointer arith! */
* j% G' t$ s1 c( A/ o" \9 P
val = *addr;
: T4 k4 S) i n" T. u
*addr = save[--i];
$ \& B# D4 \8 x
if (val != ~cnt) {
/ U q5 ^; T: o& Z
size = cnt * sizeof (long);
+ E3 P' r, u$ I8 q- |' z% M( I0 n
/* Restore the original data before leaving the function.
) n( U5 T" E0 K
*/
2 G9 M# s+ `! `: a9 C2 o
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- I5 B2 x: P: T+ C, j5 ~
addr = base + cnt;
9 N, \1 T0 c% b
*addr = save[--i];
2 R3 p$ t. P* L* }8 k6 L
}
; W% b" N# F1 t& ], e' h: h4 I
return (size);
" m% h) n/ F3 t) }
}
5 g/ q: x) s' q) y8 s% P5 h
}
- q3 u: R# C) r4 R# J+ ?
" `3 s* B! H( {
return (maxsize);
4 _6 `. z7 q" j9 y1 d* |+ I
}
+ H8 p, K& r% L. `) z% K
int dram_init(void)
) o) C( \; u2 u7 h3 P! c1 g
{
1 q% s0 V4 K; E* l7 @8 j. d! K" @
/* dram_init must store complete ramsize in gd->ram_size */
6 E* p$ G: ^. B# t9 @
gd->ram_size = get_ram_size(
# T0 q+ r! z" j* _, ]: e i
(void *)CONFIG_SYS_SDRAM_BASE,
( u5 ~! q0 c7 |# }8 x
CONFIG_MAX_RAM_BANK_SIZE);
& N' z' J1 T9 \: s
return 0;
9 _) q5 |: D+ x
}
7 x1 P. n% }, K$ z7 l9 @# i
4 f& f) ~9 X$ Q+ W
6 \% C7 u& w/ V q" y$ U
" F0 D Q% t' ~# I% j G. ~4 U
: t# `+ { w9 i6 I
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 y8 i, a4 j' }" [: p: D9 ~
4 K, V/ m: c$ a# v
$ i/ }* P6 Z- M, _4 |
5 J: p. o- a& u4 u( k+ W+ O, j
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4