嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
6 D% k4 d, Q$ K! y& X) t4 h* C
核心板2:DDR2 256M Byte NAND FLASH 8G bit
$ e. U! {: o% j: a( W! s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
. D# a7 K! m; m4 a" C
2 R8 {' P3 L# A
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# `8 J! ]" S* h* ~3 C9 ?
# A7 r2 K I; H! D# R0 R
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 a7 S+ h+ Y8 {4 }
/*
4 ^* m6 V. f# w4 b* g/ ]( C, o
* Check memory range for valid RAM. A simple memory test determines
1 u$ B% `0 X8 ~) u
* the actually available RAM size between addresses `base' and
+ k9 ?0 _/ L& y3 {
* `base + maxsize'.
6 [# N# h& F. x& Y \: {; s
*/
# C5 N( _2 E5 a+ _2 L- B) G
long get_ram_size(long *base, long maxsize)
' \# G% C/ ~& `9 M
{
j6 p/ I: k0 y9 y6 z; O$ H4 x
volatile long *addr;
* ?8 F: F2 F! K- T
long save[32];
7 s! F* ]- t, B$ \4 p" R
long cnt;
$ t$ h# f/ o1 N
long val;
& Q' f* J4 R. |* L6 j% k
long size;
1 N5 z0 }1 B/ \) U9 ^$ e. |
int i = 0;
' I5 b6 t9 g. h; O
' W' q# v; t( b0 \. x3 q5 o* G
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
" |) r+ R& _6 N( v
addr = base + cnt; /* pointer arith! */
- d0 h3 m% ]2 V0 D# H0 X" m: b3 d
sync ();
" p& Y) P1 b# p2 I( E/ k" ~5 l+ ?) g% B
save[i++] = *addr;
1 a7 K: A0 G8 y% s: [
sync ();
: f( v* i& r0 w4 [" K, J# h
*addr = ~cnt;
8 ^* s1 D+ N' N
}
# r* p6 q- F4 B$ r
* W( H) P+ s8 C: s0 n- ?
addr = base;
6 L) C3 [$ N/ R# `! G) ]3 I- W
sync ();
+ W; }$ j0 P2 t! s
save
= *addr;
" m6 U" t5 k7 f6 j
sync ();
d' _8 I; _* l. S
*addr = 0;
/ O% @: t" a: ^- X1 h( U/ t O
' c8 r _9 j7 A7 v& j
sync ();
2 {- O8 F4 T4 }8 V, t
if ((val = *addr) != 0) {
* A3 T- C# ^) a+ y
/* Restore the original data before leaving the function.
6 T, ?- ]! ]) m0 h
*/
8 s9 t8 b% x) Y/ r
sync ();
. b" a& t: x j$ O7 M
*addr = save
;
3 `+ z; e3 W% Q: K9 q4 ]3 `5 X) E
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
y3 ~ r7 ~! F% _2 K7 N- }/ c
addr = base + cnt;
' B9 b* U7 ?& O* ?4 _; U
sync ();
8 r: m7 V4 J8 R: S" c; Q) W
*addr = save[--i];
/ L+ e' r3 Z2 q3 g
}
5 g4 V5 p- t9 _. k$ V7 q) i ~
return (0);
, X3 e' _# @" @4 s6 }; j7 @) ?! U
}
! n1 F5 Y- f/ e8 e p: H. s
' P3 x4 k3 }1 E3 z0 c; K o+ Z+ |
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 A. ]: d9 e& [! U. K
addr = base + cnt; /* pointer arith! */
4 \% r( u3 ~- i, a G6 V8 M
val = *addr;
3 f5 p7 \: Z4 N* X) r
*addr = save[--i];
8 n; i& w4 x2 | b9 g) n
if (val != ~cnt) {
+ w& L, r+ R! s
size = cnt * sizeof (long);
8 ^% u- p, D3 B! ^
/* Restore the original data before leaving the function.
2 U; I* w% h. _ X# o
*/
, n/ H. i+ `9 S4 d; [
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
) k5 ]) l; t3 D6 m# [# e8 r6 f- g
addr = base + cnt;
8 l; Y3 C; ^8 x# ^
*addr = save[--i];
3 {* k$ A. p* {0 C1 O6 b( J
}
4 b0 \3 l7 U! T
return (size);
$ x# s$ }! i* G" K+ U( Y
}
" D q; C/ e5 T B+ H7 Z# P+ v
}
/ H: ^% u( @7 l4 C1 X
% l/ `+ S# x- ^7 Y- q
return (maxsize);
* M% {3 l# V( v6 H( }4 T2 w
}
8 g6 ^' L" X9 b. W
int dram_init(void)
* g8 n$ P6 o: i8 j5 L
{
8 T7 P- U. P$ m& S
/* dram_init must store complete ramsize in gd->ram_size */
; S; {7 o/ }( H9 h
gd->ram_size = get_ram_size(
- e; Q: i# Q6 f4 C' l
(void *)CONFIG_SYS_SDRAM_BASE,
! S0 d0 u% W6 Z6 ?' \, d+ Q p! `
CONFIG_MAX_RAM_BANK_SIZE);
+ @/ f; |4 H; [1 o
return 0;
- P3 D. E$ x* E
}
! b/ V: R( j0 v7 V* |6 t
- l8 T, Y' {/ E* s1 z) Y6 T
, ~' p. [6 d5 X; A9 r
: C$ ?/ r% k1 @! I# g! {8 F) `
$ [0 Y4 E h/ ]& |$ B
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 l# L% g* c" d% G; ^( Q
2 ]3 @/ b' Z' D1 R; E
, h8 r2 T; l/ D7 T4 b. p* t* @
! n- E% |1 w D4 T
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4