TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5555|回复: 1
打印 上一主题 下一主题

TL138 uboot是怎么区分配置两款核心板的

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
' t+ R, S* p( `3 Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit
, E9 W. a1 Z0 H; k0 F+ f9 b这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% A+ {5 N5 W2 K1 o# G. N
8 g: P6 w; a# S$ G
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# A7 m5 B6 A" v3 s
2 I# e6 g2 L8 u8 d+ z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, b! j4 k% s- b, A: m" t! s/*! z+ l+ Z0 {/ K
* Check memory range for valid RAM. A simple memory test determines9 K/ k0 L# z- U
* the actually available RAM size between addresses `base' and
4 p  G% \* S- x! [$ A* `base + maxsize'.
( G. f) y4 G$ @7 D*/
7 n4 j# T, J1 L& Ilong get_ram_size(long *base, long maxsize)  b" n: N# f8 B5 W) R- @9 W
{
8 X  M/ y; _* W3 I% U* p        volatile long *addr;
; t- \& ?; Z% p+ W0 j  l        long           save[32];8 R3 ]/ m2 X( r
        long           cnt;
' o# V0 p- }, J        long           val;  u( }7 t) H* N) e: r, C- C
        long           size;( L5 S; e0 G# o/ Q2 p; J% O( b
        int            i = 0;
( E. U) Q6 P, P- ~+ l/ t
6 v( K  Q2 r1 y8 {3 v# E) h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, U6 p2 L9 u0 {! O+ z                addr = base + cnt;        /* pointer arith! */( n0 Q0 p2 t& u1 s% X8 M3 e
                sync ();! V- p% s" L: m9 p: K) b4 r' T
                save[i++] = *addr;
' v# c1 i$ G5 S, c7 O- U                sync ();
* M) d& ~6 D8 z6 I6 x                *addr = ~cnt;  \3 m5 t. j7 }3 Y/ s
        }$ o0 l5 H% r7 G* r' \5 k

; C9 T6 ?3 c0 k2 {3 D1 C        addr = base;
+ Q6 [4 C2 x/ Z. u, G        sync ();
0 i- C  e6 C$ }) v        save = *addr;
) ^4 L0 p( `. ~, Y& ]        sync ();
% X+ ^# y& _% Y% n8 u& y        *addr = 0;
% [, F$ U! P( Z1 f8 L# E% M4 ?2 g/ E1 O, ?( D
        sync ();; k3 b: J# Q* C! f- r. q* y3 Q
        if ((val = *addr) != 0) {6 `# _0 O, V- g2 X% m! F
                /* Restore the original data before leaving the function.: D( y, p  z7 t0 l
                 */3 \; k, ]+ X. K7 n
                sync ();
. k$ [; g+ c1 i' W) S3 `3 S                *addr = save;! |# D, \$ m$ e+ D
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# v% y" }* k+ Q. p
                        addr  = base + cnt;
7 o' N' Z1 D/ I0 {9 {                        sync ();
) l2 @3 Q' J' j5 ^- \+ \0 H$ R                        *addr = save[--i];" K/ x6 g- d9 G+ q; [' D7 d# O& a
                }
; v2 J# e0 H; i4 _9 X                return (0);" n3 O) E( a5 I8 I1 E6 z0 u
        }
' o  j7 J3 ?( I+ E$ j5 x8 H% M: y
! N1 P4 t, g) ]/ H6 ?# F; W$ t        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 T6 |# m* ~4 c* f
                addr = base + cnt;        /* pointer arith! */: V) z7 a% ^; x9 y, Y4 J- y& l
                val = *addr;
; ?, O, |: A# q, e' T, v9 X( H6 N                *addr = save[--i];
! C# [. _) Q: R) m1 m                if (val != ~cnt) {4 J- C5 _2 B- \5 i$ Q
                        size = cnt * sizeof (long);+ ?, s: m0 F# `" i
                        /* Restore the original data before leaving the function.$ v; A3 T1 `" u% [" _5 p& P
                         */
/ p8 P0 m2 ]" D                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ ?- V9 z6 S. C: \7 _6 f/ T
                                addr  = base + cnt;9 `% ?9 n! E, H
                                *addr = save[--i];/ l* G0 O% n1 D' U8 r+ A
                        }% C+ P5 @; s6 W' j
                        return (size);$ e3 |$ C. W$ \$ l7 E
                }9 s* k7 X3 r  S$ O
        }
5 d) q& j' g; I1 C4 {. U) G: J- B: i6 y' J! v4 C5 \
        return (maxsize);& ?8 d  H  {1 _: l9 D3 E$ E  M
}
$ ]5 c' `  I1 \1 wint dram_init(void)
4 [( i  t2 l# E$ D' n- q{, l0 J8 F4 S/ ~" U; t+ @, z
        /* dram_init must store complete ramsize in gd->ram_size */
# w2 ^# o9 P) R7 _& _        gd->ram_size = get_ram_size(
' ?8 V9 V; i1 Y+ ?                        (void *)CONFIG_SYS_SDRAM_BASE,
* M% U+ b. v% c* t) \                        CONFIG_MAX_RAM_BANK_SIZE);
! j& ?" P$ `5 a6 p% T7 N        return 0;
' k8 o" X  w% L2 |: b3 U. Z}
, H  C4 {5 y7 @( {, C: @
+ c2 c+ g) i; w( I0 i
. @4 B4 A4 t; ~) S
; p% B  O' R* q% ~( ]* T. D6 N+ b; |# O/ A, a1 y: Y
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!5 H: N- V( z9 z  e, w

( n: n  A, a) b$ h/ h6 c% `1 ]. E! C# \2 ?3 u* }
& U* m4 |& w; r; L& [8 {9 T$ N. J
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-12 00:04 , Processed in 0.040603 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表