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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ I$ P1 I, ~  v% u0 p4 u核心板2:DDR2 256M Byte   NAND FLASH 8G bit' Q5 j* T. V# Q5 c
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 e. W- ^$ z  c- |

  ^! o( Q" z* i是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, i5 n% L; {4 K3 V" `
' C- }7 Y, \  A5 I1 k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
4 s$ O9 _/ ?# y3 A6 E) Y$ O0 _/*  q2 l+ K0 w( m, u% j2 x* x
* Check memory range for valid RAM. A simple memory test determines$ u$ L' ^+ D  n+ y
* the actually available RAM size between addresses `base' and
' `: ]- `; P4 K  }: F1 ~$ K! q* `base + maxsize'.
% [+ z+ |  q+ U" b*/% r% K/ Z1 M& |& l9 t) \" e# v
long get_ram_size(long *base, long maxsize)
9 ~8 F6 X# ^( a" S{
$ d3 V$ n0 y8 O$ n! T5 h- I* v        volatile long *addr;
; G* Q: Z8 N. T9 P' N) k' w8 Y7 q        long           save[32];
% x" n% N' n2 X1 z( k: C( A7 K. K        long           cnt;
  M8 g# r# r# G1 W) q: P0 P        long           val;/ p# h4 U  e5 F7 u8 W
        long           size;0 v, {: V  ?2 o9 T5 l
        int            i = 0;
, ~, M& A% _' t. f
! Q: b, Z8 ]( H7 v        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 y9 X: F+ h; g1 O
                addr = base + cnt;        /* pointer arith! */" D+ |4 a5 i2 M* A# [
                sync ();! u. p7 F; s* ], q
                save[i++] = *addr;& I/ b& l4 ?& q! o; Z
                sync ();" D) L/ m4 g6 Q0 F4 N; B$ ]
                *addr = ~cnt;
. Q  H$ s" T/ i  k0 @4 b9 z& V        }
. ]4 K' s* q9 U! x* W! `. s! V9 P1 A; Q1 d! C2 q4 ]
        addr = base;3 Q. @  R$ }( v
        sync ();& b% y2 E' c# Z
        save = *addr;
3 H; ^9 X* A* X1 N0 y        sync ();
1 i* f: `' A/ {  f; A        *addr = 0;
  B- ~. y! S: X7 m2 M0 e& z5 A3 D( N; r6 @0 m8 T
        sync ();: i8 P- M3 s$ [- X5 O
        if ((val = *addr) != 0) {
) e+ `! @/ g) S4 j* K                /* Restore the original data before leaving the function.
; p0 D" p4 s* O2 N: _4 T                 */- v! g1 C+ H$ Y2 _: }, H
                sync ();
+ d2 f( \) I% p* G! }                *addr = save;4 |' z$ ?+ B+ y5 V
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 y; `! Q* I8 s9 ^  j                        addr  = base + cnt;
+ E/ p- M7 ?& ~- [$ ~) u  Z                        sync ();# V3 Q) y4 F& S. i. d  ?% E
                        *addr = save[--i];0 D6 J: f1 _/ _$ i1 l2 l$ K8 r
                }
$ y0 y/ F$ \9 q& G( W0 q' H                return (0);
( d5 A$ K! S8 G  `  |+ }1 k        }: `8 W9 `1 F: \/ C" y( g- S
3 m% l6 m2 Y1 [, p2 B1 d$ t
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
9 W+ u* }( m5 a; v6 z/ J: G                addr = base + cnt;        /* pointer arith! */% F: ^% N6 t/ n) z- K% D
                val = *addr;
, ?0 s# ^! T+ m2 S, Z                *addr = save[--i];
' h! }+ \* p0 ?* t4 _6 l                if (val != ~cnt) {/ a" l8 z5 G# ?/ K
                        size = cnt * sizeof (long);7 K. N& z" y4 C+ j2 J8 [- [
                        /* Restore the original data before leaving the function.- f/ _9 F3 |. z. [1 H) [
                         */: k* X; K7 @8 a( K1 f- }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 `6 W6 X, }: F9 A' j
                                addr  = base + cnt;3 ^. {6 g+ {% Q
                                *addr = save[--i];
) ^! N/ E- `  k1 v1 i- H7 |                        }4 I5 \! F! [- P# Q
                        return (size);
$ D. t$ ], q  t; u) l8 Y) s( p9 g8 W                }
$ \# L2 r6 T" C# |& o6 I; v        }, ~4 i' b6 P* H& O
1 E% w0 u$ v# r  M# J* }
        return (maxsize);
, T0 e  I& b; X}
7 t& q" ^  Q# q& U1 q2 S# qint dram_init(void)0 J$ g0 G2 E8 s6 a! Q
{
4 [. _, Z) C# n: r; }9 n+ t        /* dram_init must store complete ramsize in gd->ram_size */
2 O) k* C* t6 k( Y+ l5 {$ j        gd->ram_size = get_ram_size(
" w. g0 k, h% V- k                        (void *)CONFIG_SYS_SDRAM_BASE,
1 A( g" J1 ]  o+ O                        CONFIG_MAX_RAM_BANK_SIZE);* `* d6 f4 G' V9 m. f# Q1 w6 C
        return 0;7 A+ F& L# b# m' R! N; y/ ]
}+ C+ n/ y0 o8 [) C% M/ f/ D; ]! {

- v( A+ ^' b: a* W( q; ~
: L; x# n7 K7 C# L; F* e8 A9 J/ {+ W( `
: W/ ?1 i* s5 A3 }& g6 ]7 d9 m5 p1 H; {; C# b" L1 u; T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
; J. ?8 h! h& Q/ b0 l7 h! A- [: Y. j0 a5 P3 J0 S
( d9 l2 h0 m2 b# `) M8 ^
& }# ?3 w2 C! R7 N. j6 S7 R* U* y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 02:04 , Processed in 0.054740 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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