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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
5 b2 P/ G1 x& i; w核心板2:DDR2 256M Byte   NAND FLASH 8G bit; c$ a. t; u2 l7 H5 d3 ~7 P
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
, q" a7 _) j3 I- `$ X( ?
) Q/ }+ l% S5 P/ u# x3 J是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 c! |7 H3 [' X+ j& {" U6 ^
- F: u: L4 d' T( l$ r" j: A. q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
0 l6 w/ t2 R) D# Q. T( R, B  M# S/*
2 w: C- A5 _5 \5 Q9 e' @* Check memory range for valid RAM. A simple memory test determines
4 q, g2 p6 f! M. s0 M- Y4 Y* the actually available RAM size between addresses `base' and
( P( c. F# a7 z" S2 a* `base + maxsize'.
7 t9 ?- K3 g( }& e*/
; \1 ^! h7 k& Z! n% P. r& G: llong get_ram_size(long *base, long maxsize)
6 k$ k  q4 s  W{1 J2 S& A. o/ Q, Q  T# d
        volatile long *addr;) W* I( i0 C6 }% P
        long           save[32];
  v2 O2 N+ I1 p$ j" m# ^0 k        long           cnt;
! K! W7 v7 M. C0 X+ O  s3 }- ^        long           val;
% X+ K  c$ W6 h; l2 v! W' M3 E$ H        long           size;
) T8 k4 [* Z. O# _  _, z' A        int            i = 0;
, i0 t8 W% W1 R" e  f! q7 |+ o
- ~2 e5 @" M3 m7 c5 ?2 G( G/ `        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
) w, t3 w& S, y( O( I" |                addr = base + cnt;        /* pointer arith! */. r3 Y' x3 ]2 d2 s" t9 i
                sync ();: A3 y. a* }: }9 H+ D
                save[i++] = *addr;4 H* P5 Z' O8 }5 |" e7 g# ~
                sync ();8 Z' X% E1 R3 p4 }7 Q' r
                *addr = ~cnt;; y! t4 S  K& t) U* r+ a' G
        }
8 r! T1 B% t/ S4 N9 `
5 P& w4 ~" B3 P( j6 l  c) Y/ d        addr = base;
, D# _# |3 l+ W* y. g; t        sync ();" ?! Q- Y- v$ L1 k; t
        save = *addr;9 b- z7 X7 u4 F6 A1 l
        sync ();
- }0 j2 \& ^+ W1 H        *addr = 0;0 B6 g  E  A3 D! y# Z# p
6 k. [2 h+ o; X8 e4 n' x
        sync ();: M' L& T. }5 X, Q
        if ((val = *addr) != 0) {
( `+ o1 K) M5 ]; ]; O# C                /* Restore the original data before leaving the function.
7 `- l+ d9 G/ x. x                 */
) Z' {" y& O9 s, E# ]. `                sync ();
: ]# P* V3 M) H" e& l" b                *addr = save;1 L0 H. a$ |0 }  R! }
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
8 R0 ^- q" ^# B0 ~! D# V) G                        addr  = base + cnt;
+ A) |& X  f0 ]+ m5 o0 t  J4 X                        sync ();
5 e+ I. C4 b, y" F# \                        *addr = save[--i];
2 k( D3 Z3 ~) Z% L6 P/ ]$ i+ p2 G                }4 {' e7 c; I1 F5 y, K
                return (0);; C9 U# F$ @4 \6 ]$ B8 B1 h% @) c
        }
3 I% N6 @4 f" r$ R& Q' ?
$ x4 Z$ h1 I) q: E7 p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
0 a6 `9 d* m( \                addr = base + cnt;        /* pointer arith! */) ]# Z  ]  p' ~- H, Q$ x% }) {
                val = *addr;6 V) s1 d; T9 p, r7 w
                *addr = save[--i];$ z/ ?: Z8 X' ^
                if (val != ~cnt) {
( Q. q0 p/ ~9 e  d+ Q                        size = cnt * sizeof (long);
( B2 |( J/ ]& X1 i4 l& ~7 m                        /* Restore the original data before leaving the function.6 G* Q3 K& h5 V0 }: H
                         */
) M/ {8 `3 x1 m7 v3 Y4 \( Y% c                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 I+ d2 }+ I2 _$ z0 c                                addr  = base + cnt;
* C4 N. P  o- k$ b                                *addr = save[--i];
' A8 k( h7 V; p, K- E                        }. \+ m, U2 H4 V
                        return (size);
/ |" h# q" k8 r2 N( o4 O  b                }
0 O( r' \  k) h; \& V: ~        }, r3 ?2 Q. B4 d; P6 W/ @( |4 R
3 J, t# b: o/ w! R5 A* V
        return (maxsize);3 H/ K4 X" J* V$ D" e6 N, c1 J
}) n3 W! m. |. r$ m# u
int dram_init(void)- j2 D* }* a; h" b
{
9 h- ?6 f$ ^) B* v) X        /* dram_init must store complete ramsize in gd->ram_size */" M- ?* I& a3 V9 R: j2 _
        gd->ram_size = get_ram_size(& F6 g4 k$ J( i" `' T0 N3 _% V( h
                        (void *)CONFIG_SYS_SDRAM_BASE,; b) ~7 k4 l1 t# ?) G
                        CONFIG_MAX_RAM_BANK_SIZE);9 O4 D5 @* `& d* u
        return 0;
. @2 U5 D5 v* u1 M4 E, ^}
! h; q  e$ A* @# Z7 J
" A; c, d- R" b' V8 R- t; v& C
" Y7 \  X3 _3 U- P: `, x0 k

$ S, ]) p' P4 h  J- B/ W0 UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  x: w/ t2 Z, K8 Q) E
8 a5 Q0 d9 w3 }: x0 L0 _; g

9 F: f: _3 t6 E0 ]

: H' ~, t6 H; V6 g& V5 T7 {- ]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 04:55 , Processed in 0.037900 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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