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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit% g1 w& B- Q0 N
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
) b8 o8 Q5 K7 M' w5 L  |这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?% U5 E+ j+ G3 _. y0 z) g

' \+ z4 f- M' l6 J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?  m( T: ^0 C) D0 f0 H6 J

' P; ^+ N5 Y$ J& V0 a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:1 v1 z: j. G, i, P" O
/*
6 D* H) M# A7 u, ^  r* g* Check memory range for valid RAM. A simple memory test determines  r0 z& b+ N: b  q
* the actually available RAM size between addresses `base' and( R* ^/ _2 r' V; I
* `base + maxsize'.
) j9 b9 E6 M0 B*/
! o  }; h3 F* @7 i% o1 I0 Zlong get_ram_size(long *base, long maxsize)
. i' v  q( e1 M0 @& b+ S! F{/ X8 W  w: i0 K* Y  S2 u$ @" g; |" x
        volatile long *addr;
7 e$ l1 D3 @/ s/ e        long           save[32];
0 J3 S; x! J( F4 ~7 {6 S" H        long           cnt;
, x% d* Z* E; c8 u: K- r* P        long           val;
( n" r0 r) i* L        long           size;* F9 m: L2 H! c" n$ w2 r
        int            i = 0;
" ~; {7 O! s8 |
4 N% }- e( r! `/ `+ U! c        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
0 y( M8 b' V( k8 s  V                addr = base + cnt;        /* pointer arith! */% f3 r' h/ k" N" G# Z( O7 o
                sync ();
: A0 }9 Q; z* n8 O; w                save[i++] = *addr;
) x: d9 w+ T1 H, d+ O' q% e/ N                sync ();
) q1 p% R" D: l+ [5 Y1 r                *addr = ~cnt;" q# w/ S  U& t  T1 {( ?8 X
        }
% M3 r2 n4 M6 V5 [8 c) b# z' A* L3 z9 b; A- F0 r" n
        addr = base;
  a  I  l& n, I( u5 q2 J        sync ();! y  h2 s0 l8 C& d3 }9 s8 a
        save = *addr;
1 D0 a) `! g2 U0 f8 r% R        sync ();
( V2 j% t6 }0 Y' N/ t        *addr = 0;
+ w# O  h* Q0 n* E4 l2 R3 U( G2 b" D; S0 E/ A+ X
        sync ();
- k: a8 p2 @+ P5 N% g3 h" S' r        if ((val = *addr) != 0) {+ s1 e; w' {5 k) G8 M/ v
                /* Restore the original data before leaving the function.  R. t% R( a, B! V0 B4 P
                 */7 l" t& O5 Z% M/ u% |: e
                sync ();
1 ]+ K0 C5 K; A7 J                *addr = save;3 R) y, P9 N- k" }
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 z+ i5 A! @/ D) t3 k6 [4 a& r                        addr  = base + cnt;; x! L6 L9 E: ~' f  L
                        sync ();
2 l0 A% e. |$ a. o! X2 [- z5 e; V                        *addr = save[--i];% m( F& ~4 t$ G3 a! y
                }, Y# r" ^3 _: o2 P0 a* r: i8 t* y
                return (0);/ U# |- U5 T( D% K2 e6 K$ {
        }
; k" ^4 T& n& {, C  [( f& G9 Q7 k/ `& \; a4 `/ G4 W
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. L% ?9 i) G+ a+ {                addr = base + cnt;        /* pointer arith! */  I. W* B( i" D! W/ N
                val = *addr;
# J" y& |  Q4 U1 p. L                *addr = save[--i];1 t& l/ W4 J7 n2 i, Y/ {
                if (val != ~cnt) {
! r/ N; O, I4 T- i8 f( T. a0 X3 a                        size = cnt * sizeof (long);
6 c6 d: H, h+ y9 X& T( @0 a- _                        /* Restore the original data before leaving the function.
8 N  |5 Q2 Y, ~8 t                         */
/ ]1 k/ J& a. k' q                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 A# ]! m7 s" R1 u' ]* g" d                                addr  = base + cnt;
0 m8 f- H+ ~! Q2 V# v0 L/ c                                *addr = save[--i];3 h6 R& C" z6 k
                        }7 R( F0 r9 O6 ~
                        return (size);4 C8 p/ D) J/ p6 s$ q, d& J' m  ^
                }; K: J, _, h  w3 r. a
        }3 F; ^, o0 ], }# F6 a4 F$ a

+ ~7 l; B# l$ A6 o* }6 A. N        return (maxsize);7 f4 B; o6 q7 y' Z6 r$ W. y- s
}
1 x% `9 l, ~; v  F: F# gint dram_init(void)
0 M3 z( Z2 k  s* b& M0 {! Q{
2 f7 I) j, Q$ Y$ X        /* dram_init must store complete ramsize in gd->ram_size */* Q$ C  D' w1 v
        gd->ram_size = get_ram_size(
# ^9 y9 H( U; q2 I& Q, @. Y4 G                        (void *)CONFIG_SYS_SDRAM_BASE,  C$ C! V( h+ v' j8 T  _
                        CONFIG_MAX_RAM_BANK_SIZE);
/ e* ~  o2 U, `6 c: v% Y        return 0;
  e- V  B* Q4 h4 ^3 y! C}
; ]/ Y9 D6 g: n: f* K: k" I1 Y8 G; ^0 p

" N9 h5 p' t; f8 K6 i9 G5 P* b" y3 z( C- O. T" Q

. P6 s3 N6 a1 s: O7 mFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
5 k9 K/ ]5 T; ^/ {$ q# x; K; b2 @6 i- W1 l4 n2 @" u. G7 u, G

. m6 l  w9 a0 o5 O+ g' q
5 k! S  W0 C% O+ r
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 23:33 , Processed in 0.038498 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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