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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ Z5 M% Z/ ?/ j; Q0 q核心板2:DDR2 256M Byte   NAND FLASH 8G bit/ D/ b) Q6 @" }; _% S2 ~
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
/ x) E' N2 z& M% z
- I$ h3 ]; I& E9 M9 F- d- _是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?, ?0 Z- V0 c; l: z9 e7 H& B5 S

+ a* p  x) k0 @; @. v7 J: z4 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:$ J! g" [$ k' e1 B9 T: G7 y
/*
% T& l; S  Q+ B$ Y* Check memory range for valid RAM. A simple memory test determines. ]  Z9 U- |  m8 D* [. j5 q: z
* the actually available RAM size between addresses `base' and. E8 N+ R  i/ P7 k' _. j! O5 x1 ^
* `base + maxsize'.! D4 L& w- ~, J4 \- f
*/
  o6 D# [7 t) N* {: hlong get_ram_size(long *base, long maxsize)9 @, k5 U7 y) a% s4 |
{1 s6 j- d  ?7 s6 _7 V+ ]; k3 ?
        volatile long *addr;+ g9 ]% L/ `  O$ ^8 Q! r
        long           save[32];4 q: f+ a" c( i+ g# M5 T
        long           cnt;  k4 _' S1 p. u! z
        long           val;
: o; o' A# \/ Z7 y* u1 O; W+ M5 r        long           size;
8 C2 a$ a8 N$ Z# |$ H        int            i = 0;
7 R* H: T* |  o' S% m* P$ s( T; K/ R1 Y
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ C$ w( c. o2 b1 N4 R( J
                addr = base + cnt;        /* pointer arith! */6 i' {2 N2 T! f1 C4 y
                sync ();; n5 R$ u" d0 }& f3 b
                save[i++] = *addr;
3 N6 e$ H+ x( `: J                sync ();* F2 k4 G5 F2 g3 ~
                *addr = ~cnt;! B5 L$ @! O0 G$ ]
        }- u* ^' D% ?4 [) H0 A' r
$ ~! ^) ]7 n; F
        addr = base;. {1 L# W7 o5 M  g* A: x& {0 K
        sync ();0 L2 Z9 c6 \8 ^$ Q
        save = *addr;& Q: a* I  ^' k; T! X$ F/ [
        sync ();1 }$ g. q# l2 W/ n
        *addr = 0;6 a2 H6 A6 g# O/ k

) ^: d) b7 C/ l        sync ();" a8 l5 {6 s- k; ?6 _
        if ((val = *addr) != 0) {
# V2 i. H  |# X, g& u7 y; O                /* Restore the original data before leaving the function.! `/ u) ]- |, q
                 */) k' v$ @# V* B2 h5 ?* W
                sync ();
3 w) N4 S- t" ]: P( b- h                *addr = save;
  B, }  z( n  U5 A# S) A' g                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {9 y: s' [  W, T: Q4 o0 u
                        addr  = base + cnt;
6 u! w0 r. V0 s                        sync ();
3 o* Q7 G; r+ i) r8 z                        *addr = save[--i];
: A- N. k! h* P, O# J                }
9 z; @/ F5 f. C9 y0 s0 Y% |* T                return (0);
, f7 ]5 r. X0 q1 U4 ]        }1 t  r1 E$ r# g! K( F; m

) Q/ Z% Q- s" q3 s1 a5 G        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {. n3 N3 l; r& _/ \
                addr = base + cnt;        /* pointer arith! */
8 [7 e/ `3 u2 a1 R! D" Y9 M                val = *addr;
+ j; u4 \. _" c- d! O                *addr = save[--i];" n  N( |; i2 j8 O' B$ T
                if (val != ~cnt) {
9 d$ g. E& q. H* \+ Y  o8 _                        size = cnt * sizeof (long);: w! b) T2 f' `6 ^/ c
                        /* Restore the original data before leaving the function.0 T  ?5 b5 f* A$ z. R2 }1 F
                         */& e. d. A: U, N% [: T9 z' \
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
& A! M! h; N0 R                                addr  = base + cnt;$ l* l4 K/ B2 R4 r2 S
                                *addr = save[--i];
. m+ z+ j- h) @3 \: |$ P                        }) R+ S/ z. Q+ W# B4 ?. M
                        return (size);
/ i1 {1 m5 X, X$ G6 m" @/ m% b9 \                }
; z1 h1 K6 S: N) M        }0 _- l; ~8 N4 h6 a
! Z9 C  a/ w5 S
        return (maxsize);
  t6 x* i6 d) p}7 ~: R5 h( Y3 n- X% [5 X
int dram_init(void)- B" \* u) P% L6 [0 z2 z& C, F
{4 D4 {4 f/ z& e
        /* dram_init must store complete ramsize in gd->ram_size */- }2 C! m5 A/ R! e; ^
        gd->ram_size = get_ram_size(' h( e( P( d* \6 n
                        (void *)CONFIG_SYS_SDRAM_BASE,
! `7 D6 ?2 t: x2 s                        CONFIG_MAX_RAM_BANK_SIZE);
# C8 Q! B# H0 A; E/ V, _) N2 ]        return 0;6 Q" ]  p5 v2 i; P9 F
}
. q. t$ V8 T, t& M' C8 u( z) J3 f/ g* d) J2 A
8 E$ D: A# g3 G" |' K5 a+ h
- l  E4 ?- s8 B, d* U

/ L2 k. U- C3 K# T% p& M( MFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# l. L1 Y( `. L; W4 o
% |: P8 |* E$ U: S8 L; h! r# I2 [6 P2 s& W- n# n( ?) c) g$ F- X

/ |% N+ E1 N+ U6 b1 R
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 07:35 , Processed in 0.036756 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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