嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
* h) _: c( r4 V. }. d0 Q2 n2 E
核心板2:DDR2 256M Byte NAND FLASH 8G bit
2 Z D$ j) P( Q; D: r
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 G+ y8 u' g, v+ E' Q
. E' H1 M9 D5 S* b7 h" a$ N
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
+ |5 x; g* ~! @) M/ M8 U* c; F' o
8 n' \* v! J- q
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
o8 e) x2 [: q0 b
/*
# a& ?$ W D. R; r: O- u6 E- Y9 F
* Check memory range for valid RAM. A simple memory test determines
& R2 q0 r3 Q5 r2 Z3 B+ i2 D4 I
* the actually available RAM size between addresses `base' and
8 \5 ~% b9 K3 o0 I0 X0 l4 K9 m: n& s
* `base + maxsize'.
, n/ T+ y$ D) V4 p2 Z$ B* L
*/
+ K, Y/ e1 c) M3 y Q2 v
long get_ram_size(long *base, long maxsize)
j; b; D( u X
{
+ d/ w e% c9 Z& _
volatile long *addr;
% s# `. x$ P: P ^: r) O/ ~* j4 q
long save[32];
9 f2 g, R$ M- _2 z' f
long cnt;
& @9 B7 a2 J0 H% H7 B
long val;
R+ c4 c: u3 Q- S+ p
long size;
# W" L0 j( ~+ f; X6 Z
int i = 0;
& R; r& @$ g* u4 L) J3 J
/ H6 p% @' ~3 D- v7 o
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' Q. A3 L$ `8 r2 _5 m+ D( g
addr = base + cnt; /* pointer arith! */
( `- @' _. e% S R' d
sync ();
* b- v# a3 c$ s, q8 B1 A5 Z7 p. C
save[i++] = *addr;
% g1 D. ~. Q9 @/ R% |( P
sync ();
% n9 `5 h" K0 b ^' _( O; r
*addr = ~cnt;
( p# P2 \# n7 _
}
% ?9 Y/ W. c' j! H; t3 C3 i: k# d
0 J& i9 L0 Q" A8 V) z
addr = base;
9 g. R2 y9 i6 \8 u
sync ();
' }3 E0 k. ^% U# z' h) O: ^/ L4 G. H
save
= *addr;
0 O5 w1 J3 Z3 D; D6 f/ G
sync ();
# O5 o0 Y. b. k Z( r
*addr = 0;
! j* \0 X" q8 R9 d
5 z+ ^8 j5 Z- Z5 {) w+ a
sync ();
: N" G! q+ e3 z% H# Q$ j% o6 L
if ((val = *addr) != 0) {
* E$ |" I+ [; N) n n
/* Restore the original data before leaving the function.
# z" N. P% C6 e+ j* I* [# G
*/
3 S' E }2 D0 D1 t* V; B8 X
sync ();
2 c# q, F& `' m; u: Z% P/ k; l, ?
*addr = save
;
0 \5 f2 G) F X5 A9 J, k7 l
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 k! S3 O' m7 \0 [& t: s6 E! |- O
addr = base + cnt;
2 B1 v0 z9 Q% u8 L
sync ();
2 l q) z2 l5 X, Z9 X' ^' ~
*addr = save[--i];
4 ?3 E a3 |" m& E; C8 E% o
}
( j4 u" [. t# M
return (0);
$ d5 z1 T% S: D7 X* ]4 \
}
# G5 j% B' {- t. g4 U& v
; S5 i4 g0 E1 y0 {* b% p5 n
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# X/ U: ^( z( n2 \- |2 ^6 E
addr = base + cnt; /* pointer arith! */
4 D! o0 C1 D2 q) f( F& m3 Q2 m
val = *addr;
9 R) X% d7 F i% _- N8 _) O
*addr = save[--i];
; d% ^! p0 B' i: |$ A
if (val != ~cnt) {
" E) @4 y- j3 L6 ^' Y, t) d
size = cnt * sizeof (long);
! @/ p; t; B$ ]; Y, e, T
/* Restore the original data before leaving the function.
9 S9 ~% h* g9 {6 M3 D/ m* k
*/
) x% y9 Z4 @2 t0 U" U
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 k" _' E* @- L
addr = base + cnt;
/ Q, a0 }; W7 M7 S
*addr = save[--i];
0 g4 W/ G3 y, R: @
}
% V: F- R- H: w8 U( ^
return (size);
* H v* @% U4 F4 V. E2 i7 l9 Z0 y
}
8 O' O. a% B. R( }$ S6 ?( H# N4 l
}
! @6 P) Q! j( U! y/ y4 X" I# ?
- m0 j9 g" W5 _5 @* k6 G. {
return (maxsize);
& [' U# A% O6 ]/ l# W; M
}
! |, K" n. A& c* v" e0 @! B
int dram_init(void)
7 D) [* C9 [4 c# P
{
4 ^# b/ Y' q' n; v9 T; R( q
/* dram_init must store complete ramsize in gd->ram_size */
. A- e( t7 H8 ^/ r
gd->ram_size = get_ram_size(
( B: ]9 E9 @4 X' V) A6 P6 @
(void *)CONFIG_SYS_SDRAM_BASE,
% \" X C3 ~, C8 J3 W4 V7 g' u* u2 [ }
CONFIG_MAX_RAM_BANK_SIZE);
; H& T0 r* k$ E. |. B ?
return 0;
. |! T$ t% l7 @/ J& h" ^& K! [0 G
}
" n7 c, _6 ^* |4 a+ J3 m
3 C) {. Q; K' m7 v5 N& `3 r9 `, D) k
3 N9 K2 A- C5 A
3 z- l2 f1 N5 i A/ ^0 [8 J3 l; L
; ? |+ K4 ~5 P% f3 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
) D" T6 O- J! G# T- L+ c: t4 ?
# E+ L* Q' Y4 q3 [
& Y, M8 a% e) K; f$ `6 e
. s; e0 \, k# P Y4 c0 E2 |
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4