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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
. Q9 i+ i2 n' ?0 B9 D- P. m9 M" h4 o核心板2:DDR2 256M Byte   NAND FLASH 8G bit
( ^% e* P" J  a2 T这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?$ L% s! I3 M0 W

: \0 D% I' i1 Z7 {* Q) b是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
' q  x+ V7 Q7 C9 h0 n
) S8 X  o  X8 `2 U  s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
: I6 S( J3 o/ n+ h- K/*
  l! D. V4 q4 _3 l! T& [* Check memory range for valid RAM. A simple memory test determines
" r( U! ^3 h( O5 @3 \) b* the actually available RAM size between addresses `base' and
( [" Y- H+ v2 h# ]' l" W( ]* `base + maxsize'.
1 y. _' W# p- a* f- o9 g% |*/
1 \# Q7 k( T! u2 c8 P, [8 c" Along get_ram_size(long *base, long maxsize)
% j3 D: _6 w% z  ~: ?- \. k{) M/ N% o- U3 C# U! K% C0 i, W" |7 z
        volatile long *addr;3 {: `# w1 |  T3 H/ M2 v
        long           save[32];- {. i3 Z. c1 I" \
        long           cnt;) Z( Z( _. b& u% Y( X1 Z7 v5 l
        long           val;
4 n( w1 q1 `  L# U8 B7 Y        long           size;
& X, v( i) s% Z' V0 u        int            i = 0;
/ W7 m( X% H  a5 y- }1 e
2 A1 m' o. ~: {6 w" I) C$ J$ n        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
6 d7 G: `4 `! R  i, ^                addr = base + cnt;        /* pointer arith! */
; h- e) O6 F$ ?+ Z/ h2 B1 B                sync ();& a2 c! ?6 L0 P% w3 Z2 M
                save[i++] = *addr;
0 k2 M# N  V# V- C. H8 ^0 R( l1 A8 I                sync ();( P8 d6 O! j( z" j( `
                *addr = ~cnt;
; c. n1 }9 Q8 a; ^        }
+ f8 ~( l% J: R0 d  o* C$ T8 C/ c: T" Y4 ^" }
        addr = base;
1 ?: z% z3 k6 y1 z        sync ();
1 `+ i4 g; A3 M/ }/ L        save = *addr;
, l0 R6 S% h8 h" c! ^        sync ();% x/ v( V# S5 E. E/ Q4 h/ Z- P
        *addr = 0;$ F! p3 L. B, j

' Y7 a+ E) w3 w6 ~4 x        sync ();
* {: _0 j  r/ R# Y( n+ i( e$ M1 Z        if ((val = *addr) != 0) {
; {" ^- R" F) U0 H+ A" |# C# j                /* Restore the original data before leaving the function.2 K  ]; ]' m) f/ h' _2 ~  V! a
                 */* K2 @2 u) l# U' j0 c4 O5 Y
                sync ();
* \, k, t: c4 D; w/ ~                *addr = save;: s% @7 h! _  r% h; I; j2 N; _
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" c5 |: U7 j7 ?$ m+ ?7 }9 t- ^- e
                        addr  = base + cnt;1 ^2 J& A6 Q/ i$ u
                        sync ();  V( q7 C2 n  r4 B7 m2 b) p
                        *addr = save[--i];& U4 |7 u8 }1 q; o( d
                }
7 L# P, T5 Z, E+ |                return (0);, V2 y/ X  }4 J) ?2 b; a. g
        }% Y4 U+ w$ t+ j7 X4 H

9 j+ b; ~. I# s9 c1 v  u9 }- }- K        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ o+ s! |' @' G5 z8 J3 K
                addr = base + cnt;        /* pointer arith! */
7 {. K) V3 ~* J6 q, G: o                val = *addr;
6 q4 w. Z3 t- |  v+ }) H                *addr = save[--i];) K7 Z2 Q3 j$ w6 A4 a
                if (val != ~cnt) {
' `8 U/ n+ j) M2 w2 S4 u3 w* T2 C) b1 S                        size = cnt * sizeof (long);
6 q. z( R- h* O9 ^3 i                        /* Restore the original data before leaving the function.
$ C- O8 B1 Z  c" v; o: n                         */
) q1 X& I8 h" p2 W8 `) p6 E1 ]                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. ~  \3 n. C# m                                addr  = base + cnt;9 j1 f2 e- P. k8 e5 s% R2 w1 a& I
                                *addr = save[--i];/ x, ~& d1 J3 }3 A
                        }
+ A2 f) }2 B; |0 a                        return (size);
1 r1 u4 K& b- ?& H                }* L' ?# Z+ N# p1 u2 u# _/ ~: @
        }
6 B: C* Z1 J+ |5 c. |0 b2 D- ^9 o8 d7 y) {5 ]: r
        return (maxsize);6 h5 x; }& }' U2 o  t) H" r5 ]
}
$ |% q7 i. m' v; l* zint dram_init(void)
' _' h; @1 K% H{
( h1 l, N5 ?6 q$ @7 l4 ~) }2 x# j        /* dram_init must store complete ramsize in gd->ram_size */
0 e$ F2 a! V* B# V% }0 c        gd->ram_size = get_ram_size(
8 b, w. v3 U! z* d; c                        (void *)CONFIG_SYS_SDRAM_BASE,! y9 r8 L0 `" n" W! W
                        CONFIG_MAX_RAM_BANK_SIZE);
2 i5 e- x6 d5 t4 H. Z( L        return 0;5 k  X( s6 h7 \: ?% w2 e
}
' |% z6 D2 i$ ]: b6 ^6 M- q* S2 [3 ~0 K( `
  m3 M* r% P' t, U* ^

# Q. k6 w! D* m' I
- ~2 O( y. B. \0 t' QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: d6 b1 E5 t5 l( S" c, K8 ^% k
9 u5 S, p$ ~3 ~4 Q: d; e
- P8 T7 t7 g! A
  A# m; h3 [' {/ a( A; M
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 21:37 , Processed in 0.038874 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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