嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
v( E' V8 Y2 b
核心板2:DDR2 256M Byte NAND FLASH 8G bit
0 b+ q! A7 {/ L! f1 j7 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; u; @9 b( q) S/ n$ M
: t" `+ _) {5 \, v# p
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
o8 P$ c3 i, q1 M
. [( \$ T) t2 T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
' \6 L( G6 W+ c% V
/*
' ]) X- T" d0 L' u: f
* Check memory range for valid RAM. A simple memory test determines
4 L6 A' M- h0 V# b9 X
* the actually available RAM size between addresses `base' and
/ P% A- j' i. P, y) p
* `base + maxsize'.
) e: }$ l# d+ D) N. T z0 w
*/
8 F" X1 l" o* O
long get_ram_size(long *base, long maxsize)
$ o" u9 s Z& ]
{
- }$ s6 d+ ?' w( \0 ^7 O
volatile long *addr;
5 N7 W% J5 Z9 q- l, H
long save[32];
. A) C, f5 ~7 ~* u& T
long cnt;
) [1 {5 K0 X6 `
long val;
6 I' r. H( @: x) ?4 p
long size;
3 g! c/ t8 H d/ a2 H
int i = 0;
/ {$ h& @& F- Z# m3 y
3 Z- K5 O4 a6 R) m) Y
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
& X* Y/ [" j9 u w1 j m
addr = base + cnt; /* pointer arith! */
- f8 y$ @: v% z+ q( O+ O
sync ();
' m* S; L: X$ J" R( a% n* l
save[i++] = *addr;
$ B% F% _# N# t9 y4 b# V* i( K/ q
sync ();
4 [; w3 Y0 J8 M$ a( I* P1 W& Y
*addr = ~cnt;
% }4 F# t! V, t( V4 S
}
7 p, i$ C3 ~+ }: r' H% ?( r
5 H) T2 H, G ?4 C* f, T: |* y
addr = base;
9 J1 D# n9 M2 Z) c% Z
sync ();
9 u" H( ?: F3 j
save
= *addr;
" U/ ~1 l- p) r1 u2 k& z& g3 C
sync ();
6 ] e8 l& K+ i: Y" y+ ]
*addr = 0;
7 J( T! y# Q5 t1 ~' k3 i: F
* F& C! }# q! q* i4 u3 q' E7 G' H7 H
sync ();
4 ]: j$ o, K; ?% v b% h# j
if ((val = *addr) != 0) {
$ u* U5 V" T5 X0 A& C) J
/* Restore the original data before leaving the function.
" G. I5 e6 t+ `
*/
@: Y" T. o7 y! F: o& s% f
sync ();
6 m; f* F. p4 M
*addr = save
;
2 r9 ]- f* @- Q! ?" h+ q: v
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
) s& K5 T$ s1 f) W% }. n2 D* G2 M: Z
addr = base + cnt;
4 ~( P% M9 c) O7 x ]# [
sync ();
Q4 K" U/ ^; b1 C8 S W9 q
*addr = save[--i];
, M# k; O" b* E) s" k& g
}
3 P# \$ T3 `. m N/ q- e; V
return (0);
: m) b3 C& k, U1 ^9 m! `. D
}
7 ^0 g0 W( S1 A% x: d, q' y
. F3 V5 {9 C8 i& ?9 @
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
/ Z- b' n E. k. P$ x
addr = base + cnt; /* pointer arith! */
4 k% y! N; T) a: m# e3 f' ?
val = *addr;
5 w5 j: b0 i( F
*addr = save[--i];
! h# F9 {6 G3 l) B
if (val != ~cnt) {
h% i' } w" M* X" ^7 T
size = cnt * sizeof (long);
6 d! E* w3 E, \/ H
/* Restore the original data before leaving the function.
5 E6 H4 M/ r' |! _! I/ f* o6 j
*/
% f8 t) m" D& l
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
! @1 N3 n) l" m, H2 `9 m' }0 }$ g
addr = base + cnt;
6 D) v6 Z2 s1 g" O% S' e: `
*addr = save[--i];
, S) I0 D, M7 E
}
0 y# Y* v! D3 C6 s R
return (size);
. J4 N% F4 l0 S8 K% x0 ]
}
) I0 n+ w% d9 j$ D. K% R) \& q
}
# V% M3 P! L0 S) v! \" L- ?+ m
; J" D, X+ a$ w
return (maxsize);
9 N. {( X% a9 k2 o) b `
}
6 ^. @: z+ q4 m# K9 r, Q
int dram_init(void)
c9 A: Z; \" c% D# y; _
{
# D/ a( _5 c7 v3 G+ C$ M& M w
/* dram_init must store complete ramsize in gd->ram_size */
+ K& O% h1 |+ W2 h
gd->ram_size = get_ram_size(
8 P6 w6 t1 A2 K: |( \+ ?
(void *)CONFIG_SYS_SDRAM_BASE,
* i" R; w1 D) X1 c' a8 N
CONFIG_MAX_RAM_BANK_SIZE);
! S8 a/ I/ m7 L! N% X
return 0;
$ f" y# T5 V( G4 T' C3 H
}
% s* y) \3 y. l% `
3 [3 Q5 y5 m1 ~4 H' H4 ~# E
0 y4 G& C6 h: W8 l' m2 r4 l
j- t Z- h9 a8 r
: w- A; b( ?7 b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 E6 L2 l( @2 d6 m5 i
+ O$ E5 u- d9 X: n$ m. V: X* A
, z/ y6 w0 f6 `* Y
+ M+ w, i; X1 p; H3 g( Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4