嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
$ Z, s1 O) u# x. V! |$ C1 `( Q. l. j
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 Z% v' R" H* m" m+ [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ e% ]& v' H1 T( n
8 @+ a. ]( H1 s5 y! [- U- D
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
7 S4 N( _6 x; L' ?( n* j$ Y
) Z% U, {2 \, ~* Y# I1 F& v
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" N! ~. R% {* i$ n, V
/*
" x! V: ]8 C! W- Q) m
* Check memory range for valid RAM. A simple memory test determines
" g: s; W. A$ A! v0 X
* the actually available RAM size between addresses `base' and
Y$ |$ F% n% p& [0 g% q
* `base + maxsize'.
3 S( d7 d- c! `6 Q- r" E+ E. z0 [
*/
& s% c' M7 x7 t+ G$ \9 r% @/ L
long get_ram_size(long *base, long maxsize)
. j- M6 d" q8 v
{
9 c. G6 x b; v- O
volatile long *addr;
! N; f/ V6 a: p9 K" |" |
long save[32];
7 j. |9 `! T1 g3 y5 m
long cnt;
' [7 N! X/ r% n7 w! \
long val;
# _0 c! E; K7 u- k/ D5 j
long size;
0 |1 D, |6 i {! h6 W8 i7 n9 k
int i = 0;
n; m( }% s4 O a' h
& k8 c( }- B. I7 U3 J+ K. C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
5 v' `$ x# q6 f1 ?3 A; c
addr = base + cnt; /* pointer arith! */
% c# p( U. j1 T) J
sync ();
# y3 O- o* J8 S8 o+ p
save[i++] = *addr;
$ \ R: j: {# R% \$ k* \
sync ();
) {) n1 Z7 H" f) t3 g, l
*addr = ~cnt;
. h3 |/ b- s' v( ]: M+ i
}
% Y/ W! ?- X' U) B1 O! Z
# N" o) P* i0 t: E* z! t! E) s
addr = base;
8 p: ~% M8 B$ w* K& e
sync ();
" I \( Y- ?9 [1 A
save
= *addr;
E5 h) v- R) ] K9 o9 s4 u- z
sync ();
3 {) ?0 E0 o: d! x
*addr = 0;
g0 [" `" v b' G$ ^9 {! C
1 R- v; {& ^9 b- H
sync ();
: e9 D$ e& O0 r
if ((val = *addr) != 0) {
! y3 ^5 d# f4 E) V: K- e3 Q
/* Restore the original data before leaving the function.
; l0 R \5 @+ y' z, h" E
*/
& e) I$ |$ ]% U6 I# O: ?0 f
sync ();
( W9 L. g0 Q+ E- b( I
*addr = save
;
4 I& X6 g5 ~/ K: g2 V. F; b, `, ^
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ l5 L) v% s1 m8 s& e' j. Q" s
addr = base + cnt;
0 u% y3 W6 J* u. v
sync ();
7 p( N/ G8 u4 s) T0 z
*addr = save[--i];
! F$ w5 d5 Q. K; w
}
& r0 }3 k- ~% R
return (0);
; i- k, L2 f9 y
}
$ T" T6 w) V p2 c% L* g- ?5 ]
6 p0 r( u7 r: u4 W6 ~) U7 F6 h
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% i$ o* G' C- x' t! ?: V( D4 i( u
addr = base + cnt; /* pointer arith! */
% b1 R+ U$ I3 _2 }( ?* Q
val = *addr;
/ j1 ?% O D' w
*addr = save[--i];
' w6 V1 X7 p4 P/ W9 i) D" {
if (val != ~cnt) {
3 _6 x" q2 O1 c+ L7 ?8 y! o* P
size = cnt * sizeof (long);
* P6 [' C" ~( Q3 O
/* Restore the original data before leaving the function.
; S# [; ~- b& ^- L
*/
& o K& s5 W5 r( f! Z: X
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 C# r9 H$ O2 |% I
addr = base + cnt;
2 c2 ~8 |! G' K' u) D- `% f. g) K3 n
*addr = save[--i];
4 `' G Q' h- ?. Z/ N# e8 |
}
* ?6 ]/ V' y8 ]
return (size);
4 d+ U4 y5 f' E! g
}
" W3 l1 c- Y9 x/ w2 ~& a
}
0 w. t3 Q) I8 W, w* ^
) p% P( t; S- N4 Y: [
return (maxsize);
0 ~0 ]: F6 f. t; R4 [
}
# \) J o8 p1 Y5 m
int dram_init(void)
1 S' X0 V) Z; d& u4 M
{
0 F C0 o4 ?7 \. }- u& v9 a- G0 A
/* dram_init must store complete ramsize in gd->ram_size */
, A8 x& D4 O% ~
gd->ram_size = get_ram_size(
3 ~/ ]$ Q3 K' V8 { x, k
(void *)CONFIG_SYS_SDRAM_BASE,
" t, V9 i" O' i" F% a6 m
CONFIG_MAX_RAM_BANK_SIZE);
& M) _+ h( R+ l$ N, A" @! Y
return 0;
( f( i: Z6 E' z( X2 T4 N
}
2 e+ U: [2 H4 m3 w2 v
& ?/ s/ X4 r& e/ i5 K3 t
2 ~* a! g/ k$ C% x' I
8 M O) b0 c0 E. r/ B. h) ]8 T; A& o, @
, y/ O1 V; `. @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; k- i$ `8 U' K3 O8 h% g$ A: I
" r8 E/ N5 ?8 r7 K7 m% @
# f% t& Y5 K r- h2 [
' F2 O" ?- v# K+ a- ?, W
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4