嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
/ C B6 U/ z" z+ I; X6 s1 W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
1 U6 S: V. F. @, O# j# S
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
9 E5 n) l$ t" ?0 H5 |! R
- T* Q0 d% E" @+ c* g
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
! {; a. ?( u+ r0 v5 L! G4 Z+ l- a3 q
. `8 B9 E. R& i( y# y2 t
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 J& r4 ?. F. G, \# E, _. R
/*
8 B8 w6 C+ i, H
* Check memory range for valid RAM. A simple memory test determines
7 Q! o1 t2 [1 Y
* the actually available RAM size between addresses `base' and
e$ Q0 D7 B' Q1 |
* `base + maxsize'.
+ G+ n8 o/ ^, ~
*/
7 N! N* o3 c) I% g
long get_ram_size(long *base, long maxsize)
' F4 y) M+ d @3 w( a) W
{
- Z0 {5 j; J* o, Q- H/ R+ c* ^: b; {# z z
volatile long *addr;
1 O9 @; h Q% c
long save[32];
# Y2 p/ y6 ^* g) j% ^7 p% v
long cnt;
# x& ~4 y k4 t) M1 X
long val;
* W9 r# F" d* K
long size;
3 O& ?- t4 \' P/ G$ Y% X% r
int i = 0;
) R* }4 i$ W- H- E5 G3 o( v
2 x* J: f( m& l+ E$ o# ]
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
8 f: ^- B9 d4 p2 V! O! }
addr = base + cnt; /* pointer arith! */
5 | X& Z* t, p
sync ();
9 ]" ?8 X8 {# d, m
save[i++] = *addr;
5 E: w' Y$ L# m: s; O6 j r
sync ();
7 {& d) x; R! n* J0 v8 Y/ s- R
*addr = ~cnt;
; {8 M! p( W' Q8 [' A4 W. o
}
& y2 Q6 V( n+ z4 C- h
6 g7 ], _: @! J y% G
addr = base;
& l6 n$ m$ y. J) q: V* U/ b
sync ();
_1 X5 ~" `+ m9 _$ J4 I1 q; ]
save
= *addr;
' D* W% w5 ?: p( {
sync ();
% W, Y" r) C! i" k
*addr = 0;
) {9 o: A. q R4 M
/ G; l+ [' ^& n7 Q
sync ();
" m% T5 ~8 @5 ]* |9 A R9 ?3 O
if ((val = *addr) != 0) {
" n( D# j0 }+ G* ?3 C6 X7 \
/* Restore the original data before leaving the function.
z: s# @3 ]. A+ U
*/
3 L3 p6 A1 H9 c- G
sync ();
+ ?- ^4 j. Z7 F! o, }* A' J) M
*addr = save
;
1 ~0 d; x7 o6 @3 [, F, U
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 u& t, t9 p9 |5 M% F
addr = base + cnt;
' a1 s' Q3 q: O* y. L
sync ();
9 ?% s1 M- W+ u% L$ e) m9 ?) t$ Y, b
*addr = save[--i];
4 D. }% _7 d y2 J% v) a5 f7 h
}
6 ~# l9 S# ]# b
return (0);
( R4 W8 b# p3 C5 N
}
0 @, }' I+ d; ?
2 c7 R9 h+ H Z# I
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& a2 _ f: W& U: Z( q. E! `
addr = base + cnt; /* pointer arith! */
$ X$ i3 O! x- m5 v
val = *addr;
9 y$ S" V, Q6 Y1 _2 w% o
*addr = save[--i];
8 P! S* y$ c. }* s7 C0 X
if (val != ~cnt) {
3 |5 C' x- N' f* Z1 w7 q
size = cnt * sizeof (long);
/ i6 |# Z$ p4 r5 M% ]3 j
/* Restore the original data before leaving the function.
. W; K0 b. U) a) ]- L$ A" z
*/
* C1 _, c' |4 n% X/ G8 C1 }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# u q9 o) M7 m* R4 s8 B
addr = base + cnt;
3 q/ T: t6 K) S$ E0 O9 w
*addr = save[--i];
/ Y/ @, [4 O& {0 O, p* y* g% ?/ f
}
2 L; x- `7 c5 g8 V3 e. O
return (size);
( r4 {$ |* _4 J) ^0 G4 A$ `$ i
}
0 u+ J0 L, N% L( _
}
. F: u, d6 H+ A$ w r& ~
' j2 T$ M8 S @4 E( q4 q& w" {5 {0 F
return (maxsize);
% _0 z' }2 m' I7 }; P1 u3 N
}
; u( A y; |0 h* R7 \
int dram_init(void)
+ H# b1 V. J& @+ o2 }' m
{
7 h9 s$ f; `3 z
/* dram_init must store complete ramsize in gd->ram_size */
+ R- ?' F: \" P9 u* G. b5 H
gd->ram_size = get_ram_size(
+ Y6 R. C. i% y5 f; W
(void *)CONFIG_SYS_SDRAM_BASE,
7 J& k( u1 o1 c2 b, v
CONFIG_MAX_RAM_BANK_SIZE);
7 v1 l/ q; w- x) l
return 0;
! m! C6 G7 M! T, u
}
1 Z5 o1 G8 @, B
+ J4 C. `! o# T. Y* v
0 I) I9 C+ ]) l
: z5 S$ _* ` O8 z" E( a' ?# |( }
2 f2 ~; M! [6 l; _. j9 k0 l
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 x# ~1 E" c! T6 J! \1 A' Q
2 ?* D5 p& T( H, E* l
$ T; f/ x+ r8 {
8 m A0 f; D: e: {% F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4