嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
. b! b' R6 a; c2 ~" x
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 |8 E/ z; G# O2 ~9 R# I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
7 t) i( R' s7 N2 [- ^' l
6 F$ _/ n$ _$ I, X( G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ C5 E7 F5 [8 h# b" H
I2 x" w" Y8 t I, g
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" H( X3 L4 }* l/ o
/*
9 w5 @( H( F6 j' V
* Check memory range for valid RAM. A simple memory test determines
6 f, l: E" t/ Z' C
* the actually available RAM size between addresses `base' and
4 X) c3 J9 l8 J' }: D* u" z+ m
* `base + maxsize'.
! t! a8 ? K' R4 P/ M% z0 f/ a
*/
3 h- K4 T! n( P; k6 E5 N0 s/ [) w
long get_ram_size(long *base, long maxsize)
" C$ L: v8 O! \2 h$ \: q
{
0 }( O9 I# S, t# b& \
volatile long *addr;
) t; ]4 @7 p; z
long save[32];
7 D3 ]6 Z8 c+ D3 M
long cnt;
3 I S) d, Y3 t2 G0 h' `" g; S
long val;
& ~/ n8 `7 G7 Y7 k/ J
long size;
9 }% C/ J+ C# r( v& D! A9 C
int i = 0;
7 Z4 Z, F4 \# J( c; k+ _
9 A! A) l/ B7 A% p f
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' x8 ^% m- @/ c/ J) h4 B
addr = base + cnt; /* pointer arith! */
) K# E! R5 m _0 T% P2 U
sync ();
1 t) N7 b7 ~* k7 H+ [5 w: O
save[i++] = *addr;
' }$ Z. O9 }, A) `2 i& U1 ?
sync ();
7 J* g; V! F9 y# O2 @1 u
*addr = ~cnt;
$ g: ?3 T: w9 K0 i
}
5 b7 V0 O' u" b! e& G3 w
; a; k3 Y* P5 ^: j+ E2 H4 { N/ v. C
addr = base;
) c2 p( O% _5 v1 _: t" i) M
sync ();
6 }8 @* v) t! H0 P* j5 Y) }; ?9 I
save
= *addr;
- E5 P1 r2 z x5 e A
sync ();
/ ]7 L( A' w G- E% A% E
*addr = 0;
1 y/ s' w! m. ]4 R/ J
, Z# {9 Y9 X- t7 }. m/ @, z
sync ();
5 L" m5 `& |" z1 t6 B2 R- i
if ((val = *addr) != 0) {
) P4 H' m z1 l: ~
/* Restore the original data before leaving the function.
. m( V5 |3 H% A# ?$ H% O
*/
, w2 z" {8 t8 h7 Q' h9 q
sync ();
1 `* d$ E+ t ?5 r% d3 r# B
*addr = save
;
. \3 R/ ^" }6 [+ r: G
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
; X# w4 j' B9 P& y
addr = base + cnt;
& `. H P/ ^0 k: B1 \. G2 D! x0 x
sync ();
. A: G. q$ S7 X7 c ?+ h
*addr = save[--i];
8 \- O8 V) x I4 b, Q7 C
}
, _1 e8 C: K) W
return (0);
- a3 p8 a6 X: Z( E
}
8 V- C3 W8 n# Q( O$ x" d
1 ~$ n" {1 M! v: y# J, M" V% O
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& m! g$ o3 p* p# M( ^) w( Q
addr = base + cnt; /* pointer arith! */
8 z. G$ {+ j/ [0 G* P* y( l
val = *addr;
# X/ }) K9 K+ P4 G- ?" ~7 v+ c
*addr = save[--i];
) ?8 U4 G( e* h( \& F
if (val != ~cnt) {
& n# k0 f$ p8 ]2 i6 f/ Z
size = cnt * sizeof (long);
: `- S" j8 F7 J
/* Restore the original data before leaving the function.
& \* a0 h4 s2 I% B; }' W; M
*/
3 W8 V( o: r7 U$ ]9 b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- w" Y# g) @6 }" Q4 s' t
addr = base + cnt;
. K. x0 O6 q* f- x% J
*addr = save[--i];
+ n# K3 h: Q9 F" [
}
* \0 k8 m% H8 [; N
return (size);
! X; v7 R: h" t5 v! T2 H7 ?
}
& _3 V& w" | j" Z+ W
}
: V" l7 e3 a" M9 j/ q+ n
9 J& }9 m4 K5 w0 a
return (maxsize);
7 V0 L, {5 F* K. \# A$ W
}
$ V' `0 N, M! G; y
int dram_init(void)
; g1 a) @) V% _# ]: k: Q
{
6 o+ \8 V0 K# U# z& K
/* dram_init must store complete ramsize in gd->ram_size */
1 a$ {5 @' C P! Z. Y( j2 z/ I8 L$ G
gd->ram_size = get_ram_size(
) `& a' C7 a7 E
(void *)CONFIG_SYS_SDRAM_BASE,
: j* E! O5 t8 ~/ i& X5 \# R4 u# G
CONFIG_MAX_RAM_BANK_SIZE);
( M* q5 m0 Q- c# V% @; F5 B
return 0;
7 I; d/ ?' i" p1 m" g- p" B3 ~2 ~
}
: ~" [/ X, ^/ Z% Q+ r
- |/ W" w6 G1 Y1 D* w8 |1 Q1 s
4 L- |1 O9 ?: E! R; J, s2 O
: W- [2 P5 X3 ]$ f: o
1 h' N* P, U& f" X# `
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
6 ~$ o) x& r! A/ m
& O2 A( e; V N: `8 G8 M8 g9 Q
N$ w. Q1 r$ L0 z g% M
' L7 [* l8 |; w
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4