嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
; \* ~# y' d( \/ C/ B) p2 Y8 J- W
核心板2:DDR2 256M Byte NAND FLASH 8G bit
# L+ B3 ?+ G, N5 P O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
$ k& n1 T' I/ ]3 n4 z1 t' ?" n2 J R7 X
( i4 m( K2 r1 `. i
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
}# Y9 v# T: e
. K+ B& m2 S- i; y8 n
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: X ?! `1 V) Y; `; @ E
/*
: o3 Y. S$ i% w8 p: c- i& z' M
* Check memory range for valid RAM. A simple memory test determines
- u: Y; r- L/ m% e7 c" e0 w
* the actually available RAM size between addresses `base' and
3 C$ E9 _; X j0 ^, M/ L4 N& F
* `base + maxsize'.
5 d9 }+ n; i% _" @. A
*/
4 h$ h0 r9 \8 {6 o" s- E+ c! M0 y5 T
long get_ram_size(long *base, long maxsize)
+ w9 s- a4 o _0 K; t0 y
{
( U' T% k+ } O1 b4 {
volatile long *addr;
$ W. c0 m" ]# ^0 x7 c
long save[32];
6 r/ i3 |3 e/ \# v
long cnt;
4 Z! K# G$ i( d4 ]2 J2 b
long val;
! W4 V) B0 e0 {3 M2 y8 S! l8 {
long size;
% H6 l. g# ~1 [, g. M e( M7 p
int i = 0;
3 {; M5 J6 x7 Y# h
R0 V2 ]" y) [2 \$ t* k! C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 p$ J4 J3 ^$ k+ D) I5 W, U
addr = base + cnt; /* pointer arith! */
! N0 v) ~5 }/ r% ^. ]
sync ();
" m% L7 F9 `4 r- m$ R0 ~
save[i++] = *addr;
& [7 ^: ]5 N9 C
sync ();
$ D+ J+ C! l u" e* d' W0 O
*addr = ~cnt;
8 i) h% h8 o% ^8 r5 \% j( H
}
0 |+ A' |. u# t8 G3 u3 s. J3 M
. q' z1 G4 A: K, t: y
addr = base;
9 v" C. l/ |* k {5 d$ j4 O
sync ();
1 G* C' ^- W& m& N
save
= *addr;
( v1 O8 o# y! M/ c
sync ();
$ A4 g6 i" z* f6 c3 ~* I# N
*addr = 0;
4 D2 u5 t! l V! K) w0 r$ M E
& s/ X' e ^ S7 N
sync ();
2 u) U8 Q/ p! M
if ((val = *addr) != 0) {
I+ `# x1 X7 Z) B& [# X
/* Restore the original data before leaving the function.
' ^. m$ F# w0 h; D; i8 }
*/
2 @2 Y9 H# H* O" ?# f9 V6 f. ]
sync ();
9 V9 [' c9 t6 F7 T; b0 t/ c X
*addr = save
;
' f5 J* ^7 }" P7 [
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 o( A4 [+ I, ^1 Z/ x% Q6 N, `
addr = base + cnt;
8 F5 s" A/ q0 A
sync ();
/ N" r( G; P+ d& y* m0 q
*addr = save[--i];
& H- n, |; @! j; O. h0 I
}
9 y1 x( M' f1 C5 n/ T7 T/ ?& S' }* k
return (0);
6 Y& _' h4 J. @
}
; q( W7 D6 X L q
1 [% l* x* l2 O/ q/ `* ~, z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* k" a9 e8 T* o! l \
addr = base + cnt; /* pointer arith! */
# n- X" f' ~# m2 {0 f8 {- u7 R
val = *addr;
5 ]* b) F: ]! Q9 Q! J; |
*addr = save[--i];
; M$ |7 {. G; B. L Q; e K K
if (val != ~cnt) {
; H9 _, t0 m+ R6 {
size = cnt * sizeof (long);
% o6 F8 S+ Z; F
/* Restore the original data before leaving the function.
8 W* {2 D; l; p/ N2 M
*/
- u" S& D* T _8 U; ~2 o3 L4 }
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 t) Z% Z. @! X% q8 P6 r
addr = base + cnt;
2 b: K z1 ?; M, F4 E! j
*addr = save[--i];
+ B1 ^/ W: V$ v, D1 [! m( Z$ u# b8 A2 w
}
* C& W2 M- _) {1 P
return (size);
% c, p0 t3 K/ b- {, j5 |5 m6 y, ^8 @
}
4 M% w) c# p" Q* }( I
}
* x- @/ y( ]4 n( h
6 j- ^2 u5 @. Z& u$ r# d( d
return (maxsize);
: {$ S7 {% K8 ?3 T: O
}
2 A0 x9 v9 v& w B. i" @$ ~
int dram_init(void)
( Y6 m% N, H, K3 ?; U
{
) q; h$ X3 b$ G2 b9 D, |: ~
/* dram_init must store complete ramsize in gd->ram_size */
- |5 i r2 x6 j5 B7 m6 w$ z; K; i6 Z
gd->ram_size = get_ram_size(
7 E% R7 X# y2 K- K
(void *)CONFIG_SYS_SDRAM_BASE,
4 ]$ u1 x4 c3 e' J
CONFIG_MAX_RAM_BANK_SIZE);
o' g% ^. W6 j' }: v3 u
return 0;
2 l7 _$ J4 | M! q. Y6 o; h \8 {/ H% y
}
- C1 R g, S3 q. d* ~3 X
$ |' o$ L! Z+ y' ?" L9 Y- N
4 D1 g. w1 U0 m! s! l
8 ]: h' O! t2 g' @, F$ T
8 f! {$ p4 ? D$ R, _, U. X# @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; v8 [/ X3 f$ S* b7 e! ?- @
4 @5 \/ I/ S2 k- c: s5 Y# v% B& ~
$ f j. b$ G( I# b) ^, e
7 M/ D* ~) f: q8 N7 B! J
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4