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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, t; q6 ~1 G+ M核心板2:DDR2 256M Byte   NAND FLASH 8G bit5 G+ }  D. U; \! n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 a! H0 p0 `$ r

1 Y6 h% N0 p) k5 I2 a- Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" }9 _# ]- o9 ?" i! @' H

  t. c- D$ n9 t& F7 S: w0 y$ t( f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:3 v. b& q" E% ?+ m4 W; E! [, a* Q1 L
/*9 d$ }" T4 j0 r  I
* Check memory range for valid RAM. A simple memory test determines
! m3 S" K6 T. P, S* the actually available RAM size between addresses `base' and
8 k% t. L; O; N: z% R* `base + maxsize'.1 \( I# Z& p3 m- u& H. z
*/
" J7 y+ I& a, Jlong get_ram_size(long *base, long maxsize)
0 `) L2 j+ O2 u/ g{
7 ?2 G. q1 n% A$ C  c        volatile long *addr;
: X  X! {- n( W, C0 h        long           save[32];% U6 H2 ?( S. R* C3 r
        long           cnt;: @3 H1 c; m4 j1 p
        long           val;
. S$ `) Z1 v! S) Q. y        long           size;
" p4 N/ N9 T# k8 w8 I4 e        int            i = 0;& n5 r% F& F* ^/ e1 ]; f

* `# w& ^3 w  ~; W        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- n. H. i% Q7 c; L$ {                addr = base + cnt;        /* pointer arith! */5 I( R: k0 b: O: f( Z+ n+ m
                sync ();3 J$ O  ]; p0 Y- n. I: m3 l+ f
                save[i++] = *addr;
, p) z" c" w7 [& i8 ^  `3 D( \                sync ();0 V) K# @  `! y2 Z
                *addr = ~cnt;- w) s) J; S9 n
        }( X4 y7 x0 A9 y( I: x

* ]0 j  j) X: E( D        addr = base;
) G( v  j! }4 x8 J  E5 }3 A& _/ r        sync ();) E2 n; M* C. a: n" C$ g
        save = *addr;1 r3 e* B, x, ~) c/ H4 R, K; g& L$ m
        sync ();
/ I% a5 m! @7 K* i/ U4 `  A0 T        *addr = 0;7 C  @- Q: g: \; M) g

9 {: P  l+ G4 J: ^+ q        sync ();: P% e8 ~% B9 E/ ]  t
        if ((val = *addr) != 0) {/ n: u6 b! Y' y% o  K
                /* Restore the original data before leaving the function.# H) ^! c6 d" }3 h. \3 N4 D
                 */- W0 ?( }& L/ c' ^9 C7 z, N; `0 w! `
                sync ();
- b5 a! e* h9 ]                *addr = save;
; \* S  w# G" C4 S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {8 i9 v8 S% i3 a- U0 K+ W
                        addr  = base + cnt;$ S) l; X. }  V$ R/ U
                        sync ();
' v4 Q, H% I5 u' s7 B2 n2 V                        *addr = save[--i];
, j/ N  @5 a3 D                }8 ^3 m) p/ y' F# ]+ |9 X1 q
                return (0);
: M& ?- l1 p4 w" ]  }0 B        }5 L# Y' N) `, W+ Z2 ]$ C6 k) k
2 f! p/ l0 |  H7 ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ s: Y; J" A- }- J( w, {2 C                addr = base + cnt;        /* pointer arith! */
3 z9 R4 i- L& q" H* c0 {                val = *addr;
( Q2 U" K/ s  G( E                *addr = save[--i];2 r8 M- H, \/ z7 R5 X4 L1 D
                if (val != ~cnt) {
# l; n  [- z6 A) H                        size = cnt * sizeof (long);
! u& u4 p2 L4 Q0 }2 V; v                        /* Restore the original data before leaving the function.
' o: `5 U8 }2 S2 `  z2 a, ~! L                         */3 x3 F/ O$ O" y2 t& v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {# \9 l3 c  z( Y: L' V
                                addr  = base + cnt;
0 h. `0 ?5 R9 g9 \8 F! z                                *addr = save[--i];7 z" ?: S! B- T6 Z! a
                        }1 @7 Q0 K( I6 x6 y! M
                        return (size);, D, ~# f" I/ @1 C$ R4 |
                }7 r' k2 X+ ?8 F! Y
        }% s6 m" h9 E8 b0 U
0 @0 m6 e2 T" z; K7 G3 r" ^
        return (maxsize);
& ~$ T: c: ]+ z- n. J}# S( c5 J4 E; K, `5 `* R5 R
int dram_init(void)! r" S7 ~$ O- \3 |
{$ F6 l9 n9 c; E. h, b
        /* dram_init must store complete ramsize in gd->ram_size */
2 l9 z( n" d* U        gd->ram_size = get_ram_size(7 i* b+ J( T0 m, r# R/ ^8 \
                        (void *)CONFIG_SYS_SDRAM_BASE,
% B- u8 m" s! n  y9 p) n: E                        CONFIG_MAX_RAM_BANK_SIZE);
. Z! v0 M" d0 e1 n8 N- W: a6 T0 q8 d! x        return 0;  g* r8 d/ d( A
}
! @' @9 O% G3 t3 W
$ E- Y8 |8 h! G& M6 D, L! N8 Q5 ^3 ~' s7 u! @9 V
$ V! ^- K/ S+ v* I9 I+ p/ f

# k2 G- G. d( ]2 o3 CFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
" @) p4 r0 U% X; }2 ], U$ C* y$ k0 o. @! ?9 j

) Y# ]: l! C' d

' S& r5 k6 e# p9 U6 b, O
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-21 13:56 , Processed in 0.038084 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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