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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit) T; b, n+ {: O- Q7 L, F7 O& v5 X
核心板2:DDR2 256M Byte   NAND FLASH 8G bit1 `# w) N- e, k& v
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; I) ~! T- _% k7 ~5 B# _9 @1 k% r2 B
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?- H9 f- O' v. j' [5 C  _
: }+ i2 E5 _: e# P# _/ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
6 W5 A  s( }* n1 E- B/*
. [" u3 x2 [/ _/ g" B2 R* Check memory range for valid RAM. A simple memory test determines& |6 E2 m/ Y3 G" b6 z% C
* the actually available RAM size between addresses `base' and3 J! y( ~0 h/ v5 o3 |
* `base + maxsize'.
  p  L' H* M- R( ~  |*/
7 j* z3 d( B1 K  M2 r) clong get_ram_size(long *base, long maxsize)  T1 i/ [$ Y2 D! V
{
; T0 N! [/ H/ a0 h0 b: d, o, T' X5 C        volatile long *addr;
4 G+ m5 P2 b* K9 U5 e+ I        long           save[32];% U+ L$ x" b3 ]$ j% u
        long           cnt;# @# H3 E$ b& @! W& x, a4 o
        long           val;) A# D; A0 y  H4 q
        long           size;* |9 h. ~" Z% C- t% M2 U; _1 S
        int            i = 0;
9 w+ m0 c/ Y6 ^6 f
4 q, I6 G3 r0 E: C' s0 a" w        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {. [  p" u" R/ y3 A( ?7 A' D7 G- C( x% e
                addr = base + cnt;        /* pointer arith! */, |2 S. B! B( v! |$ {& t6 u5 h
                sync ();1 P" a* r) U- _5 p+ a: F
                save[i++] = *addr;
" G2 x5 ]: R8 y: P& H1 G" d                sync ();
. f" `; l9 [, a$ y                *addr = ~cnt;
" t7 U& L" {, `' G- r        }
6 p% C, L: g( Z8 x  [# B. r9 |5 z! ?6 o) c
        addr = base;1 W' }3 ]) E& y( ?8 U
        sync ();' @/ B4 R8 M* K  M! I: A8 O
        save = *addr;1 `4 e+ m# l$ o9 X% x% @+ R$ j0 e
        sync ();+ q0 n& u" @7 ]( I( I' {
        *addr = 0;
4 x! M8 W* ?9 r! h: L
9 _% a" N( b6 h8 [! Z  R' o        sync ();( ~7 j0 Z9 T3 E
        if ((val = *addr) != 0) {4 Q; R+ o. d' D& }1 d6 L- l# @6 i+ J6 s9 [
                /* Restore the original data before leaving the function.
& q/ U, Z( S& _                 */  F: ?( |+ ^' ?& g# d- @3 _& P
                sync ();
: d; _4 i9 Z* |! i6 u                *addr = save;/ ?5 G  @5 V( _, s8 t% G
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* ]. Q. k  q& f
                        addr  = base + cnt;
) o" l+ n- _; u  O1 o                        sync ();
1 G7 [+ M. ^% `0 D0 ?# m4 |! E, F                        *addr = save[--i];
8 U- k( }, P/ w6 Y; K                }/ v9 R( o7 z8 X7 j- R' I/ l
                return (0);! n, I0 n5 H1 L- R. _
        }& F1 w# P1 c) ~% N6 A
% `3 O( H5 Z- K% F& ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* i8 s" J7 ]* [  y2 V& U! z                addr = base + cnt;        /* pointer arith! */) |( b. l% [/ F2 D# h! K; `
                val = *addr;" S4 `. p1 s* g& b& F6 q9 ^
                *addr = save[--i];3 o8 w: L# v3 Y5 |0 t
                if (val != ~cnt) {( l9 g4 Y- q" v- u6 ~
                        size = cnt * sizeof (long);
3 W. j8 \; ]: {2 F                        /* Restore the original data before leaving the function.* l5 D, w, ^. n' [: D
                         */# N! W) @- v$ Y5 x' x
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
* d( \  P6 @; Z  _4 P) Y- L                                addr  = base + cnt;7 `' X1 E/ N( l9 W" {0 T, ^" l
                                *addr = save[--i];! K8 G% q5 e0 u$ W- F% h- s8 y
                        }
: x$ f1 S% W* E+ v1 {5 C                        return (size);
+ s1 \' f3 D+ \4 I. ?" ]                }
( J. J7 b" v+ u5 y! E% ~        }
2 q  v7 e& J! N- z" _7 z5 Y! J0 O& @$ @! b
        return (maxsize);- y! {/ g1 i% g" z/ z
}
& M3 m8 j5 N/ ?9 lint dram_init(void)6 F3 Y& x% J' X: D. i" k7 T$ _
{! I) z% y$ f% ~; ?+ G
        /* dram_init must store complete ramsize in gd->ram_size */
% S6 ?+ V# U8 I9 y7 i9 r2 ?        gd->ram_size = get_ram_size(
6 _# t: S/ j7 ]# p  ?                        (void *)CONFIG_SYS_SDRAM_BASE,
. I3 B+ [% c7 p3 R                        CONFIG_MAX_RAM_BANK_SIZE);4 x, d5 q1 Q' B" n% ]" s
        return 0;
- N* h; a; {) a2 ^}
) h6 T. Z" c9 v3 D
) R2 j' S6 k# @$ J3 u& t# ~$ N* J/ ]2 ?

! n: a) P* _9 u$ D2 Y$ x! E; j
# k6 G! C2 f: m" Y2 I* I; f& G, f7 {FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, h7 p& N( U; d, u; n7 [6 t
. x  Q# ^8 K! O" ^
! n! b0 ^0 F+ Y0 K; _; q& j
+ E. [) b0 s0 X
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-14 15:43 , Processed in 0.038631 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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