嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 A* A7 A' f/ W4 x* Q% O) g) \: C6 N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
9 V: M8 i, p I
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 C$ O4 r9 O5 b0 Y4 Y
9 R" Y) G T: J# r' `- o
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% X) h) w$ k1 {! {" _: m
- \, T. O1 }4 V. Y
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* I2 o4 M' o; Y- s6 A; c8 l
/*
/ F8 E0 ^. T$ H6 s3 ?* c
* Check memory range for valid RAM. A simple memory test determines
) t6 w) E9 F* p' @
* the actually available RAM size between addresses `base' and
& @! d+ x M9 G& J4 Y7 [
* `base + maxsize'.
" G1 J3 y! O9 U: w5 S
*/
/ [( M8 h" w" h" g; v5 ^
long get_ram_size(long *base, long maxsize)
' O+ X6 V( x& i- y J
{
0 {0 h) p* ~/ f P
volatile long *addr;
2 ]4 m+ q! F) g' r+ B* C! b
long save[32];
$ F# Y, J. C I8 ~) x9 v: y) c
long cnt;
8 J2 C! _2 E, e, t3 G, H# t
long val;
6 s$ g, j* q; t/ Q; a$ ]
long size;
' A7 H* U" h! S, i& ?8 I! @+ D) [4 \: @
int i = 0;
% @8 }9 ?3 a8 s& S5 }, o' M( _
( Q" q, r `2 \0 F& K) T
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
$ i4 u8 ^. `- J4 ~0 u' M
addr = base + cnt; /* pointer arith! */
9 e3 j9 J. ]8 y- z
sync ();
8 z+ |/ @, a; R
save[i++] = *addr;
, U) P }- I* `; w2 w; U
sync ();
" p4 m, E( O, W s9 ~6 R! n3 k
*addr = ~cnt;
: s4 W2 \/ v1 H, B6 ?
}
* f: G: b) T8 x5 O
! R; m7 ?% x' `# R* Q
addr = base;
0 {4 @ L. _2 @3 @) B6 I- E( }$ b
sync ();
& O; @" G, G" U6 z' X! i0 D
save
= *addr;
* j/ o( n& P9 E- y
sync ();
' w' ~$ @7 v/ W) l6 E# J
*addr = 0;
5 T0 [+ R) ]" {
1 V- X2 ?- `2 y& Z- b/ I0 G
sync ();
7 b) @3 J: e2 M" ~
if ((val = *addr) != 0) {
$ l5 l# k/ s. V* z* k0 O* x
/* Restore the original data before leaving the function.
9 r! C# M* L3 w6 Q
*/
0 f/ P# R0 L5 k6 i* h# l8 l( N X" E
sync ();
! a! f! i9 e, {" j
*addr = save
;
6 L( [0 x* I- i
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 S3 t5 r! X2 D5 O; g
addr = base + cnt;
: K' Z3 Y' w$ K6 s2 ~
sync ();
, F7 q6 _( @8 k7 Y- d* A X
*addr = save[--i];
0 |9 c( Z" \$ s
}
! B+ h1 T- b( t
return (0);
% e# U5 w- f$ w+ v
}
3 K. J ^* C* a2 g5 l3 |$ c. @+ D
/ S, G. i. _# }- N9 E
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# m2 F" } p( c1 d
addr = base + cnt; /* pointer arith! */
* O# N+ D9 o; o4 I
val = *addr;
, f( m) W' L9 f7 e0 z X
*addr = save[--i];
. C5 i2 f* K7 j4 b: @
if (val != ~cnt) {
1 ^" L" v1 F5 B' }/ b
size = cnt * sizeof (long);
9 a0 C u* h8 R6 w
/* Restore the original data before leaving the function.
; v$ s2 |: L; \5 E2 k
*/
. V, i7 l; g, O
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ u; r$ ?/ G) P# x% {/ F
addr = base + cnt;
4 I# G( T( x: v8 C6 V
*addr = save[--i];
6 A" A* W8 d/ M. l) a' T
}
6 ~4 I( f8 V/ W" k' e
return (size);
+ d0 [7 W* p4 z# ]% p! f) \
}
4 N3 \) E) J8 t6 P) `5 t
}
7 k0 F0 h: \6 B0 y% R& Q6 u/ j
7 z( d. d8 y% J, t9 X! A
return (maxsize);
* N4 ~: k( S% j. ?2 Q
}
# @# Z! _( P& ~% L' H
int dram_init(void)
0 K9 W5 t. R& b" V# h6 S
{
# ~- r. ?8 Z' z! n3 k$ L
/* dram_init must store complete ramsize in gd->ram_size */
6 { J! a/ Q1 ^
gd->ram_size = get_ram_size(
" h; X1 w) u0 I! Y% c+ M- k
(void *)CONFIG_SYS_SDRAM_BASE,
+ m+ w9 C7 J" P# K
CONFIG_MAX_RAM_BANK_SIZE);
9 R8 [9 p' J$ @+ O# b& S2 K
return 0;
+ U: A5 o/ C( H
}
& d. B+ e2 b- `' N; U8 v
8 j) O# ?- @& ~2 }# P
1 a, V1 \7 o! `- h) e0 `6 D4 J( [
, o9 D3 E5 u" ^
8 b8 r9 u2 V, u+ I2 \
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ T0 t! T" y* }( M7 R- X
7 O8 a/ |/ ]( s; r
7 V: {, Q% R! |$ e
- F, L' r" P# R; z1 Q
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4