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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit# [; \! n0 O6 A2 f8 L
核心板2:DDR2 256M Byte   NAND FLASH 8G bit* c9 s9 T( q" E7 x) l$ @' Q
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
" `( f: G  G6 q" @# r8 _$ W' k5 n& E# E, X
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) P* w! f6 M/ P  z, }. n. W4 d3 J5 Y; [4 o- i5 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 Z' P& c/ S+ S3 n; O; i; f8 y
/*
$ `- u  X$ M& b* Check memory range for valid RAM. A simple memory test determines+ Z/ T# w, r3 v3 J  c
* the actually available RAM size between addresses `base' and5 w! R" v! k( m# ?9 B: {
* `base + maxsize'.6 J6 h) s3 U1 p5 p2 I
*/
) S3 _. G7 m6 K3 Rlong get_ram_size(long *base, long maxsize)
5 e& L% _, O* H  q9 }& D{
! @0 |! O" G; C! `  C$ s        volatile long *addr;& r  [5 c) _9 w
        long           save[32];, h- K' n$ s+ Y. O2 E$ Y# u" {9 v
        long           cnt;$ q& u5 V# {% l+ o2 a- s/ v
        long           val;4 M- n) c: Z5 n3 ~' T$ V
        long           size;- X( y: P7 }9 v! S, {9 j
        int            i = 0;1 f& ~7 X: f: h2 l' L! Q7 V# ]

0 `; @: L0 ^/ ]7 z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {! r7 i1 E1 V$ v+ h+ \& G* v0 G$ q
                addr = base + cnt;        /* pointer arith! */( T  B' M+ Q+ j. l' \' u
                sync ();
& ~, j: a! C" j  c+ A6 c                save[i++] = *addr;
9 r% y: M# t5 ?                sync ();
( O& h) m( L/ ^/ @# q                *addr = ~cnt;
( `* Q. U" y1 I6 `. _        }
: y& U# r/ E) j% x$ Y
  x9 _+ o# P. B0 v+ r        addr = base;: i2 e' Q3 d/ k7 b% ?: ~  V' \
        sync ();9 O% }2 r# T0 E
        save = *addr;
( @# N  n$ J$ h        sync ();
" R" K/ p* j4 q% |* c5 M        *addr = 0;: g; \# v$ ?7 c& {3 P, j3 Y

. o0 g( T, i2 t        sync ();5 D5 q) S# Q4 `; L
        if ((val = *addr) != 0) {* |( p. \( w0 N
                /* Restore the original data before leaving the function.! L/ W* w; v" n$ w' d  z
                 */% Z5 [! z% G7 R+ K
                sync ();
0 w* ^$ l+ K; f! y& z) D                *addr = save;7 |) V& ^- {1 I4 Q, S% e
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ @4 @0 k3 X; s& G7 O0 [- I: v6 G                        addr  = base + cnt;$ g, z* u6 \: m$ x& \( i  V$ ^
                        sync ();1 m# n7 F0 u# d% V( f( |" ~
                        *addr = save[--i];
8 C5 H- Z0 t2 c" O4 d# C                }% X8 d& Y+ C2 j/ F4 K
                return (0);% }9 o2 U3 l3 a3 E5 H# S) l
        }+ ^; G* R0 `  ~" e
  W9 ?6 Y% _( {0 Z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 G$ J: U- K9 \6 x
                addr = base + cnt;        /* pointer arith! */
' A8 G/ G( v- |" z1 o                val = *addr;0 e* a3 a& `" [2 W! [4 I% I7 b
                *addr = save[--i];1 B' Q/ t( i4 P& g; o) l3 N
                if (val != ~cnt) {& c2 U* N! V/ r# @  j
                        size = cnt * sizeof (long);
: n" u: @" c" l; i) b# [8 Y                        /* Restore the original data before leaving the function.! u- v; g, \- ~4 B# w" q8 q, P
                         */5 K0 W- }& f8 ]0 U' L  X2 j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 ]. @8 ]2 U% D                                addr  = base + cnt;
. R% l; S% ]4 B, v! D% [                                *addr = save[--i];
, i9 D( ~* o+ p% z: j  H                        }
0 f! e" q: L: R( n  t- E8 G' r                        return (size);% G/ x) c  P- S% ~0 O0 _! x/ Y
                }
+ Y  L! C2 Z2 R2 v' x3 F        }
; z# Z: x! o8 r1 f
1 }6 S; }* [* m* R        return (maxsize);
+ e6 }( B* y0 `: G}
9 Z  `! G" B- M1 V3 lint dram_init(void)
* b" j" B0 s3 w& C' H{: k! l6 M( h7 `* j! A
        /* dram_init must store complete ramsize in gd->ram_size */! ^+ e$ R' S+ h  e7 f: J5 M
        gd->ram_size = get_ram_size(4 ~: V+ X! N# z' X: j" c
                        (void *)CONFIG_SYS_SDRAM_BASE,
, W! e) g8 f( I, v( O  _                        CONFIG_MAX_RAM_BANK_SIZE);
% }/ s3 D9 D5 B" o        return 0;* @# d* k$ ]" x. `9 N" [
}  V0 n& k2 E* {$ E; J5 i$ x
3 P' V6 p: L  B( m. B
! ]0 J" d# [$ k! E
$ u* P3 G$ k4 {; e0 p4 s7 {
5 i4 e+ w& e* e+ t- x) L
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, ?5 S/ w7 k! v1 {3 m
+ z1 [* X& @; K* Z! U6 A

; K! T! D# h2 x. r9 l5 Y

1 y' ~* C3 W! K2 C* W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 03:35 , Processed in 0.037843 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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