嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
: a, y2 ~' N$ m$ h* }) N
核心板2:DDR2 256M Byte NAND FLASH 8G bit
: \, O3 [1 d* O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
5 w' D5 F8 A0 z5 D) @3 [5 [
5 e f% d1 e$ y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ b0 r; w0 a1 a& v/ L
; |" c* @. s& Q& D3 X: q ^
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 B( G" D; D; Q8 }
/*
3 R- e; H! x+ H9 J# }
* Check memory range for valid RAM. A simple memory test determines
/ L! T# v6 L$ B8 G" f
* the actually available RAM size between addresses `base' and
, e3 T- B# ?; W4 [; f2 x* m
* `base + maxsize'.
7 Z9 Z4 B# N% B" f w. z
*/
0 d$ F8 }1 \7 p3 d& O# d
long get_ram_size(long *base, long maxsize)
2 p) S$ ] M L3 E: f
{
' C# Q+ }! Y7 r6 ?4 P
volatile long *addr;
5 ]7 Y# `+ q7 i2 b
long save[32];
' v( Y* C( I- [6 m2 V0 x3 ^
long cnt;
6 m% x0 P/ e8 Y* `, p/ l) X9 O
long val;
& `' h/ L+ O& N
long size;
1 o6 v+ I1 ]6 t1 O, |, g
int i = 0;
( X/ s% a) f# w" R6 e4 J7 F
% G& \ G1 V/ i
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 |2 d% v5 P, s6 a1 ~
addr = base + cnt; /* pointer arith! */
8 U0 Y$ `2 O* m* u; F5 P. a
sync ();
# p {2 I; A# s1 R
save[i++] = *addr;
y1 L/ F# Z" X$ o3 j! b1 A4 V( c
sync ();
& l$ U7 b8 e& t) {' \7 v
*addr = ~cnt;
# y& `( Q* q" g4 t3 l5 a
}
" r* Q3 E( j Q# _2 f. A$ I+ l- K
$ J0 A" O" a$ X, D5 E+ k4 a6 I% x
addr = base;
6 U5 k3 Y, b( `
sync ();
, Q+ r, g* k; k
save
= *addr;
; ?, b7 n( ?3 _- o" l( x
sync ();
& E: q) ^7 ~. j
*addr = 0;
9 J7 ^+ @9 D5 T
3 k {1 H: M3 T! G% @! M- o
sync ();
0 K, t1 ~0 ` S i2 b: X
if ((val = *addr) != 0) {
) b) @8 D9 h- l# L2 p
/* Restore the original data before leaving the function.
2 r+ [* [9 ~) ^* {
*/
6 q- n7 x$ q! |- R/ j5 m% ~8 |- v
sync ();
! w7 A X& t& R
*addr = save
;
& v4 C% k+ _) N8 z4 v' F
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 w3 J- A0 T1 g+ ^! h: l# l
addr = base + cnt;
. t) V5 u5 j! J& W1 d
sync ();
: U; y7 Z5 x* p# ]
*addr = save[--i];
. v* `$ m1 { S( x k! H
}
# g2 c! K4 n7 b
return (0);
+ G6 |! D3 o2 B9 F+ }
}
: u. @/ _8 A; b5 ?1 C4 @& u8 Y. W
7 \, H' M; Z. w: W3 K8 _
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" t& W# T; ~" J* G* }
addr = base + cnt; /* pointer arith! */
3 _" r2 A" P4 O# E$ {' W3 B
val = *addr;
6 ]% R. U9 P& q5 `" {' A' M
*addr = save[--i];
; m) w: N! K2 q' m, z5 x! ^! g
if (val != ~cnt) {
( h. R- a3 Y a3 y6 W9 l. w
size = cnt * sizeof (long);
* O6 R' m$ \) C9 t8 y
/* Restore the original data before leaving the function.
6 o0 q2 a3 r; ^0 S1 ~$ `
*/
i' ]1 w9 m: R3 e
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ]3 @" y' a7 K2 w* T) k1 P$ f
addr = base + cnt;
8 P7 ^: m- ?% a$ L
*addr = save[--i];
* _+ M# F) |& y) x, j `
}
) K3 {2 L/ e0 u& Q( X7 m
return (size);
. G) {0 q* g. z6 q; U# G* E
}
) N) X; S+ g# Y! z9 I- y' X+ O
}
+ b# T* P% g5 L r% n% _
+ L5 F+ x/ {' h" `: X6 Q( S4 h
return (maxsize);
- W! Z, e: Y5 w4 i% ?* ?0 u6 H
}
& {* h8 d1 Z: E7 j1 X
int dram_init(void)
% f6 I) I0 Q- f- V
{
# ~* a% z: Y( H/ V3 S; W; _& ^6 i
/* dram_init must store complete ramsize in gd->ram_size */
# F- P/ c0 p$ V$ E
gd->ram_size = get_ram_size(
' ~: i, d) D( E) K% v! h+ I
(void *)CONFIG_SYS_SDRAM_BASE,
" q: B2 o3 \+ `2 z, }2 }
CONFIG_MAX_RAM_BANK_SIZE);
# _, r7 N$ n" m8 W: C ]6 A
return 0;
4 @- L$ t; A, S- z$ A# ]
}
4 ?2 L6 G/ A+ G6 a
) `/ @! j/ N0 _4 R( @7 V
3 m% s k v+ e- a+ F
: w5 S( w7 i/ u' k% \8 \# Q% ?
% g) f8 c; k4 P5 V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" [. ?9 M- b- Y" I6 M: }: K. B
+ `* q' z4 f0 H* O2 x2 N
7 h# e6 T N$ O) w
! h( V* d2 `+ J( q+ c' C5 Z
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4