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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( m. c. B  _' D, l* r& i: v- o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit, u4 d8 N; Y% y  |, t" N
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
( s+ m3 v# C& i2 U9 e2 B: k3 r2 h) K9 f# z* \
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?5 L) U$ }* d. Z* I
$ L% t9 }7 R$ @* ]; R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:- C( f' \0 K1 m& N
/*
1 F8 R) [  j6 V* r% ~* Check memory range for valid RAM. A simple memory test determines
7 b  }6 K6 p, F! b% F' R% |% {* the actually available RAM size between addresses `base' and
1 W3 e6 C; E/ L5 Y* `base + maxsize'.; x, s7 [9 z+ t0 {2 F1 Q$ h
*/
7 s. G! {: u' X9 olong get_ram_size(long *base, long maxsize)
, p4 {+ D1 R) e' E5 W* X{+ B6 W7 _1 Q% a+ R( c
        volatile long *addr;
6 r( a, N$ O3 L) M. h. ?$ O        long           save[32];$ G7 x4 L/ K1 f2 t( A0 @
        long           cnt;
" _2 J* N( _5 R, z+ G. [  R& m        long           val;
  {' _+ d$ c: I, S3 ?0 ?        long           size;
+ Q  i1 |/ b$ @1 t        int            i = 0;
0 I% o& C* ~2 v) B
% b. W0 r2 y* y8 f9 R8 M; e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {" V2 g+ g" S. K1 w9 i6 \$ Q3 Z
                addr = base + cnt;        /* pointer arith! */
5 `) d" O: \9 M) ]6 `  u* T                sync ();) w  R+ n5 u  Z, x" `4 z$ e5 M: N5 _
                save[i++] = *addr;
; K- \% k) G+ W) b% t0 N                sync ();
! a8 j# Z( z) a( Y2 I1 w9 g                *addr = ~cnt;
' I! M5 o2 w( b0 ^: W. J7 F        }
; Z/ H! [' [, n
# L  n, N# [3 h0 S$ Q7 [9 T        addr = base;
+ i0 h) Y; v+ Q% ~! E) \        sync ();; T$ z) e+ B! e; G8 @' T/ H
        save = *addr;
0 ]7 K; C) \% q+ D7 W        sync ();! c, O& y# @2 X& c
        *addr = 0;2 Y# f3 q% p; P6 \$ {4 g$ Q

$ I" d. b' K& X3 ?- @. l$ a        sync ();& v* x/ `9 N! I) T+ T' ^3 h3 {
        if ((val = *addr) != 0) {! T, J: j0 p/ K9 t
                /* Restore the original data before leaving the function.1 P5 H- |- B& e' |& |$ e
                 */" n- H, m6 J* }
                sync ();
2 ?3 U2 v9 x( q                *addr = save;
" ]( h* T- \% D' y                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
1 i! x6 u9 x' P$ ]                        addr  = base + cnt;2 Z4 v* E! @& i' d8 x" P2 J
                        sync ();) m% w* b. u  r" h, N
                        *addr = save[--i];
5 V. ?* V5 J) S- V4 k                }% Q: q$ J" J* F& w; r+ L7 W  ]' J
                return (0);0 O) t% c$ D0 F6 k
        }* v6 U" ]9 u( d5 N& q) L
; x' v/ J, O9 P7 u: w
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 @" y/ o& t4 Z. g3 p. P
                addr = base + cnt;        /* pointer arith! */
  Q' @* k( T( i5 t" r$ }- [1 G                val = *addr;
4 ^% Z1 W. v9 A. @                *addr = save[--i];
& F( ~* ~7 t, h( q& f; R( x                if (val != ~cnt) {5 T  @0 h* l1 g: R9 @: _
                        size = cnt * sizeof (long);
, @3 T6 V) S0 W: W/ U! W                        /* Restore the original data before leaving the function.
  u' _3 X( v5 x$ S4 C# ^8 f                         */) ~- T, d7 \: }( G# t7 r6 U
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( z3 v+ o" I4 y6 A
                                addr  = base + cnt;( \- Q' V0 v1 b' _
                                *addr = save[--i];
# j  p% x6 U- ^5 f" C                        }7 C" e- ~' Q! L. {
                        return (size);
5 ]  D; j- w; m# c# O- T* j$ D& M                }
; X2 \" v; k8 t$ Y8 l% \        }/ F+ \" l& e0 Q' s2 I; [, F

' k( H" h! E! X+ R6 J! l        return (maxsize);$ M) ^  K+ B4 a3 `/ A
}7 M7 H3 x- H' u- e* \- R8 y
int dram_init(void)7 k; S2 s; M* ?4 Z5 G) N3 B
{8 y1 I" s  @- [$ e+ C! L
        /* dram_init must store complete ramsize in gd->ram_size */( ~9 I0 x2 g7 W1 j. u0 B! l
        gd->ram_size = get_ram_size(
- W% F! T. |2 a* Q9 _7 d' P: O                        (void *)CONFIG_SYS_SDRAM_BASE,  r+ v/ _; P- D; ^9 X+ e
                        CONFIG_MAX_RAM_BANK_SIZE);
2 V5 T# b! l( I9 ~/ J        return 0;
: x1 ~) I8 w" l}
# [1 Z0 e4 H- G% ]
) U+ ~, l$ r. b% k, M+ c9 w4 x$ |" `( S1 E6 b/ ~% c

3 f; @& K# x  X- E0 ?1 s1 Y+ Y* O8 E, k$ H
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ g) e- g; `, a# v& b8 O* h7 o! e2 \5 N1 u# p
4 D. @# A* J7 @0 O& ]4 n' i; ~
0 T1 {2 ^$ I! M
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 12:24 , Processed in 0.037460 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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