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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 j/ q0 i: G3 E3 |- z) _+ {核心板2:DDR2 256M Byte   NAND FLASH 8G bit2 Q" p8 T4 e3 @  T% m5 y1 L) q7 s
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?* ~9 \/ G+ X  ^( I
# }5 w9 ^! A2 d) \  l0 R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
- Z7 O$ f' q; q; l! x2 l9 ?" j' A" B" m- I# Q9 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
5 U( y8 R  z" @! g* p0 K% g/*7 K2 z' I! |9 h0 y  T& `  ~) u
* Check memory range for valid RAM. A simple memory test determines& ^* ?% r2 V: W# J  A/ i" @. r
* the actually available RAM size between addresses `base' and
# H$ y4 X5 e: E* `base + maxsize'., `2 [0 ~- V0 ~6 h, `
*/, ?6 |# U7 N# i8 z" v8 g
long get_ram_size(long *base, long maxsize)
; u! a" I+ R: D; z{
: {% B' A  Q8 D7 @8 V; L        volatile long *addr;
6 \! U3 ?& B9 V2 n4 ?; w! I        long           save[32];
1 _  S# E4 r* n! [        long           cnt;3 A: L! w: A5 Z6 [: e4 R, _; ?# p1 x% r
        long           val;# R3 K0 W4 S9 }" K9 v+ x$ e- c) B# L
        long           size;/ K4 T4 T9 g6 x; |
        int            i = 0;& s9 K: R: C) W$ k
! y+ X% G" S8 @7 G+ t
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; a/ Z0 e5 m5 @
                addr = base + cnt;        /* pointer arith! */0 u% a. x) [  d! O0 i
                sync ();
! K% w! T+ l# n1 q' I. z- G                save[i++] = *addr;
0 L  c% s" k$ E. A7 _: @6 t                sync ();
' _/ A1 H% J+ P6 {. U8 p                *addr = ~cnt;5 K9 o1 L- \" ]  V8 r
        }# j  I' z. C" s4 C
. y5 B0 a3 V0 o$ U9 x4 N
        addr = base;4 l; r" o$ {. Q, `6 P. m5 B7 p
        sync ();
  A' y, ^' M; k' l! U$ `8 W/ U+ x        save = *addr;
  F! B5 }  B; p        sync ();) l- l# y& T% K6 d
        *addr = 0;
9 c' t6 f8 I' V" q
- d7 j9 C1 v, [1 f$ @        sync ();. c# ]. |: _) r
        if ((val = *addr) != 0) {
$ w; p+ b% t7 o+ ]* w/ N. O5 V                /* Restore the original data before leaving the function.8 Z' A$ q/ {2 e1 G& k
                 */9 i' y/ F' j4 X/ ]/ }" z; O/ s4 p0 [
                sync ();
+ u. K4 Q( ?9 z" T: i0 U                *addr = save;
! a: ^9 e$ O2 Z# L                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
' r* {6 Z# j- Q2 O* \" X                        addr  = base + cnt;
, G% |. g( s, o5 E9 f                        sync ();& _* h2 {$ X, t, D/ J  j( e4 f1 f
                        *addr = save[--i];
: ]; U) x# t" o  Y! f3 {7 @' c" z. [                }
) M3 d: S% X# Q6 x. R" b                return (0);
8 d$ a3 k: p9 I3 x! k# G        }- l: O7 ~2 d! z* J# {
4 N2 N' ~9 o' l. P+ R
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 r2 D5 ]$ @% D                addr = base + cnt;        /* pointer arith! */+ Z- Z$ i2 g% K* g; F
                val = *addr;
3 s2 n4 _& H% U! V                *addr = save[--i];" l3 n8 P& s# ^
                if (val != ~cnt) {- h+ m- k* [) S  g5 {- P8 G) v# `
                        size = cnt * sizeof (long);
1 Q# z) C- }6 T8 ?7 ~) C                        /* Restore the original data before leaving the function.
' J- Y6 L* H$ L" |$ {                         */
8 u% Y- h% d% n  h                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 ^8 x6 j2 ?7 @& Y: O8 V
                                addr  = base + cnt;6 H, R. V1 O) z# k- P& Q. @' F9 l
                                *addr = save[--i];
6 L* _& f$ c5 }/ V                        }
+ [$ f# O. n( ]/ B* p5 ?; F                        return (size);
4 j" X2 Y) g; v/ L1 [5 [                }, p% z$ ]" ?9 n
        }
6 q( j! F! B+ Q3 }! A/ J
2 D0 R2 i# l" g3 F/ X: p        return (maxsize);$ m7 U9 h! ]+ a! U5 v5 E, C* o
}
8 L) I/ h+ A  G1 L) c1 e% d/ pint dram_init(void)1 o& Z; C, W9 t8 w7 H% q
{
4 ]2 {& n8 m+ Y3 U9 A: V: D        /* dram_init must store complete ramsize in gd->ram_size */
' ^2 a5 r  I, R9 ~+ W        gd->ram_size = get_ram_size(% _$ y+ x! @* R' m& m5 q
                        (void *)CONFIG_SYS_SDRAM_BASE,. A5 \3 g; Z" E, r, {
                        CONFIG_MAX_RAM_BANK_SIZE);4 I+ l" l! I- Z, ]* L& M1 `1 j  ^
        return 0;: H% T8 B2 N- o. ^0 H5 i
}. G6 @1 [3 N# Z& R% z3 Z
  E. e6 k6 o# T: K- O( H  }, p
0 q" ?# m# d. k
  B1 v$ Q& o1 m1 X$ p0 n
8 j1 e, c, ?, w
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
0 n* [: \  p! r
2 Q# B8 b0 u1 C8 k  p: e0 N5 K2 P% A' g/ ^1 F$ c" D3 ^6 S

; K- @- K) `$ f8 K
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-29 11:49 , Processed in 0.036981 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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