嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
% ? J! }) ?" H2 @
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 @: Q7 f2 l3 J- K* Z
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
0 h' M, v. o" q, y
8 ^& ?. f+ ~3 D; w, n. ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 m. U8 [0 ?* j$ M/ C7 P: }
& _/ }( l2 n4 A( x! B0 }
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 O' B! {; M7 I! K& a5 b* _: U8 V
/*
' H' P1 a, M6 W
* Check memory range for valid RAM. A simple memory test determines
; V* j3 f( \" t& C- [
* the actually available RAM size between addresses `base' and
( u8 [! Y5 G% K" C) H H
* `base + maxsize'.
; D$ \5 y! |- k: T* G
*/
, z. S" p0 t) G
long get_ram_size(long *base, long maxsize)
$ |' t o% `$ U6 V# u% r
{
% y' L. C) X; c+ |* `. D
volatile long *addr;
* R9 T H9 p/ w6 x1 N+ E" Y* X
long save[32];
1 e0 l* E: B& i% c- x, j; t
long cnt;
% x+ v* P' m, ^
long val;
+ o7 p T- ^- q6 M
long size;
, ~2 y) f: i7 I$ v
int i = 0;
, a- d O3 }7 l9 H; l
& r3 K2 y* I& Y3 p. P+ A& k9 u. L
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
4 `! h6 J, ]+ \6 u3 [$ X
addr = base + cnt; /* pointer arith! */
6 W9 v+ n- O1 U2 N
sync ();
/ o7 q3 f- x) k J" v% p6 G
save[i++] = *addr;
" q8 X# k; j" d. o C3 Q `3 i1 L
sync ();
9 r6 L$ o% ?7 Q; k
*addr = ~cnt;
- C5 J4 W3 v0 ~4 e
}
; `) S n! [- a- X7 ?
, x1 Y% d& v3 x! h7 M8 ?
addr = base;
- W; l- p* _. S$ r! s
sync ();
) T- O3 r! ~9 I5 |" t# N" y3 \
save
= *addr;
! Z. o J% \% g# I3 T, }6 X
sync ();
$ t. D$ D+ b/ q+ h0 }; q
*addr = 0;
+ e- V' o2 N" k; u
" e! @ Y" ?2 `$ C. z% O
sync ();
; F$ d8 L% \9 h0 K" j' h
if ((val = *addr) != 0) {
h$ p( P# e' K/ z$ b
/* Restore the original data before leaving the function.
0 h, a0 q( Y: |$ \, m* G
*/
$ z: ]5 `7 c- b: a/ b7 R
sync ();
9 n# g+ j2 c* W
*addr = save
;
) u1 _3 I8 r9 c ~1 q5 a. N
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ ]# V2 a7 \- v, ]
addr = base + cnt;
5 y7 W8 h) l1 `0 Y' [$ ^
sync ();
' r- i0 h. s& U7 S$ b
*addr = save[--i];
0 p. u( g+ Y* w8 u% u
}
9 n* [/ W' `/ S' j& t$ i
return (0);
' ?# l. d) f! d9 V
}
* h7 G7 T+ g% N( W* T- z
/ K- E" z; O' }
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ a# ?# X( ^1 E$ [7 u+ C3 _ s
addr = base + cnt; /* pointer arith! */
7 { Y7 o" j0 @# @! {
val = *addr;
. k+ W; Q' M) \% `4 F$ X
*addr = save[--i];
7 R4 f, v# F+ p* K/ T
if (val != ~cnt) {
5 r. ?/ o3 c: N' m
size = cnt * sizeof (long);
z' E$ F/ C' k$ f8 O9 r
/* Restore the original data before leaving the function.
- {! q$ k) T/ ]* h4 Q
*/
0 N2 h1 _0 S: y; b
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 g$ F1 G$ W4 ^; B3 t( X
addr = base + cnt;
3 T" ^% d. a5 k4 H
*addr = save[--i];
; c R) m* Y0 c; m9 J
}
% o0 ?0 Z& ?9 w" K/ }1 W' Q
return (size);
2 B V& ~, u# j
}
4 X( \/ R- Z! \, @) m
}
0 A- w H: f4 s$ g
5 K: }) a4 z! K/ S! ]! q ~
return (maxsize);
) h7 ? M8 W% W0 O) X8 b
}
: F/ d( @! v7 g+ W
int dram_init(void)
# v5 @! T8 A8 A: J+ c6 P! h
{
. V9 i, S' m" c: O1 ^
/* dram_init must store complete ramsize in gd->ram_size */
% x; o* `# R* s& O6 T7 _
gd->ram_size = get_ram_size(
% o6 t9 \. j6 V, K. n
(void *)CONFIG_SYS_SDRAM_BASE,
" Z! _( K$ f0 ]* w
CONFIG_MAX_RAM_BANK_SIZE);
& \, p4 }. k( S! D4 b
return 0;
5 [% G, B5 j0 d4 `2 D
}
" h h1 {2 b. W' ]* t7 t
) O8 o" M' \- P3 e
! x" u9 G9 ]+ P: Q
% _: ^: W5 N1 Q8 o$ B1 [9 Z- \
; e6 A4 [* {* \- Y; ?; a" w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
4 H9 r4 ^# _: v4 E2 A4 F
& ]7 @8 D% @ U( K" q
2 c: ^3 n5 U, y* J1 Q
5 G( \) i* s" J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4