嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
5 m; v- h( C+ ?" ?1 w1 f' @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
+ x5 d/ Q! s' ~/ z) k2 e
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
) F2 v( L8 B% D. m
$ H0 b# ]& P/ b! }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
/ n8 V7 F: D$ \, X" E
! y L3 l+ c& K! P8 z
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ J7 z4 B: t% e
/*
. [3 B, m- [; q% A- g1 i1 J
* Check memory range for valid RAM. A simple memory test determines
+ y6 l, A m2 k2 g
* the actually available RAM size between addresses `base' and
3 d2 r; \7 n4 @2 i s
* `base + maxsize'.
9 k4 k+ D0 c* z; s1 v
*/
6 G0 M" s9 G& W4 U, _9 y a
long get_ram_size(long *base, long maxsize)
( G* R' u% q# e0 D8 Z- p P
{
5 }* _* S- z) o) G' U, `
volatile long *addr;
+ N' _" H$ W8 Y9 j8 M
long save[32];
; K; o9 F# ~0 q8 u& L! o
long cnt;
2 J8 k" w& p9 y( }
long val;
8 m/ E( A- P; v9 d9 M
long size;
* P1 o6 R, R9 `9 Y
int i = 0;
) }% R+ v( o& P, T
, M; m+ c0 `# R4 s+ U' E
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
1 Z- a* M0 A. k9 K" D; E
addr = base + cnt; /* pointer arith! */
u# D6 R8 g- `( M; C
sync ();
/ C" S, Z5 }1 q
save[i++] = *addr;
: G! u7 r$ _4 y! y! N" m' ]
sync ();
: g. I' V, v9 T* @6 V& u5 s
*addr = ~cnt;
L' l. ]9 J$ u7 Z4 R. Y" ?) E9 L
}
8 Z% K0 Z7 G7 k2 f- }! y$ J$ R
1 R, D, M' \% E% D/ P
addr = base;
( E0 h1 t& ]: `3 y3 k0 g8 u
sync ();
7 W" Z- Y( T8 M4 H
save
= *addr;
2 ?0 n7 W3 E" T# S3 W5 V
sync ();
/ C5 U, k! v C: l% ?6 H5 N
*addr = 0;
8 B7 s) U, I1 v- E% L- Q7 H% O/ h
0 ^8 ?8 R6 }+ E- _& C% F
sync ();
- k2 d" T- m j2 @* R* V3 |3 r3 |
if ((val = *addr) != 0) {
/ z7 D& {9 l, ?$ F6 V
/* Restore the original data before leaving the function.
: ~$ P, ?# g# ~2 _, w8 b
*/
, M, `2 H# x2 C& W6 Z. _
sync ();
" {4 H* \' U8 e' a* t
*addr = save
;
! n4 E0 h. e3 r9 h; i! C- `
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 a: P* Y) ~2 ]% d& m* x4 O" Z
addr = base + cnt;
/ V( _& u4 i. i9 _
sync ();
+ ? N! A, D. R' @9 ~% Z' m, ~
*addr = save[--i];
. s) l1 @- C/ Y5 j& M( ?
}
( }5 \! R0 c* s; p( f
return (0);
9 t G5 E+ B6 l" l1 T) L D, p" t" H
}
) S8 A1 i- q% s7 D! l
4 N- G, Y1 s. R9 Z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: r' V% [& z/ {; X. N
addr = base + cnt; /* pointer arith! */
+ m" Q Y9 h H+ t$ ~- Q; [) y7 ?' S- t6 K
val = *addr;
0 x" G6 g5 t+ Q
*addr = save[--i];
; x1 J& T7 z7 u
if (val != ~cnt) {
/ @' g M& H' R) T3 F5 g+ x
size = cnt * sizeof (long);
% W( w' i. u: k" q! X7 K% M
/* Restore the original data before leaving the function.
2 V' R X& [: V4 M7 b
*/
$ z7 s* t" d* [# l( h
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- I& d P' J- l0 u7 W+ ]- |8 o* P
addr = base + cnt;
# L. P& Q9 N% J
*addr = save[--i];
6 V- P/ ?" I" G9 j6 }/ j0 ~; E
}
) r8 a7 d f$ a' \% a6 X
return (size);
/ V$ x9 Z1 g8 W* P5 b5 ]& e
}
* l' W1 S) @0 T2 D& j& a0 g
}
$ C: U( R1 \% V# P3 g* h
+ s% Q5 u( P" f% o. A B1 X
return (maxsize);
) \9 |7 a [5 ~4 ?; F* w
}
$ x5 `5 @* k9 O5 f( y1 t# P: j! R2 {
int dram_init(void)
5 U* \( r# _: x! F: K! z
{
- l0 T& S) o( k8 J
/* dram_init must store complete ramsize in gd->ram_size */
$ b4 R# X8 c& X
gd->ram_size = get_ram_size(
( [% r) R6 @; D7 r+ m" E/ w9 {
(void *)CONFIG_SYS_SDRAM_BASE,
( ^/ ]8 p+ n$ @6 \# R7 _
CONFIG_MAX_RAM_BANK_SIZE);
. o. B3 `- f, F4 F" w) _8 N# C
return 0;
8 g" A8 l8 ~* m5 [
}
& @: \, T2 ^% W# v' c/ c" v
* I0 i+ ~2 U7 _$ N
* z( o2 F7 A9 a6 s* j; J: X# n
. a0 k( u- l& O% i: U `' g
+ s! v$ {1 [$ |0 ^/ B5 j- P( Q
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
( g' a* ]. U0 Q2 s; [5 d; B. f
+ s7 ~- ?% A' n# X% F* y0 X- o- E
2 v5 E) O+ @( i9 C1 c0 P# D2 v: n
$ D9 x7 W5 @ @& T0 x, ^7 ?
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4