嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 c2 v/ g3 A6 L9 I" [/ a8 ?% u- \8 @' Z
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# s, H6 _% I4 f
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 s' R8 W0 a% L; t
3 k6 W+ F1 M2 G) [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
( [. x6 s+ ]: l% H* y1 P: g2 K
6 `+ d) V+ o5 {" E! n! r
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ u+ B e0 _- c& t$ Y/ b
/*
$ _9 Y5 N, T3 e: `8 K
* Check memory range for valid RAM. A simple memory test determines
$ a! L/ H0 |6 ]2 m7 k$ B3 Z! e
* the actually available RAM size between addresses `base' and
J9 i% d5 r1 G4 H7 ^# y
* `base + maxsize'.
( } F$ r+ j, x {5 ?% j" h
*/
' _( E/ Z- i' k- C( ?5 n
long get_ram_size(long *base, long maxsize)
H; j5 d2 I, S7 x" [# I
{
7 K+ }% b: F1 h( _+ u; Y
volatile long *addr;
. Q% X3 s2 D8 f
long save[32];
# a8 D3 O+ }3 V1 Y
long cnt;
' K; l6 S4 M3 Z, {4 v
long val;
. I+ O! F; e3 Z8 s- y8 M# I
long size;
: j# t7 Y- b" {
int i = 0;
$ x" x( B/ Z* C+ M6 m
# |9 w) ]6 Y R* c, v3 u+ n. @& H
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
* g/ O8 Q4 s( r2 ~; S
addr = base + cnt; /* pointer arith! */
. S7 ]; H8 I2 Z5 o
sync ();
# i8 |0 L6 B p. {0 p; L
save[i++] = *addr;
: L9 f( ]- d6 ~
sync ();
; u4 F5 e0 i& T$ w+ L( ~6 D
*addr = ~cnt;
4 f) s; f7 X/ W) C& g. {
}
, k* A/ z) X5 E
. ?1 T" I& b8 [) h
addr = base;
0 i- o/ Y8 {, v7 c$ t8 z' X
sync ();
; Y8 ~- ~. p7 d- @/ S5 }& U
save
= *addr;
: T0 N( S# y6 h6 l, q6 i& D& v: C6 |
sync ();
9 s" [5 S7 X( E0 c4 v; {$ Z3 \
*addr = 0;
2 f* o" [) Q# h8 L- e* a- ]
7 Q+ x+ Q6 W& ?
sync ();
3 J6 i5 e2 v* K- M% a
if ((val = *addr) != 0) {
6 F( v, `; } I% e% Y7 |
/* Restore the original data before leaving the function.
7 @" _: `3 w4 {/ |* K2 L' A6 f
*/
2 i6 w6 Z% q+ d5 D
sync ();
: i5 o# P* q( |, G7 p9 u
*addr = save
;
9 Q/ m/ P7 x) g, _1 o% y9 N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 v' v: {- Y5 ~% Y/ D% X
addr = base + cnt;
E2 `& n1 M9 K! ~: k, Z+ M
sync ();
3 |, G5 {0 [4 l8 N+ ?# _
*addr = save[--i];
3 P6 X% G4 H5 w" M2 G1 q9 m. s
}
2 S# Y% P# {& p
return (0);
. I% C+ H6 A: ~5 u# c& W5 d
}
% b( u& m5 D1 S! A
4 O, p3 \7 e* u' r1 G* M Y$ W) w
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ a/ C( ?# }1 w" `# G
addr = base + cnt; /* pointer arith! */
/ j/ e' \- K; [5 e& \9 x |2 D; j
val = *addr;
" M0 H. J7 G/ X: Y6 g
*addr = save[--i];
/ q2 ^6 |+ A% d) h% k8 m( j
if (val != ~cnt) {
' ^& Y6 R3 R; U
size = cnt * sizeof (long);
8 E/ e! \( C3 A0 c& c) D. V
/* Restore the original data before leaving the function.
& J9 i2 l; h) e5 c
*/
9 a! r) Z2 {& O9 c, I# @- Z! [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ?( b8 |, x9 c" z0 C. u
addr = base + cnt;
3 n8 @5 [. k! L3 H) w1 t
*addr = save[--i];
" w" T, i B" y4 O3 u
}
6 \0 S- \3 L" n- U( Q2 d2 n
return (size);
1 r% |+ A7 p4 q/ J) X
}
+ f- J; I) Y) I- m6 S7 k
}
& V( j5 q! o1 g8 M
- P9 @6 m; ?9 x: Y0 \# G4 f3 o
return (maxsize);
( W/ l* t# q0 Q" I U
}
$ ?9 s8 d2 l: Z4 ?% k; {
int dram_init(void)
5 ], l" J+ s3 P/ r9 X4 E4 X
{
% N" r z' o, Z/ i$ M: U8 w
/* dram_init must store complete ramsize in gd->ram_size */
6 x# y( Q3 W) ^6 [1 `
gd->ram_size = get_ram_size(
0 m$ ]8 T7 o% a5 U: C" H: S9 r, t8 o: K
(void *)CONFIG_SYS_SDRAM_BASE,
- m1 {" t# h, q
CONFIG_MAX_RAM_BANK_SIZE);
q0 Y' C6 f& D/ @/ H
return 0;
2 x$ {- h1 C2 N/ I( F9 ?5 G
}
& _2 Y0 k0 t) A+ L% Q# w
& Q+ S( N- n1 v' H3 Z& ~3 \
) u/ f, {' n3 Y/ v
+ c' B1 T; ]' S, B: p. w4 X
7 ]: D- y7 _3 I- [
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# o N c3 {" y k# J R
' q1 D8 M( {+ Z6 Y% c
. r' ^ Q9 ?' n9 T0 K5 ?8 E
6 ]+ U5 F4 w$ O( j) s* L
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4