嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
( P$ M; h; b% W9 j/ R
核心板2:DDR2 256M Byte NAND FLASH 8G bit
7 J& x: [* f! ~2 E
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ N7 i7 c: ?4 f
$ O( C# M* c- h4 ?1 N7 Y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
% R3 ]. X' i' D9 ]5 J1 L3 l1 |5 O
- ? A8 Q( t# T
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( Z2 _6 U& C# M! t2 X( L5 R
/*
/ U% s% L5 ?; T% } q
* Check memory range for valid RAM. A simple memory test determines
0 R' _- {/ Y- E3 N, J& ~* F
* the actually available RAM size between addresses `base' and
% M" f2 O7 W! J$ G( {- _
* `base + maxsize'.
$ Q, @; c; D9 ^ {$ j7 O% @/ e: h; R
*/
( [+ Y$ n0 L% t! W- {& Q1 O
long get_ram_size(long *base, long maxsize)
- j& b$ ?0 @+ {1 m- U
{
( I0 V9 K0 a9 X* ? o) s
volatile long *addr;
- f+ t/ f3 N9 ~% J3 d" @8 P3 X2 m2 o
long save[32];
5 ~1 _: e& E- [1 [$ R
long cnt;
/ k ]% c" K, j5 P# P9 }1 E7 `
long val;
7 E( P5 ?/ ?* r6 ]% p
long size;
1 Y- E5 j! Q+ ]( g5 T3 G
int i = 0;
3 ~4 m9 r1 b6 w7 k+ v* {
" x: s. @1 k, p, P
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 d" z. {# Y! H, s
addr = base + cnt; /* pointer arith! */
! B5 D+ o; N$ W% K# d% M X4 G
sync ();
7 f# Y% N3 H$ h5 H4 r$ G
save[i++] = *addr;
9 {4 N4 J% F8 |) H
sync ();
# k4 \: {5 n- O4 v: Q
*addr = ~cnt;
$ D/ Y! s- G( C
}
3 y, M, ?. K% G
! Y) \- k; M) |) e: T" Z' w3 D
addr = base;
3 v: |; g g6 j8 b9 P; T* J
sync ();
" T( d/ H5 R# _1 z5 O
save
= *addr;
) X* [% j# J8 i6 v4 Y! T% J* Y& Z
sync ();
- \# Q. J2 d( R0 W( a' k7 S& D; Y
*addr = 0;
/ _* Y+ N; H, {7 V- u$ P3 y; Z* G# u
% P0 P' @- O! Y7 g
sync ();
( `2 A) G# m- J8 h* J$ G0 u0 Z
if ((val = *addr) != 0) {
/ l3 f: u+ ]! ~( z) O {7 ^: K
/* Restore the original data before leaving the function.
! w5 w) N( P& K% V
*/
3 Y( o7 h5 c$ q3 L) N% w6 B& G
sync ();
* p8 z/ z; O! K
*addr = save
;
3 v2 @% V! B. y, k- e+ h
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ p$ Y5 @: _( d. p* r! U/ M6 M
addr = base + cnt;
, D4 M$ l0 A! R- L0 c
sync ();
: T P% O* r5 ?
*addr = save[--i];
4 y! u! D8 p' u- ]
}
' h9 c0 r! ]& ^
return (0);
: k8 x8 D% c8 m! E
}
6 V4 w$ ~- ^/ n& L. E& B. r9 ]2 J
; v7 |" a- e5 n7 r M5 Y
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 u* ?! i9 W/ b6 W' D( K
addr = base + cnt; /* pointer arith! */
; K4 Z5 B! P. P0 }2 d" r4 [
val = *addr;
4 v9 B. e# t3 g7 L4 T6 ?( t
*addr = save[--i];
( ^3 \; _' R) D- d' `
if (val != ~cnt) {
9 x% _: v7 j$ ]- E. x1 R& u& A
size = cnt * sizeof (long);
- t8 z% f3 W% U) e3 i& ~% \
/* Restore the original data before leaving the function.
) N; E! R N% ?: f$ T( S/ w3 g) r
*/
$ d+ d; Z7 e; o g
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- ^7 f( u3 p# X' z- l6 {# U
addr = base + cnt;
9 t' Y6 Y2 J% h: }0 j
*addr = save[--i];
/ L! O: V0 ?1 Q8 L9 q. R
}
# H! [( {+ a! H( @
return (size);
0 S2 f9 R! d) D4 L+ D1 \% R
}
6 y1 ^0 p7 F, r
}
, b k. ^2 M1 F
% u S% b7 L6 h+ H6 ~* ?- m
return (maxsize);
. x* R- s9 f+ b2 f( ^
}
0 k+ L& U( W7 {! q. ~! }: y- n" t
int dram_init(void)
9 L& g5 i5 L% _* w* v/ X( g
{
& v. h$ w6 H; \
/* dram_init must store complete ramsize in gd->ram_size */
" t1 |$ [& u A2 s# k
gd->ram_size = get_ram_size(
) a$ X4 f6 C9 }1 I5 B, H
(void *)CONFIG_SYS_SDRAM_BASE,
* H }2 Y- b$ P) ]
CONFIG_MAX_RAM_BANK_SIZE);
' v- m) {9 Y. \- q* m- a' B. T
return 0;
: A m: A' \1 ^% @% I W! p
}
6 _, d% U/ ?) T4 u* m% O
; s' u4 T# J% W, ^
1 f5 T. X5 a* r
: W+ S' H% i% Q
% i1 c8 ^5 Z7 p+ g# s! L0 D
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
+ A9 _$ f4 h$ z: t) }& b# S
8 ^) M9 V' f5 V) I
1 F3 J" _5 H2 f# ?5 g, f/ p
6 B# T& @4 H/ F& Z1 k! q' N
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4