嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% T( P _8 r1 ?1 e
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 Q' L& Q0 Y: n: s% q5 `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: H) [ Y2 h6 L& `" z! ~( ?
+ c: ~# N' k0 C& U+ ?; Z
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; g- I* `, k& H, S5 J; s
7 E) C1 j( C# _* i% v9 `9 d, v X
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 }; L9 {, I" Z0 V8 ]7 Y F' j
/*
2 ]( M5 N# d0 }
* Check memory range for valid RAM. A simple memory test determines
# z* P. F5 W( q( X7 Y6 c3 c/ v8 k
* the actually available RAM size between addresses `base' and
4 d2 Z$ t! T( t: {- O, n6 R
* `base + maxsize'.
5 L8 }' g* g3 K
*/
% K* I% Q# f# r# [ z0 L: H
long get_ram_size(long *base, long maxsize)
0 a5 E5 f3 K' s+ v! z# y+ [
{
2 t1 O" l: n" l( g- W
volatile long *addr;
6 f6 P d7 H0 X
long save[32];
/ ~8 s) p1 f2 s
long cnt;
h' R/ k1 D& w7 P
long val;
" V$ D1 h( D0 n& Z) G
long size;
2 d7 i: [9 P* i' o9 K
int i = 0;
9 Q5 b! _$ | \/ w) W; s: v
5 b; s7 _# K, E8 q, y* I( ?
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 x! q' W' V3 W7 A3 Q0 @- l- s5 [
addr = base + cnt; /* pointer arith! */
- j2 N0 q( z+ Z) l
sync ();
. Z; f1 W* l9 r- c! e) B
save[i++] = *addr;
3 I# Y; a6 n2 t9 g
sync ();
9 w$ {8 g; e( G2 Z2 _* v" |
*addr = ~cnt;
0 G# k# z* z0 n1 z* Y5 z8 \; X
}
) T4 e+ I; R$ ]- @' T
2 ^6 e" O* {: _
addr = base;
, T4 f/ Z& g% `; J( w
sync ();
; |8 `5 x+ q2 J3 [1 V5 e, A1 S
save
= *addr;
. G! B* M8 A) A2 [* f, g7 z# ~! Y5 r
sync ();
9 T# ~. R: {$ V
*addr = 0;
u6 M; P, u% V% A" L
4 k2 J- F; [- P: \) a: ?5 I- e7 i
sync ();
. x; E, Z: J4 H) W1 e
if ((val = *addr) != 0) {
+ ~- L3 i& S# {, [- s- x% a5 h/ E3 l
/* Restore the original data before leaving the function.
}( b4 T" ]! e
*/
5 [4 r# L) C& ]- I1 |
sync ();
* L& [. g$ o% z) u' m
*addr = save
;
$ O5 K h' S. j R4 }3 _: d9 D3 A
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
, r2 j( E* D$ V) r% b; R
addr = base + cnt;
% v1 f( k$ }* e' i4 @/ I/ n, |
sync ();
' H ^( c T/ v; m
*addr = save[--i];
' [# ~! p+ ~( c% b, i
}
: S# q7 l' t O3 `7 Y4 p9 Q2 i8 f
return (0);
+ o8 u0 _3 Y* }7 F. b
}
8 Y$ Q4 w' D! N" `/ v' Z3 c. N, b
0 f) K! ? y0 b0 W2 l$ X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
{3 {- @7 r. x9 W$ }2 c$ D
addr = base + cnt; /* pointer arith! */
) |7 q+ t( v% d, g1 y; K
val = *addr;
5 S1 d% A( T$ R; }
*addr = save[--i];
' S3 y5 f9 ?) b( q" u
if (val != ~cnt) {
& x* A& N4 }- R+ J5 ^* S1 c( t8 N
size = cnt * sizeof (long);
* `7 L# k: [( j2 S; i9 W+ f" `
/* Restore the original data before leaving the function.
# H# n* g x- `: I3 {4 C" F/ |# M- A8 @
*/
) y1 i: ?6 M+ h; G
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ [( @# D* B$ v
addr = base + cnt;
: O1 b' r. v" T% M
*addr = save[--i];
2 ]3 w' N, K7 A" r. A+ Z. U
}
; u$ ^# T h3 r9 m! b* X
return (size);
* E8 x0 H' O0 g2 X! H5 m1 J
}
- E! `! ?0 g% C( `# [. H
}
7 t2 a1 s! s# P
6 Q) e1 e+ D; p* {
return (maxsize);
5 F. t6 W& d: ^' n
}
+ v/ z" P* J7 @: {; J! L
int dram_init(void)
* I% h" r) @5 {; l) M! N9 b# X5 U
{
9 ~ ^; F5 @# u( S! ~4 v
/* dram_init must store complete ramsize in gd->ram_size */
* u. _( x) u% f$ d
gd->ram_size = get_ram_size(
) ]* ` e- `6 m; f* h) t
(void *)CONFIG_SYS_SDRAM_BASE,
; V. l ^6 b3 P/ F
CONFIG_MAX_RAM_BANK_SIZE);
1 Z6 e- ?: Z/ _
return 0;
, p6 T# o: p( S, \8 a
}
- `) P. l, h+ v# G1 Y
; P; @, w6 O: W. P* B( |7 B* \" Z' [
" ^) V( u2 @% x% s( U6 c5 w( b
# P( h$ G7 ]/ b1 S0 R* D4 p- y
) o) _, \+ Y2 B3 p" E: p9 @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
- e5 [" g" B' H+ Q/ ]& p/ p5 L
! V( W3 v8 J, l C
+ x7 Z9 t& q: n: f& v
" F' E0 I" A3 X; @9 g! E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4