嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
4 \ Z: x5 M# |/ ^0 \) A6 Z) o
核心板2:DDR2 256M Byte NAND FLASH 8G bit
; {# k' b2 M4 [
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
6 S; b+ r& G, S5 W9 X9 D0 i4 `
* F: W# ~' L: A$ q8 `& u
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. S) A# d, o; z( I
# A2 A- y+ X$ J
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ i. W+ w* g7 ?" j i
/*
- S' D$ E; V6 p% t1 Z4 E! n
* Check memory range for valid RAM. A simple memory test determines
+ A# ^0 x& `+ u- d9 Z
* the actually available RAM size between addresses `base' and
+ i5 P0 M4 a. U' m& s5 t- o& F
* `base + maxsize'.
. K) c4 a2 r1 t- o3 F P
*/
, a; S9 ~ P V' B/ G* |- R
long get_ram_size(long *base, long maxsize)
0 k* j# ]% d; W& V% ]
{
, [" m! W9 l4 p3 l' B
volatile long *addr;
* C5 U8 O1 V7 W h
long save[32];
9 D& h+ W* H7 U* F, C
long cnt;
5 A) d6 E% [- `. n" d; v8 N8 G
long val;
$ G2 ~* {7 r4 m. f
long size;
: E) ~2 F5 ]5 Z) C+ E
int i = 0;
& ^, x0 h7 |4 ?) D6 |( F
4 K9 L* K+ X+ R6 Z
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 _$ X$ e9 Q, h+ Y4 P4 q5 ~! q+ U0 J
addr = base + cnt; /* pointer arith! */
: s* z( C5 r; }% {
sync ();
- x: d7 ]8 a+ T: Z* S7 t
save[i++] = *addr;
4 E0 D4 ?/ T l9 Z V* v
sync ();
) ^* [1 Y8 @3 Q, c- u3 ]: i( [! x' }
*addr = ~cnt;
9 ^9 h; D3 U7 P) \( p) f" J
}
0 b; ~" Y0 l7 p9 ]# b& H
: Q% c6 v' P2 ^. Y" Y5 H
addr = base;
* y: e$ {. j- q1 B9 P
sync ();
7 D0 d( D6 r& M8 Z9 b6 k
save
= *addr;
/ r7 j) ]! {5 T! Z | m( O: v& q# k, E
sync ();
7 ]0 N) h/ }3 X$ d3 D$ i7 Z! R' N
*addr = 0;
/ ^0 N& [5 w5 l/ y
- a* B B1 G( M% e+ J4 Y* ~
sync ();
( g( o9 f. g$ B; l8 z! X0 h; B; {4 J
if ((val = *addr) != 0) {
+ g {! H7 o1 G0 e1 @/ o
/* Restore the original data before leaving the function.
) _$ l( X1 q, t* O- g5 g" d
*/
* v" P, h0 w) A( D; D
sync ();
) r& H$ y# j6 J$ q; F
*addr = save
;
/ \. q6 ]& H, V
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 W6 A. b( t' U; {2 H/ N
addr = base + cnt;
. a0 G& m7 E# m) A
sync ();
" Z+ c- m* T0 z0 a8 D1 j/ x; o5 @
*addr = save[--i];
6 X* b0 W7 z- K! P
}
5 @1 V; `2 E ^9 V9 m6 G2 Q) v3 V6 R( Z
return (0);
* B+ Z9 C2 C( ?9 [* [/ }$ M/ y0 E B
}
9 _$ x7 I' R1 Z: c1 P5 r q
1 y8 I4 N; [4 c
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 d# u* v; F! v3 ? k
addr = base + cnt; /* pointer arith! */
% @6 Z! _2 q4 f
val = *addr;
& n) a/ [) ~ `+ H+ d* c9 J" Y3 T5 o
*addr = save[--i];
# M' ^6 L( q% u1 u4 n
if (val != ~cnt) {
) r( v, t6 Q2 p- N% t* }/ `
size = cnt * sizeof (long);
1 L3 k# ?& C5 X# d7 Q* s( a
/* Restore the original data before leaving the function.
6 m! b C; a! V. Z
*/
?# {/ t+ J5 l! H4 R( z5 }) Z' ^
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 N( v5 s3 s. ~7 A
addr = base + cnt;
" T' e5 a& f5 e, L( a5 s
*addr = save[--i];
0 I/ j6 z" x# n, Y& A6 ~
}
+ l! X3 u3 E0 i$ N+ x- o
return (size);
5 X0 a- d- R5 F
}
* j* s8 @" z7 q
}
" j3 K# R& C, `$ }2 q# @3 q
/ P* \& `# ?' C0 ~0 w
return (maxsize);
, a! X% W, h5 `) B1 D0 {
}
: |! s4 f' \1 O# B4 x( h/ `
int dram_init(void)
3 m* ]( _8 ?2 e# L; J+ `( ]1 a
{
4 v/ c" h9 `5 E x5 _! f" i; V
/* dram_init must store complete ramsize in gd->ram_size */
; E- U. t# J- c
gd->ram_size = get_ram_size(
% \; S$ ~% j6 R. j- H8 |
(void *)CONFIG_SYS_SDRAM_BASE,
# t9 s# r0 R, F1 ~
CONFIG_MAX_RAM_BANK_SIZE);
0 S4 q- _4 [ X5 `5 g
return 0;
" ~2 p% f0 w% L9 y& D6 o2 ]
}
3 d: _1 _ N1 p$ T- }' R9 @
/ p5 x! ?9 s- m+ |" l$ X
* K/ |* x- e7 }( {. `
) Q3 s% F! r" o
' Q8 A; D* r6 J3 ?6 b( Q0 P
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, y4 x$ a! ]+ D4 Y5 x# ?" `4 o
2 O8 e7 T! C% H5 P- A% c9 e7 p- ^
* i F9 Q& [0 ?# F
. v- ?& B4 a0 q) ?5 ~% |/ n" K
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4