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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit( U8 C1 X# I; V+ |4 b1 e
核心板2:DDR2 256M Byte   NAND FLASH 8G bit( C/ \4 S" P' P8 s0 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?3 \3 B; m4 ?& B  t" h

( X( |! r6 B7 F  g# `是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
" V1 |3 H5 z0 h5 [  B
3 T! }8 S, j# ]+ S4 H' H! h) _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ c- g8 Y, H' K; e4 C  i/*: ^2 s( o$ E5 @3 F
* Check memory range for valid RAM. A simple memory test determines; s6 K/ L1 ?( _: P: x
* the actually available RAM size between addresses `base' and- w* {) H' r1 L' O0 f: N+ v' X; m
* `base + maxsize'.
, X" @5 ]0 s) A' |% B*/
/ q- a  p7 U6 O2 d. Nlong get_ram_size(long *base, long maxsize)* M. O& v& m7 q, m
{
$ P) Z. W/ L) f9 F; q* r' b        volatile long *addr;; l/ J; D0 A$ B1 l; \- @1 g. I. l! w
        long           save[32];8 w. x6 `5 [( q
        long           cnt;- W! F" d  L1 X1 L
        long           val;2 h, i  _4 d& U* A
        long           size;0 \) x% h4 S* J. j9 m
        int            i = 0;
  O: h- j& r- a: T3 W+ C( ^9 l8 d4 x) z$ @* f" K
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {7 c# R) i  d$ M; \1 l; z) V' t
                addr = base + cnt;        /* pointer arith! */0 c; i/ b0 u) A7 q: S% F
                sync ();
, U6 B2 l: s! [- y4 A, C) [                save[i++] = *addr;3 J( k2 K; n+ M( L8 S$ x" [
                sync ();; x  U/ M4 v$ a8 i
                *addr = ~cnt;6 E, N0 [( ^" V2 `
        }! m! p) O3 A2 S( e. O1 ~

0 B! _6 O2 E& ~& ?' |9 d        addr = base;! h. o$ ~2 n: U) @& ^
        sync ();
" _* l+ L5 u2 Z3 I. ?        save = *addr;2 L- S8 U* x; p% A
        sync ();7 b3 z: K: r2 k7 T* r6 e
        *addr = 0;- O% D. o. x; C7 q1 W) k- s9 y
% ~$ K5 z5 P$ c# t
        sync ();( N2 L: O% t* \  q( o
        if ((val = *addr) != 0) {7 y: U. h  e* S5 F! X( h( L" ~/ s
                /* Restore the original data before leaving the function.
( h/ X, I; n* W& |) c0 N                 */2 \8 |# }" M8 g4 u# V$ n5 {
                sync ();
7 K, x7 m5 m% P/ {                *addr = save;7 p  Q. m, H" ^) X5 @3 T
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
& w6 \' h4 X1 M; H! p$ \' a. i                        addr  = base + cnt;
. |0 M/ G4 J4 s, m8 L' T                        sync ();
+ B7 m5 F5 _7 j" q. R                        *addr = save[--i];4 t0 _/ l5 v4 C
                }" B2 S. J; U1 T: I* R" g
                return (0);
7 i+ F) h' U/ [7 t        }+ ?. \# x. h# G' Z0 _. _' ~
& K) ~( s' F  B# f6 O
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- E' ^( R1 ?) h! m* J6 r                addr = base + cnt;        /* pointer arith! */* ?5 Z! n1 P4 F' \) L3 L- A2 X
                val = *addr;& B) W: v! k6 r
                *addr = save[--i];
8 e* V! e0 m; I$ i6 |                if (val != ~cnt) {+ @" P1 ]2 E% D. b2 O: Q
                        size = cnt * sizeof (long);# o( w& ], u, d. a
                        /* Restore the original data before leaving the function.0 D% d6 ^" \9 l4 h, O
                         */! p  o2 {& E+ w; ]& e$ m# b
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
3 Y; W! e4 E2 N6 ~                                addr  = base + cnt;; s: \* _# n# m9 Z
                                *addr = save[--i];& `1 u0 |( b$ M, ^" x0 n
                        }
# n6 s8 x- x6 F                        return (size);" P, p  w1 \$ D& C' [- _2 W
                }$ y2 L8 ^+ Z+ r1 Y6 j
        }6 v* a9 d7 m# m' J. M

3 B" |( b! j5 j) U$ C2 r# t        return (maxsize);# [" y3 [* H2 C) j6 ?% O* J
}
; ~2 R% ^4 Q; W' G3 L$ Iint dram_init(void)9 ^3 X; Z( R' i1 I, K: l
{  _7 N7 s$ F* N9 U  P
        /* dram_init must store complete ramsize in gd->ram_size */
  `9 c# r/ F; U+ p- B        gd->ram_size = get_ram_size(
- a: s3 n  T% N: D                        (void *)CONFIG_SYS_SDRAM_BASE,5 P+ x' x1 N0 |, }, O/ z' M
                        CONFIG_MAX_RAM_BANK_SIZE);
) z7 E2 k4 l# i/ V" d9 f" b* j        return 0;5 ~3 F2 d" N& a6 G/ d
}
+ y: N) r2 `. Y% L. H: c4 y
' E/ R3 @* H4 H# C. a, r# g6 U7 E$ x4 D$ a' m, q
- [3 L1 R% |/ K. s1 I# j

6 L0 k+ b) A0 j: P& j% aFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!- q( }9 v: @: |. s
" V4 S3 `+ D* d  K* T  b0 X
4 n# y( l. a5 a9 m/ Z: G2 y7 a
0 J: K- P' a7 @- }8 R/ H% y) u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-4 02:30 , Processed in 0.038556 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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