嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- D) g# t/ n- [% M& I# s, ^
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 I- x% v, R( k6 K' c+ {5 b L
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* e6 n. U6 ^: N" b! g9 ~9 Q4 ]
0 B/ }2 ~; b7 ~
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
; M" x& n/ [1 T" y; a5 w9 H5 _
0 D0 F, c0 Z- Y, N! L$ c4 I) H
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 ?0 ?, ^5 g- q: |* t2 @
/*
5 y" w/ a5 L& Z% B6 ` f6 v
* Check memory range for valid RAM. A simple memory test determines
2 g! E+ Y% \5 [) K' O' R: ]" d
* the actually available RAM size between addresses `base' and
' D( c9 J. x# v) \0 Q
* `base + maxsize'.
# r* G Z: U1 g5 f& H* u
*/
# D; J/ h8 q* Y! j6 e3 N. D% c
long get_ram_size(long *base, long maxsize)
) Z8 r3 C" B4 V8 \; O
{
$ Y. l1 {( Y! ]& Y( n9 c, {
volatile long *addr;
. i) w- L( N4 }* u& j4 K8 A1 w/ N! y2 i
long save[32];
^3 y3 r+ e8 C/ q, c
long cnt;
! F* j! P' F0 h: N0 Q
long val;
2 S: X0 a% T) b% z
long size;
$ h7 w. _2 u+ m0 D/ J
int i = 0;
4 C' @" C2 F" P: E5 k" h0 W' L+ Q
7 i* D% @5 M" a9 B/ }
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 N6 f& O+ N- @
addr = base + cnt; /* pointer arith! */
- @1 A9 @8 O# I2 b4 u
sync ();
: f7 F% g8 z6 Y. T* Z
save[i++] = *addr;
( S% F6 @) M# w& } m
sync ();
( V: A, M; v8 A' E1 F4 ^
*addr = ~cnt;
/ {3 ]* F0 o, V/ U; B! {
}
( r0 X& q7 B; a* F
" D' G9 D0 X3 ~: W6 n) L
addr = base;
D7 k4 o7 Y; T$ i
sync ();
5 g6 N# \* G+ V4 W# e
save
= *addr;
1 N& v% g0 W1 n6 C/ ?; u3 H, q
sync ();
2 P" q2 F2 |' s, [
*addr = 0;
8 ]2 X, f' s5 v1 x( V5 ~0 R
5 D/ O/ x/ P; j. \ n
sync ();
7 E5 \& e I, o* e0 E0 N. E# ^
if ((val = *addr) != 0) {
6 p/ H6 q, c8 @+ ~4 h* X7 U, u7 I! Y3 |
/* Restore the original data before leaving the function.
5 ]' g( q0 ^! k& q6 O
*/
( x/ ?, o5 m1 a$ R; I7 {1 r1 t9 L
sync ();
6 b# d5 M" `, H5 Q- @' f
*addr = save
;
% |7 w6 D9 ]- M) W" r7 T
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 s/ y: R4 R; R+ p+ |- L, i
addr = base + cnt;
# \, F) [8 ?# s
sync ();
& S y: L# Q: `' O# W, b
*addr = save[--i];
- d6 t: D+ ]+ {# U1 x$ n/ Y
}
+ B8 Z, c% b8 j! D S6 D) S: [
return (0);
* s, @( x8 @8 _. @2 n0 L
}
0 f, d/ p4 [1 E& g! b$ S+ L9 Q
) u; ]! S! y7 m' ?! L& Y. t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m4 B0 q8 i' {1 c) Q% X
addr = base + cnt; /* pointer arith! */
6 f- ^- G5 _( k) T. ~" O- M
val = *addr;
* r9 v! I( ^4 X3 [; _/ P' @
*addr = save[--i];
# r/ g3 c0 P# o7 Y$ ]5 y2 U
if (val != ~cnt) {
/ t8 p8 L( X' _ _
size = cnt * sizeof (long);
0 w3 E* K/ a1 l0 r% Q' F& y3 s
/* Restore the original data before leaving the function.
$ I, z" L" p7 j$ m, Y. f2 o
*/
4 K. c) b# Q! }! g/ B
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: P9 D0 h0 _; |- [: G% J: x/ }1 L
addr = base + cnt;
6 k2 A1 W( h/ W* K, {
*addr = save[--i];
, M, T" Z3 B k+ ^
}
1 l. ^' }+ x; ?7 |; S$ P
return (size);
" N" M& O9 K% \/ T
}
4 Z% g3 R( M6 r9 b( N3 B
}
" ?: x: X8 z! V6 s- s; ?8 o
1 V; @* ]: r0 b: S6 q
return (maxsize);
" e+ i+ ~7 z/ b7 d. v" y( w4 d8 @
}
4 `6 R2 z+ q8 O/ U8 `& q
int dram_init(void)
3 ~& i1 U: `, M0 F2 L8 ^
{
& Q2 h3 f' w* h2 Y P5 `5 u
/* dram_init must store complete ramsize in gd->ram_size */
8 | k @2 X6 B+ S8 i
gd->ram_size = get_ram_size(
) T b' @. c8 Q7 T& R9 I
(void *)CONFIG_SYS_SDRAM_BASE,
3 r* w/ }# @( y
CONFIG_MAX_RAM_BANK_SIZE);
8 F# P( u' C( q4 H
return 0;
: l9 V; p' Q1 E1 }1 Z
}
9 s- g+ J) M `9 ^8 Y# S2 U
8 ]1 q% e) ]4 p% ~4 i5 b- `6 ]
" t/ {! y* f K* Z# h' f3 H
; I5 C# `* r# ?
7 ]" o/ p4 K' {$ h5 i
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 {( A/ W6 }( T- [ m4 |
. L1 y; k5 Z0 {
% Z8 Y2 S6 i. g2 }+ O9 n3 k
# A' V6 u `# H. d5 I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4