嵌入式开发者社区
标题:
TL138 uboot是怎么区分配置两款核心板的
[打印本页]
作者:
Mr.Loser
时间:
2014-9-11 09:33
标题:
TL138 uboot是怎么区分配置两款核心板的
核心板1:DDR2 128M Byte NAND FLASH 4G bit
- h! E" h& W0 ^/ s+ b5 r0 n3 A/ t6 r# g
核心板2:DDR2 256M Byte NAND FLASH 8G bit
' U: [/ J# q& M) U) j! A' v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 Q7 V; d1 B7 N" ?
3 W$ w% l0 L1 u. d6 _1 t
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" f4 x. i+ O8 K+ N
3 K( j+ d! z0 J) z. ] B, V
作者:
2532609929
时间:
2014-9-11 18:55
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 G3 C0 W: w4 P6 p, K
/*
, ?) l6 e1 h# l* B
* Check memory range for valid RAM. A simple memory test determines
& M6 G0 ?+ J6 v
* the actually available RAM size between addresses `base' and
2 h: c. @6 k6 u) W' H' f5 T9 p3 v
* `base + maxsize'.
, H4 |% ]2 T, P4 M2 r
*/
8 Y' d" P, O# _) j4 g
long get_ram_size(long *base, long maxsize)
" I/ ?/ G/ |% c/ K4 G* s# B8 ~* |
{
( G8 w% X K7 Y m
volatile long *addr;
! n4 s; z- T1 Z# J( P) e6 j( O0 g
long save[32];
- l. E! e* ^+ l% o1 b$ J
long cnt;
, \2 ]2 ^& d* q n; z; n! }/ a
long val;
3 H L! w+ m& g. F7 [$ S. C
long size;
3 n8 f& n0 V4 q- n' m) J1 P
int i = 0;
6 x4 M: O- Y/ w4 n/ b9 R3 T
) x& W- ^9 ^( j y- r C
for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 D6 u5 L% O* q" x* `
addr = base + cnt; /* pointer arith! */
* Q0 K' p+ }! m7 E, R' v* J( Z
sync ();
" x$ G( h0 d* n# I# m
save[i++] = *addr;
; U# M( C% e8 `. U$ `, i
sync ();
1 h# X) `, ]/ p G' i
*addr = ~cnt;
" n1 c" ~0 N7 U
}
; G! m7 R, B% F* k V* D) Q0 f
: z$ Z, H6 x2 e. [! g6 L5 Z- a8 h
addr = base;
( a7 @$ g8 ?2 f7 A# g
sync ();
5 I4 ]+ \$ o1 k8 |0 w
save
= *addr;
5 D: G6 h: ^6 t* D
sync ();
3 g4 P- _, k# I# F
*addr = 0;
' b& C- F- ?: ~- s7 z3 s
# ]7 P" v; L1 J, b. N
sync ();
: _3 A P3 b9 ?) u+ T5 N
if ((val = *addr) != 0) {
% E, c4 g( g' W ^1 L! [& M- L
/* Restore the original data before leaving the function.
$ f& ~' d/ `& _- ]6 z- Z, W2 F
*/
" X9 K% c! g# e( A& @: G! ~5 J
sync ();
# i5 ~7 E% R1 a: `- ~5 X0 q5 ]
*addr = save
;
: I% R- w: ?6 p' s% L% x7 J! h- M
for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ v+ K t& m% j, l8 l
addr = base + cnt;
4 ?0 u. Y! N' ~7 H
sync ();
, d+ m9 F4 F, U5 |' g
*addr = save[--i];
5 [) |) C X- _* Q: n
}
" T% J6 `/ f. l
return (0);
4 S# ~* {) ~- k7 y
}
$ d. |: f( w E' D$ K. q
0 F' [" J1 L3 ^$ F( z
for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 G7 z( X0 j; c \
addr = base + cnt; /* pointer arith! */
8 R: e5 {2 z8 S, S- L/ k
val = *addr;
0 a8 j9 N r" a7 k, l
*addr = save[--i];
3 z3 _, z( V, g6 T
if (val != ~cnt) {
6 {8 T4 L0 `$ a' v$ j
size = cnt * sizeof (long);
; |% P+ M3 G$ Z: o1 u( E5 [
/* Restore the original data before leaving the function.
% ]2 S) u$ o9 H6 |
*/
& _" J+ v1 L. @" \' ?/ c
for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: I+ ~7 U# d- n5 L( Q5 ?
addr = base + cnt;
5 e! y4 D$ ~' G; R
*addr = save[--i];
8 X! z2 j8 k) T t2 G
}
8 |) T$ S5 E' x! b7 a% Y! _
return (size);
7 a% P. K4 R5 K- V
}
5 G; f# v$ Q/ P' Q8 p
}
3 j" J" ^( @+ L3 A0 n9 @
" C z" t+ t5 [& b5 Z
return (maxsize);
; L* c$ ]3 K' `- O: V
}
$ f, _" E2 O! {3 a2 h7 z
int dram_init(void)
8 l7 j# `+ d7 ^2 X: Z! Q
{
7 }2 Z$ O# Y. Q
/* dram_init must store complete ramsize in gd->ram_size */
( a: r. Y/ l G% A
gd->ram_size = get_ram_size(
5 s( B& I( F! U. N. U4 A0 u' q
(void *)CONFIG_SYS_SDRAM_BASE,
5 I, j, K/ c' v( [; \. Q2 c$ k
CONFIG_MAX_RAM_BANK_SIZE);
* f* P! v+ I) }
return 0;
. [3 |4 A' r" a
}
" \7 J3 R7 z. R4 b/ s
% A' M \) w3 q2 h( g
6 {$ J* @; C. H& v8 [0 _) b7 e
7 F& z% [# F' V v! ~8 P# @
7 q2 G E: Y( Y) z
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& f$ K4 W6 i9 j3 _
! G4 T& p- n, u) P* E+ F: j+ B
! g$ f+ f' K2 w
% q* C3 D; e; Q2 E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4