TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' j5 N  O* c: W5 I
核心板2:DDR2 256M Byte   NAND FLASH 8G bit! D% K% l; J) p0 a6 I4 ^
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?- q& I. |/ X! P

. N1 m- N6 o. j; H( M0 X是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  ?6 Q5 o# Z' N# Q% S) P
' G0 ]5 v$ b0 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( y  g+ L" U; w/*
) M* X# d7 ]5 V) `! E6 y* Check memory range for valid RAM. A simple memory test determines
; U* N2 u" Z/ r* W" V: K: P* the actually available RAM size between addresses `base' and' n' q5 D# o1 g2 w* f
* `base + maxsize'.
; u/ C$ ^7 \8 T6 W*/8 O9 n& k4 U+ ]# S0 [+ w: @# {
long get_ram_size(long *base, long maxsize). m' {6 w; `: _! S" F0 `
{) k) u/ f; [2 o$ r0 z* E% x# ?, f% w
        volatile long *addr;
: b& j+ `$ Q$ u- h" L* z/ C        long           save[32];
$ c& J) C( b! q        long           cnt;
- B3 P& {& ]  x- X        long           val;1 v7 L1 V. _. H& i
        long           size;
0 N; B! \- H  E# f- X* Z% }; |, l; `+ C        int            i = 0;
- }- W6 p3 V! M4 K/ k7 J
8 q3 A( Q  T, W- A3 U1 L9 F        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ M6 }) Q' p4 B0 i; c1 |+ N/ U) o                addr = base + cnt;        /* pointer arith! */9 ]% H2 P6 s. A& [& M6 a# S. I3 E
                sync ();# z* ]0 h6 l6 q: d
                save[i++] = *addr;. A  D4 K4 n9 m* m( @
                sync ();
+ z$ a# f( l/ x1 Q/ M& Y2 C# A                *addr = ~cnt;
# J% t% D) f2 {& J0 V6 l        }' x3 |! C6 ]+ ]* ~" v! x5 j

5 k. O' w4 a' ?4 p: X4 E        addr = base;9 W. w& s+ Z9 C5 L& j' W. ], @0 C
        sync ();# `" B3 x0 c! P# k2 A
        save = *addr;  C3 ~) z8 l2 B
        sync ();: P6 I) F1 P  T9 Y8 ]- i
        *addr = 0;; b5 C) W* k3 H/ m- }+ h! H/ @" b) b
  s+ ^1 y4 j9 P+ @4 s0 ~' g
        sync ();
0 l: k: n* l, X) a+ N        if ((val = *addr) != 0) {
& M: ~" h0 K, u/ {# n7 b1 W* c                /* Restore the original data before leaving the function.- k1 S# r2 x, g& s: @6 d, y
                 */5 t, u6 V7 U/ ~2 ~8 \& J: ?
                sync ();$ v* B# u4 }& n
                *addr = save;3 i! }* U9 `2 I  n
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {1 Z0 F$ w0 t* @5 o6 Z9 y
                        addr  = base + cnt;
6 S, S1 \! s& L7 B. [/ z+ X                        sync ();
3 ^" a7 S3 F8 N8 S                        *addr = save[--i];. A, p7 R. p4 x( I9 O
                }
1 }/ M& O* w# M* S. m) u# O8 |3 N                return (0);% F9 T6 K) G6 I% G
        }9 ]6 R" C9 U+ Z. B! G
+ Q  h0 ~7 V5 b$ a1 b
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 D. f( L: c  V# ]' ^8 L0 \8 u                addr = base + cnt;        /* pointer arith! */  G5 j# g: @, x, s" C+ b2 P5 o% r
                val = *addr;* v: W) A) n& g. m7 e& H5 b) z
                *addr = save[--i];
9 n% f* h5 }+ ]  }                if (val != ~cnt) {- j/ Z, x. J$ e0 }# |
                        size = cnt * sizeof (long);8 ~3 L. D% `1 ^* B  s! G, F( f
                        /* Restore the original data before leaving the function.
1 v& J7 V+ D! E' }* W) G7 u) A1 s                         */$ y: X, [3 R9 A2 @2 L& A  j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& _  g- E2 [; j; u! D                                addr  = base + cnt;
/ a& P, V% B! i                                *addr = save[--i];
+ A9 C" T  u" i5 E4 E                        }4 p  Q" g7 G5 a7 j# S% O9 T; C7 l
                        return (size);7 P- F7 r* f/ }' D
                }
5 W2 W* i/ Y( b" j4 D! \        }
0 `* J9 x' `0 e0 V
) r/ M. `( a( ^: E' U( J/ q        return (maxsize);( B3 }% y9 C; G5 X
}
4 }: c+ y' f: d+ \: tint dram_init(void)& @- D# W, u; @
{
$ k2 G# S& _4 e/ C! H8 A' A: V        /* dram_init must store complete ramsize in gd->ram_size */( O. X- w; g$ R4 i2 a& K
        gd->ram_size = get_ram_size(
' {. r9 z% h" H3 {                        (void *)CONFIG_SYS_SDRAM_BASE,' E' O1 V' M, n- P- ^
                        CONFIG_MAX_RAM_BANK_SIZE);& Q  j8 H% G1 U) B: A, }
        return 0;
( F) X2 r" @- }5 z  ]}$ z6 l, d2 @2 t; b) a, u
8 |9 n8 N0 Y: P) {' B; p9 G  E
+ I% z8 k- g! h9 Y% C" J

7 Q$ l- j2 F* k: O# J2 s& y0 n' ]
2 w+ j5 Y$ @, e& c$ sFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
7 h+ \# Y$ m0 [7 B8 U8 q3 G6 g6 Q9 o, i1 u/ R
, O! D9 H2 ?1 z6 v/ g

7 D/ F& v: u( c$ m; m& X9 x2 C$ @
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-8 16:09 , Processed in 0.038684 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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