嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 j0 k$ {% q# |
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: J+ F4 u) |6 J* e& F( o& |, b
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 [, Y# d. o% }6 p
7 N6 _# y3 m7 s+ |8 I2 A2 g/ `* |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 b& @4 o) z" h; Q* V
/ A% \) F( h# D- ?
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 J; E+ @. \7 w* f) R: ^
/*
- O7 a% Q3 m( b' r
* Check memory range for valid RAM. A simple memory test determines
3 W' D% O. i4 W% h2 E+ e C- F
* the actually available RAM size between addresses `base' and
, F7 \ u) t0 m$ j6 x
* `base + maxsize'.
$ ]" T4 G9 v5 F% b/ r
*/
' }" l; |: {$ K6 {2 ^
long get_ram_size(long *base, long maxsize)
" Q1 y( w8 u8 B
{
' W! n( l1 f) m
volatile long *addr;
1 b9 S) h5 e4 h o! y$ ?
long save[32];
- X4 |# N1 C/ e j
long cnt;
7 g1 }' {2 o& \! [( ~# i- H# t# G
long val;
, D% D) h9 E; h) u$ g
long size;
7 I- f, b0 [5 G
int i = 0;
5 F( `8 |6 E4 `7 q. f$ G3 b
3 X8 x7 J) p9 V3 w
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ o/ |9 |1 f( }( Q6 m9 g
addr = base + cnt; /* pointer arith! */
: F8 a% K: U* Z- ]
sync ();
& |" A2 H, a& h }: k. P m
save[i++] = *addr;
" a8 x( T: W5 Q) O! T
sync ();
7 k* K) D* g2 ^: O0 s
*addr = ~cnt;
* ?* Y% j; b/ T4 d( j" m- s# i
}
* ?2 ]) S# S. \% U% y. N2 n
+ e4 t$ Q# o+ T/ P3 Q
addr = base;
' [8 N/ Z& h& X3 Z/ n- V2 c2 z) J3 |0 ~
sync ();
" V) f$ c- k* h2 A$ v
save
= *addr;
3 V0 C7 j& k8 i# B4 M
sync ();
) q% U( i0 ^5 Y" j: x) F2 D" T
*addr = 0;
, X+ R% g$ n$ s
7 _6 `. p( b9 ` ?! i3 b/ E8 O5 b% e
sync ();
9 E: m8 B5 ]& s0 |
if ((val = *addr) != 0) {
* N2 M. Y' ~$ N1 d+ R
/* Restore the original data before leaving the function.
* ?/ ^4 m3 w+ [8 W( V1 X' E
*/
0 E$ O3 ?0 j ?7 k: m
sync ();
3 Y) Q+ H4 u8 @) A6 |; p, K9 T
*addr = save
;
6 a5 d& ], N+ ]* ^4 i/ z; q
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 r5 K1 [3 R4 v! y3 _
addr = base + cnt;
" W8 o4 i. \* V9 H" J& {
sync ();
& C4 v6 M! w4 C2 G1 T Q* a; e
*addr = save[--i];
, @, v* M& c, r: d. D
}
2 W# O, N" y6 D, {& O* w4 p" g. ^
return (0);
& B5 U; V( j1 q+ g) v( Z" a
}
v* @4 r. |' j8 A
: m$ x9 v( g+ G$ ^- r, X
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ \- Z/ l0 v) |; H( [( r
addr = base + cnt; /* pointer arith! */
0 S- {- @" U( r
val = *addr;
6 O% s3 R- P: e) I8 Z& `- U
*addr = save[--i];
6 F! V4 V9 i6 `/ {* ~" p+ a
if (val != ~cnt) {
# u' j6 V# u3 R& B+ i. l: ^( M
size = cnt * sizeof (long);
- W2 K. V% N) T. I; v0 M9 e$ g
/* Restore the original data before leaving the function.
" C6 N! o; ]8 ?5 c& v& h0 B! ~7 k
*/
* W7 J7 B% H% A7 z( y
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 q- K# d8 ]8 s0 F7 o$ a$ u
addr = base + cnt;
/ Z/ W/ }8 }3 Y* w- T
*addr = save[--i];
M6 [: R6 g- t& n
}
) ^2 _1 H3 X* Q
return (size);
& B1 x ]% n5 H+ E8 f% z' R
}
# ]4 U9 c2 c9 c
}
" o* |% t& _! s6 i. n9 h
" A# P3 f: H* u+ A1 m; i e
return (maxsize);
: k+ e+ ^4 }5 n0 o p8 z' Q$ e
}
! r" h3 N9 ~# _4 O) J
int dram_init(void)
5 V0 T' R$ W. `! [( H
{
Y9 r; C9 @4 W
/* dram_init must store complete ramsize in gd->ram_size */
& U9 Z, v, p4 s! Y6 D! j
gd->ram_size = get_ram_size(
7 S2 o1 b% M- H- e1 x4 @
(void *)CONFIG_SYS_SDRAM_BASE,
# M- T8 P0 \8 M J& A
CONFIG_MAX_RAM_BANK_SIZE);
0 V; y. Z# S1 i5 n7 d, f
return 0;
0 L4 n! R$ x5 Z. j: q
}
0 U' O" i$ T! c0 u, k ?
" ?; N( ^0 @$ U V/ F, B
* y I$ Z. Q4 B9 X3 n+ e. {" X4 G4 k3 o
1 T9 q6 G4 D6 R/ o# x
0 O7 N7 u# \, m9 f) g7 F7 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, G% @( u+ w8 n9 t+ A
# V4 A8 u& m# s2 w1 i
" J: j6 s: y7 ^5 G. `- w! B6 u
) H( X2 k0 ^. Y( d6 v' ^& Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4