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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. [  d2 s. l: E: S+ v! g% b; s3 z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit7 |( r. o3 w, j
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' ?) e* }7 v$ _* `0 u( R) a: N  @6 I- d% W/ @
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# m' I, V* A) ~& b# S8 U1 F+ ~0 U- P# l3 ]1 g9 q. o# W2 r' }8 w, g: w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
3 F& {( x3 T. h, m/*
* q& t3 e, A; R6 v/ Q# ^- X* Check memory range for valid RAM. A simple memory test determines
3 o. y2 p5 T) T4 W; t* the actually available RAM size between addresses `base' and1 b) S8 G+ \, e
* `base + maxsize'.
6 r5 ?( j/ c# x* F1 j*/8 m# C, T& O; k# x- B
long get_ram_size(long *base, long maxsize)4 v7 B8 O+ T  H  i% ?
{- t% B( }' r/ j3 `* {
        volatile long *addr;
) z; q4 b$ }1 }: d0 Y# V& q- X        long           save[32];
' g+ y/ y/ P+ X3 W6 ^( e- p6 ?! b9 }        long           cnt;* o3 e: ~4 L8 e8 \# @
        long           val;
9 Y! v9 B7 m2 \  r        long           size;
9 q- L" a' P- l2 ~        int            i = 0;
0 k! ?6 k: `. d* r3 \0 R* p4 k7 J* |- j/ F' @
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {- l. e4 m! a: t8 d- N
                addr = base + cnt;        /* pointer arith! */
$ [2 U/ r9 ~: r' E( S                sync ();
% F. N8 y0 P2 i; H# P, \- H                save[i++] = *addr;
# d* Q/ C* U" V                sync ();+ `' f# H5 f1 f8 R& p' Z
                *addr = ~cnt;
2 W  m4 _% A) V4 E0 u9 v+ \) ], A/ b        }
/ J% z4 M! T+ [- o( Q& H) p' I! f+ X" n# B5 c
        addr = base;
& P% q0 G. c7 M: f1 }9 Q" z; U3 h2 p        sync ();3 E8 _6 N+ g* s% ~- }
        save = *addr;
+ E$ v2 J  d1 S: [8 x        sync ();
/ ~, U4 F3 n. W/ X5 D! e! t        *addr = 0;) h' s* n" x& \. r/ p- r' f

2 M0 |) F- K! R2 l7 v& y5 p3 O        sync ();+ J" j1 z: T. w" `5 R4 g% a
        if ((val = *addr) != 0) {. a) N$ L7 V  _2 @) |; b
                /* Restore the original data before leaving the function.% k# i! G! Q- t+ w* a0 g) {. _
                 */1 e1 x# ]$ `' a# S) t3 E/ }. Y  W) a
                sync ();
. v- c! [  n! h& q1 t, _                *addr = save;
- L4 N, V$ r6 x: H# X                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
/ F2 @! f* t" X4 G- V                        addr  = base + cnt;
, b+ G2 p: _( ^1 K7 e7 r                        sync ();
: o7 X- p$ @6 T                        *addr = save[--i];, Q1 x% w/ N6 H: P: M
                }
2 ^1 k5 e; p2 X0 T1 `+ M7 L                return (0);
; |! b% N6 f$ c. ?. O" J        }
$ @' U1 J8 _/ @6 m
3 w, s+ M: g$ M        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' ~1 m6 ~4 A% Y& ^2 R2 I8 U1 T
                addr = base + cnt;        /* pointer arith! */
7 F! Q8 D+ f% w                val = *addr;" o7 ]+ Z# \: ?5 b/ r
                *addr = save[--i];
* Q  D+ ^# r4 T4 j; L. R; A; }                if (val != ~cnt) {
& [( Q1 O" [; b/ G, k7 A                        size = cnt * sizeof (long);
- }- x, Z# j+ I* n  u                        /* Restore the original data before leaving the function.
( _, N3 U& Q5 S7 D/ h8 x/ w                         */4 ]; z- j3 R. f& p
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {4 A$ c3 F) e8 c" V: s/ h+ o
                                addr  = base + cnt;
: k* f; D* G/ P6 T  i1 s, t: y' A                                *addr = save[--i];
) j0 W) ^" U+ L9 W6 _% ?: k                        }
$ L8 f, ^* D  F& M( M- {' U                        return (size);; d6 H9 C, |( p( n( R
                }& k6 ]5 o. ~2 ]- S: J3 F" ]
        }$ A$ z( Q! r& T% ~# T

5 h, O' G/ K0 x3 Q7 ]        return (maxsize);8 p9 b9 n' {% r
}8 B' R1 ~! z$ a8 W1 V
int dram_init(void)
# W5 Q0 T# w1 J8 I. B1 C, a{
$ D" {5 L7 \' o( y        /* dram_init must store complete ramsize in gd->ram_size */+ M1 k0 r! B, a# L; K
        gd->ram_size = get_ram_size(
% z) T1 c0 [0 ~                        (void *)CONFIG_SYS_SDRAM_BASE,
1 G1 H# c6 t* m                        CONFIG_MAX_RAM_BANK_SIZE);
# x1 Y: @& F# c8 u+ |        return 0;
1 G& R; C" R7 Q1 M1 k6 [/ W) v6 `}6 x% Y8 w: ~8 J6 W; p
% V: F* `& t* N5 C/ Z

+ |7 o9 ~' V3 L% V: ?/ g; \, k6 z) d$ c
0 D" _8 p. @& S2 c+ F: ]" J+ A# ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
  a4 e! S2 B0 y6 e8 t+ F9 p# z7 `2 H
! ~$ Z7 O( i! d* @! n) E
: S/ @' f* N3 I: |( e

3 t8 a4 j9 H  p1 [% \" K$ r
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 19:13 , Processed in 0.039026 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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