嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
1 r$ Q0 U: p5 \0 x/ L
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 `5 }: ^8 {- L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ h% r3 k" M* k3 V! Y( m
- b% N; P0 ?% Q* |/ Z2 w. D4 M; t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; V& S) Z$ C6 n5 P. s+ v- z+ W
7 U* o) F) [) a4 j5 X& K9 X* b+ l% \
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 X2 w: l5 s8 t
/*
- t# F; I9 X) h7 g; _4 ~- v' d
* Check memory range for valid RAM. A simple memory test determines
5 F; _3 r: f; ~6 d' ]8 O
* the actually available RAM size between addresses `base' and
* a8 B6 R4 }4 k3 ?( ?; B6 l
* `base + maxsize'.
- D, |$ ^% n+ _4 K1 y; Q7 v* \0 E1 `
*/
' e1 ]8 j+ l& p/ N* b
long get_ram_size(long *base, long maxsize)
* m. E: @& R2 W& w* J
{
5 G- z9 I: K# z# `) V* H6 V {6 Y
volatile long *addr;
$ S! b' t; y9 n7 O/ [
long save[32];
$ g1 C, O; W' W8 V; ~' H
long cnt;
" w1 [, A* a0 M5 p
long val;
- T# z* r I$ G8 V0 J
long size;
( A. W, g- j* y0 z5 V- V6 _
int i = 0;
& g! O1 _" S$ E: r- Y$ T
! n0 F2 F2 x% U5 u$ }; k) _
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 g, l0 T L5 N) Y9 Y
addr = base + cnt; /* pointer arith! */
7 r2 v) ]: Z( `5 h# Q& R8 f
sync ();
' D' i0 u9 U" ?4 V" r
save[i++] = *addr;
; S" {3 d- @3 V5 K" ?0 K
sync ();
4 J0 l4 f: b$ I; i' ]- o5 Q
*addr = ~cnt;
6 T& b' q! C3 J) _: l8 v4 w( o
}
8 \3 r, j& `5 J& Q* Q \8 h0 v
3 B1 `6 z; ?; t" s3 [5 H
addr = base;
p2 u7 n6 R, M; K4 R' I
sync ();
5 v- X) q2 V4 B0 ]3 o3 d, G8 q
save
= *addr;
. s; Q- ~' v, t" X: \
sync ();
6 a8 w9 v4 F6 P
*addr = 0;
3 Q1 l0 [% h! M3 R
* \8 {) U; E, X9 u: s8 _
sync ();
7 j- X3 T( }4 ~( W; n3 o
if ((val = *addr) != 0) {
1 B# v+ a+ Z8 G2 ~6 E9 O+ U3 R
/* Restore the original data before leaving the function.
: t% }( ?) f- [% `
*/
! X4 V: f7 N* N) C
sync ();
$ [8 e- Y! k8 D; w2 u9 V1 I1 @: V
*addr = save
;
5 r |3 I0 N1 a" \ N4 ?$ `0 Y: _% p
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
$ q" z- Z$ [5 I' B8 ]# d7 L) E: x. S
addr = base + cnt;
( ]7 Y8 B# N+ H
sync ();
8 O; a4 X8 y5 R- g! b
*addr = save[--i];
8 e3 @8 e% X+ y- m
}
$ ^1 n. U& U- B: e J. n
return (0);
, g2 m' D$ K# O% P+ K5 Z
}
6 M7 x" e2 ~2 k1 \7 ^0 g& I
( s9 P7 k& p- }7 r* f# T
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. a* ?! N6 S! d: N4 |7 `4 D4 _) j
addr = base + cnt; /* pointer arith! */
% S- T$ Q/ r6 l* @% Z
val = *addr;
$ X6 `( a1 [8 G L8 o
*addr = save[--i];
. \+ _2 K( {" y/ j
if (val != ~cnt) {
: P. v% ^; a% r; j: l1 g- T
size = cnt * sizeof (long);
* m, R3 E" }" H' h
/* Restore the original data before leaving the function.
d; N+ y! D1 f
*/
' c/ Z7 P2 k+ P3 ?. {0 k7 E
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
U/ a/ m% f' h0 j
addr = base + cnt;
' y3 N' V0 w( _( x" m8 ?! s2 x& t) L
*addr = save[--i];
3 y9 Y/ r0 M2 S* g ?% q$ p
}
8 e3 j) q q0 B7 C, [: f
return (size);
1 A. }# `5 D' g; ~& g8 c/ H' N$ b
}
) ^( f9 ~. A7 j% B
}
' A: B7 I$ c3 R. ]% H# H
% [2 a3 |: V3 \, X; M
return (maxsize);
7 t& E" m! r Q
}
* n) [+ Z5 [% i- V7 U7 h
int dram_init(void)
& y8 `. L7 W3 k. q7 A" G1 e
{
5 X2 A" E& k' ?* p& Y7 l
/* dram_init must store complete ramsize in gd->ram_size */
+ v1 i0 f0 C( R# f! p
gd->ram_size = get_ram_size(
; \! Q: Q- G! \/ t% O6 J; k
(void *)CONFIG_SYS_SDRAM_BASE,
+ b. `7 H& H4 H. H! w1 X
CONFIG_MAX_RAM_BANK_SIZE);
0 e+ R6 b; d0 B+ g4 P
return 0;
3 ^8 E* l1 \$ w& R- A
}
" @ X3 ?( ~$ Y# F& I+ ]; T$ @
4 o' p! ?) G5 i* B
d2 o' Y" Z4 Q; t" U! D! y
& f3 _% G2 B) p- I( s! i
8 E2 ?, A# N' m% ^8 u
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 ^( x+ ?8 L+ t
0 j9 [! v! C) @! b0 E
! a7 `6 K Q7 q) a( F: q w9 {
7 P" ^+ H4 H" N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4