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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( c% I0 l0 C4 y; E4 n1 n0 W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit; @7 X/ N' S" ^" d& C! N8 {8 `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?2 {' f( L; F, G

" @4 z- W$ y$ s1 d% a" [9 L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
* |$ B. h9 u3 `6 `) f3 ~7 A+ {, ]5 ^% F8 ^: h. B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
* |1 ]; d" L6 b) N$ f6 a" o$ M/*
# [0 S; A7 W6 x6 [8 H7 g* Check memory range for valid RAM. A simple memory test determines: @' y; s) a9 |
* the actually available RAM size between addresses `base' and
1 E+ y. d) X3 [" z2 n* `base + maxsize'." d% z: ^1 s3 L; q! ]! h
*/- E2 X) |, q  Q: H
long get_ram_size(long *base, long maxsize)# B3 ~. d1 z8 ~( I
{6 E6 q) L% E, q
        volatile long *addr;
; `8 y9 J% D: H" \        long           save[32];
0 R1 }0 F0 ^+ z7 W- w        long           cnt;- m$ P  m/ B2 t
        long           val;& G3 `' ?: ~% U
        long           size;
  l4 L0 h& F0 P  ~. L+ f" k        int            i = 0;6 ^1 G; b1 v# q
& p: r1 Y2 s9 r: B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
% _4 W: `; @; _- S                addr = base + cnt;        /* pointer arith! */
* n9 e) ]+ U& b: m! V  U                sync ();
/ I- j* N! q! i( c: W                save[i++] = *addr;
- T5 V3 i( t0 D                sync ();' k) `4 d( x8 }9 }
                *addr = ~cnt;( A; G8 |' Q, U8 R1 a
        }+ i! T7 e. U& z; X+ x% o- Y
8 z, y% K5 g. \" e# z
        addr = base;) o, Y& u" E8 z! N) y
        sync ();
0 b$ t. k- S2 H5 {: y        save = *addr;: ?$ Q3 v  W7 Y+ u$ z
        sync ();
+ Z" B7 X4 C* |; @6 G        *addr = 0;" x5 v. r7 X; ^2 P4 {- I

! P# z6 f) ]! o6 ~- g        sync ();; O, H+ l6 _5 p4 i
        if ((val = *addr) != 0) {' Q0 x$ p1 V) @2 u, r; i# h8 I
                /* Restore the original data before leaving the function.
$ N% \' P4 `; N7 [1 `                 */4 R. s% n# K: }1 l( ]
                sync ();
. w6 c# n* g- u" P% j( u8 ]                *addr = save;
9 g1 @) n. k$ V/ ~/ y! @) ?                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 O8 k3 R( Q* c; ]6 r                        addr  = base + cnt;
5 \( u7 e0 x; y5 v# ?) I                        sync ();+ q9 E* j+ u- l( q
                        *addr = save[--i];6 o' V5 i* d! I7 s4 Z
                }! |4 e1 W% s/ O$ ~8 e$ j
                return (0);
+ W0 D$ J6 e0 t3 C: k) t+ C        }
9 [' u& q$ W$ @. G; P7 i
, P* i0 N6 L. G" J3 f        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# {$ V+ i$ j: X" [# r) i2 ?
                addr = base + cnt;        /* pointer arith! */
5 Z. ~( l; U; \% X% j0 U                val = *addr;3 R4 W( Q! B# k# v; t, j5 f
                *addr = save[--i];8 n- z& H  T# z! o
                if (val != ~cnt) {7 N. M% X7 N0 r: ^; Q& x
                        size = cnt * sizeof (long);
: O3 K% I4 j" {2 R: `* f: N                        /* Restore the original data before leaving the function.
7 e1 h0 N6 }  }8 X5 l6 p! S4 c                         */
- x0 e. Z8 k) T6 A                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ]" N# O. t9 T2 b$ ?
                                addr  = base + cnt;
* u" N, l' D' @3 E6 N                                *addr = save[--i];) ^0 b3 W1 ]9 b
                        }
1 @$ k- x# r* @8 {6 R                        return (size);
* h! R$ D" y4 \% o: D                }
$ x6 R" f2 r% K. A        }2 T& I: z! v. o7 c, A5 E

' Q. e4 v( Y/ l        return (maxsize);
" O; t* N5 W  V6 m: B( z3 z}$ _9 B! V4 O) M& B
int dram_init(void)7 |+ R; X: U6 s- p/ q/ k' p3 A
{
5 e* L4 I3 g; f  Z2 I3 d. `2 y        /* dram_init must store complete ramsize in gd->ram_size */- v4 J4 g0 n# C
        gd->ram_size = get_ram_size(
7 r, F8 F9 u0 G) m; N- |                        (void *)CONFIG_SYS_SDRAM_BASE,
2 y, h' b1 Q( F4 t                        CONFIG_MAX_RAM_BANK_SIZE);) W4 _' ^+ ~; {( C2 W
        return 0;5 H7 z8 t" T- K( H
}
6 b1 J1 }: }: F+ V' |/ m- ?/ H. r
7 ~4 o4 r) R- T- L
; b  b9 {# u% d+ m% V, @! ?+ ~* z, t. t4 r- C

. l1 U7 ]4 O$ B9 ^FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 w: d( g/ d* k5 }* f& ~  {: g0 ]- d# a: Z

/ L' h5 b  m0 x

3 d( q2 O, N6 Y# P& Z
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 21:40 , Processed in 0.037587 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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