嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
7 [# [1 v3 A" d% A. V
核心板2:DDR2 256M Byte NAND FLASH 8G bit
4 R+ s9 ` l% |& ?5 m7 W
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 l1 j1 \% u6 O8 e. d
0 t0 O4 A5 M, u9 Y% ?8 F
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' j& ]$ o, l1 {! K& I
7 H/ H; {/ s5 o
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
. W2 s2 W$ y% V, V3 ?
/*
) a0 ^0 l8 B( P* p/ j
* Check memory range for valid RAM. A simple memory test determines
( S( m# r, c$ I3 H4 q
* the actually available RAM size between addresses `base' and
. K2 Z' K h0 a- l2 Y" {, z6 V$ m% r+ ?
* `base + maxsize'.
8 V$ s8 b0 H1 K/ |2 @3 w
*/
% _* K6 x, ]% V; L) F" X# C
long get_ram_size(long *base, long maxsize)
3 B6 } l+ x4 B" P- j9 w9 V
{
0 ^# Q/ v/ m% W! }3 h: X
volatile long *addr;
~, J, Q1 J3 ^0 ^% H& k
long save[32];
8 B% y7 Z, n/ l: Y! [7 r
long cnt;
' M! t6 ]( b1 o p8 `( m
long val;
8 i A# m0 c0 m: t+ u. u$ O4 v
long size;
2 q7 q2 @. T) X; Y/ g
int i = 0;
! p) P% V# b; G$ N7 N/ G0 z3 c
$ B% L- v1 D$ D* R8 t6 K
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 X# G% {- x3 n# _2 _. L" D5 {
addr = base + cnt; /* pointer arith! */
$ H* u0 m* O5 _" z8 o
sync ();
5 c* v4 J; R ?
save[i++] = *addr;
6 W4 E: E" b9 U* q; e5 x P! P
sync ();
% ^+ ^+ Y* B3 W. S$ K3 E
*addr = ~cnt;
% m9 b: |5 q# U" a
}
, _$ U) x- i4 Q" O. ]$ x& X; f/ z
0 I O$ a+ J7 E$ ]
addr = base;
% b+ p- O- T: k3 f- w2 Y- m2 ^
sync ();
) f9 D) c* }# `- k
save
= *addr;
- U& ^+ s7 [ o( Z0 a' a
sync ();
) Y5 H. P- n) H( b+ n% S" d) o, {
*addr = 0;
+ f w1 T$ f# L* {
0 g( a) H# ^1 O# L
sync ();
7 {# } I7 u8 C# t
if ((val = *addr) != 0) {
1 D# Z# Y9 p R
/* Restore the original data before leaving the function.
2 M# x6 N3 v. O# o0 {2 o. C
*/
. t8 _3 k0 D! V6 }: m
sync ();
; V k+ ]( t2 e4 V7 s$ y
*addr = save
;
' w: y% p# `8 a4 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
. ]" p9 Q- n; W4 B1 R
addr = base + cnt;
( s N1 u5 a, V/ m) n2 T
sync ();
7 l3 {* c9 n! V; X1 A/ {. O- L
*addr = save[--i];
& I' L$ K6 W1 K0 N, G4 c7 \
}
) W* ^, o4 G9 g8 y- j t
return (0);
2 s) @0 g) v0 e3 B0 ]6 C- M5 ~
}
`! g G, C. X) |: V1 r5 i$ d$ \1 p
( [+ }: s# m! L1 ~( r1 t
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* I# K+ {% c7 ^
addr = base + cnt; /* pointer arith! */
7 ?7 k v( k7 A# G
val = *addr;
! P7 s, o8 @. S( A
*addr = save[--i];
2 t1 _3 [% t1 V+ O
if (val != ~cnt) {
4 Y; E3 W# M, ^! l: a. Z" \* e
size = cnt * sizeof (long);
- U+ H: h) D& W7 r9 ^3 L* U
/* Restore the original data before leaving the function.
3 u4 ]; r; j/ K0 m; m
*/
) ^) b3 P$ o, `+ [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( y* Z9 K6 u9 I9 g: ?8 l( M9 g
addr = base + cnt;
" W3 I5 C! P9 t" }2 H# v/ ?
*addr = save[--i];
$ [8 X1 i) p( l4 A6 R [
}
1 g ?% C0 o: U7 Q3 ^# u# k
return (size);
0 V; m, U' c9 s
}
5 u* J1 ]% S N4 F1 q
}
4 g1 j# S* g: h' B' f
% {: W& t! d' ^
return (maxsize);
U4 l( R( r1 W, p, W# t
}
, u" W9 f. J4 f5 `4 \9 M% K, P" F
int dram_init(void)
# R0 \; V( a$ l' ?# H
{
2 i( @5 \! p3 a1 J/ F& ?
/* dram_init must store complete ramsize in gd->ram_size */
! m4 Y; |# a7 B
gd->ram_size = get_ram_size(
/ a9 i4 W* `7 Q3 W; K
(void *)CONFIG_SYS_SDRAM_BASE,
* l F+ D& {* u% Q" g
CONFIG_MAX_RAM_BANK_SIZE);
) ~8 _, o- E* w3 m6 | O6 B
return 0;
& ?" M* V3 s) F( E: H
}
7 }4 }7 @% z9 N( R' j& ^
: ~- _, @5 C, P8 V
. f& z( O* Q! E: w1 T* e) z
! O1 B7 m7 Q5 D( V( u
3 C' C: R' ?6 q9 |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
1 k# I# c0 T% f- T& D" @
1 c: w! p% g% k+ g
% k* g' `; a0 ]- `) ^" |- r4 D
l- B: b* c8 c; m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4