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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
8 Y3 F" y2 v5 X1 z/ B核心板2:DDR2 256M Byte   NAND FLASH 8G bit
: _" c) T! j7 V1 x& y这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
* v1 ~1 L6 Q$ g% l7 t( E
  ^# v* d4 ?3 x' b1 q* j$ ?% o; G是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 q- R/ V5 F- |: x
$ o. |. D% v  {% X0 B* x: E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
9 c2 C- B; E; j# V% g/*
5 r! C9 Q+ z. I! N! g2 W1 H% A* Check memory range for valid RAM. A simple memory test determines
6 z  ?9 [* o, E* the actually available RAM size between addresses `base' and
4 Y* q2 N( _( a+ ^. \3 K* @* `base + maxsize'.
' k; q+ W/ m* X1 _*/# F4 P# u3 ^: h% S$ C0 C
long get_ram_size(long *base, long maxsize)
7 J% Q2 a6 e8 c$ o* ?3 s  I3 ~: L5 h! V{9 u6 p' y) ]) s! Q! x
        volatile long *addr;
( l: c  u, F$ c! C        long           save[32];
' u4 E* m" x/ [. h7 U/ }- S        long           cnt;
9 K+ U/ v, U' t8 L8 A        long           val;
+ r) N! j& ^; G9 q' [3 Y0 l3 _        long           size;
2 C% e6 G2 O& J" p        int            i = 0;( @1 o% x* b2 Z) i; g  Y9 q
' k) W4 \/ |+ H* t0 }3 p
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; \# ^- P  l$ \- f2 M
                addr = base + cnt;        /* pointer arith! */
" B) _: g1 E8 i6 H3 Y: o  F                sync ();
, J2 g# n7 G, v+ u                save[i++] = *addr;& l: q) n4 M/ [
                sync ();3 R( P6 [7 y" v% t; H4 z6 y
                *addr = ~cnt;
, i( ^- v) r  w        }: ?% _9 H, @9 U  }* L9 q5 Q

# j/ q; i" v! i        addr = base;/ h6 m. B( Y% p5 v( m5 ~' o& c
        sync ();& E/ b1 u. F% v/ }# u- ^$ {
        save = *addr;7 S& l+ k7 r" f1 b9 @" _: u  S
        sync ();7 h7 |8 U! D; A" ?$ D. w- l
        *addr = 0;8 a, W" x/ ~6 U! G$ ]0 r

- Q8 y- J, d$ E- V0 j  J        sync ();
! X+ ~$ C( q! _  G7 B. |' d+ G7 U        if ((val = *addr) != 0) {' v4 m1 @/ `5 [9 k2 S' g
                /* Restore the original data before leaving the function.; ~- A, d$ p6 B) J
                 */, [7 Z1 j0 R7 z3 Q8 X' l& ~
                sync ();
% m( G; M( V4 S+ Y1 E' o' r                *addr = save;
3 y3 h- m4 B9 p- E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# L; j) `6 r# |3 Q$ E: W  T% j                        addr  = base + cnt;" j" d! `1 J& p$ t
                        sync ();
" `# H  @! U  v6 @: ^. a4 }) C( c                        *addr = save[--i];
* D+ F* {6 ^3 Z8 \                }
; j. r1 r6 t# \  Z                return (0);9 K; ~$ n  T# i
        }' }" F/ s0 R6 q, g/ I
; I; `  l! q0 d& g! P- d
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {, p/ P0 S6 D" a: [6 I
                addr = base + cnt;        /* pointer arith! */& u; t% D' j! @" t$ n/ Q
                val = *addr;
$ `- N8 ~+ z" P: O                *addr = save[--i];
7 Q; a% W/ P& n% ^, C                if (val != ~cnt) {
6 ]7 W1 [. e+ {. x) r" ^7 S  E                        size = cnt * sizeof (long);% P5 ?% |! c: W/ E1 q+ q/ S! J
                        /* Restore the original data before leaving the function.
1 a6 T* h, I" ~, z                         */$ F6 l8 Y$ w5 d+ i& G
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {6 |! l+ ]$ C4 {. p4 B6 v: n# m
                                addr  = base + cnt;# J& O& w/ _9 @% \% D
                                *addr = save[--i];$ n% s: z- O* ]+ r$ N6 U
                        }5 u1 _# \1 f9 E4 b
                        return (size);* A: g8 h4 H4 W- b- M5 H) z
                }4 E1 D. r* s) @- P0 }. k3 T
        }* T/ o' v3 L8 F
+ @5 O9 L% L4 L# I/ r( b2 |/ t5 v
        return (maxsize);" v- X6 L: M5 B( i+ I
}  z( s3 n( I; v+ X
int dram_init(void)
" r/ M! f- n- [" V5 h% Z  i0 A2 p1 g{3 M2 f8 j4 J+ k+ h: B  j4 B
        /* dram_init must store complete ramsize in gd->ram_size */
9 r4 g: B  j: K) x9 x        gd->ram_size = get_ram_size(6 o& J4 F. B8 F0 m# r
                        (void *)CONFIG_SYS_SDRAM_BASE,. y5 }4 u) R4 S& }, g
                        CONFIG_MAX_RAM_BANK_SIZE);
/ v4 T7 F/ I1 p. |. C        return 0;
- K5 Q! S, {/ }+ U6 e! E}* m" |5 y/ C; q. i) {! w! G  p
( i$ ^3 \8 J4 v

. ?: l/ `% Q, O( H9 G* {# u. ^4 Q$ E; z; e) j' O+ W. @- p" k
2 e( s, {8 s. }: |
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) T& \; O; w7 Q) h
( |0 b  p5 T) i1 G: R) U  }! t6 `
! ^3 j' |% e8 Y1 o+ V, N
) L, h) R4 q; |) v
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-16 22:20 , Processed in 0.035878 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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