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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ G& E# x  D0 b* D核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; @+ ?5 F& Z  G: U! }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
2 _. o4 q- \7 Q+ d! r/ o7 z8 F: }# D# m3 J5 Y# @; I  P3 R
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' p4 ]: U8 R- u! `5 V% I* e1 x

5 _) e+ u1 }6 Y$ K1 t! [+ M- Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:* o( `! U  Q3 t  y2 i
/*
+ W* K; G$ H) \3 X* Check memory range for valid RAM. A simple memory test determines( h) R/ s8 k. K3 {& _
* the actually available RAM size between addresses `base' and' I3 R) y% z7 d1 s  g. _% u5 a
* `base + maxsize'.7 m2 r) ?9 A* O2 a3 x3 [
*/) g. F' B8 }8 I8 L. L" ^  ?) ^4 E
long get_ram_size(long *base, long maxsize)1 \% g6 E! H; e6 |6 d! A8 h0 |
{/ B8 y" d, C2 p
        volatile long *addr;
4 o0 Y- G9 w1 b9 e        long           save[32];
! a4 c' ?# H* X+ q        long           cnt;1 K# G+ U" p, k6 K$ k
        long           val;" |$ t2 ]* m/ n& o% @* V
        long           size;
' X9 f* f& d. b2 V1 A5 h/ A        int            i = 0;
, y! O: b, w  u' D; o. d4 s; L) e# Q8 m; F- b: k
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) Z$ ?; {5 ?5 T% m
                addr = base + cnt;        /* pointer arith! */1 G' p) F. u: O8 ^, S
                sync ();% `8 F, K1 h/ _( D% b
                save[i++] = *addr;
  n0 H" D0 t% G: z                sync ();
2 `9 ~  L& {4 ]7 `4 A  J0 q' a8 I                *addr = ~cnt;5 M. g, K+ u  I( p' f& |
        }0 A  V& k! p4 N& z  l

5 S! l" P, g4 }        addr = base;
3 f9 w8 S8 ~2 B% s  z. Y        sync ();3 Q3 @' D1 Q. f$ n
        save = *addr;
* E$ |0 G2 u$ @5 u  D0 q+ z: D* S+ K% q        sync ();
% \5 q- z/ s/ V* Z+ b/ t7 S        *addr = 0;
( h7 i" {% G/ E/ O2 B5 F; j) X9 X# [% K$ ]( t5 C6 j( `' ^  _; z
        sync ();% B" v9 {! f5 v) b8 _6 \7 e$ A
        if ((val = *addr) != 0) {' s. m% n  f* B! g3 x9 V3 q, X+ m
                /* Restore the original data before leaving the function.
+ x+ T4 r! O, A, U                 */2 k; |+ W8 ^' M( ?' E
                sync ();% I$ P/ h) n. ]+ l7 m
                *addr = save;% I' e- m3 B3 W. p" t5 ~5 P5 I
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
5 o$ S7 R$ Z5 R! g6 y  m                        addr  = base + cnt;" h1 F5 x- a; s  x7 {. a
                        sync ();
' [0 M- S8 I6 I# Q$ g                        *addr = save[--i];
! C( Q# d' I0 ], ]9 ?: P- v                }$ o* E. V* z- b. B. K
                return (0);: ^( L: }# F7 |- b( X2 e8 N- }
        }6 Q/ y! U3 z6 z

9 g! \  J: o' g3 {* Q" p        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {1 }" G: p5 w* r/ U  S- Q
                addr = base + cnt;        /* pointer arith! */
) p, O' E1 T( _# Y, y8 t                val = *addr;# x$ x+ @( H/ y% V4 a% u4 `
                *addr = save[--i];
4 Z/ D/ _: v5 i. O7 N& k5 j                if (val != ~cnt) {' p! V0 t- ?4 _- a& Q
                        size = cnt * sizeof (long);, W4 ~+ ]2 s8 p: D6 K9 {, x
                        /* Restore the original data before leaving the function.+ z& ^& L; n* k; T: P( k
                         */* K4 W! h! i$ o! p" A* N  j
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ r( _) k* R1 e* p: x4 E                                addr  = base + cnt;
& h2 T  L. N) f: Z* }                                *addr = save[--i];
: \. b- w( `. e! U' ]3 ?                        }; l3 p& ~$ d: i3 \
                        return (size);& P. w6 `% {' D% `4 w' o8 r( l
                }
) l! x! I% P# O4 E/ n. p4 t        }- n# O7 v) _0 Q8 ?' ]
" X" s4 g# h# o7 I9 B7 L
        return (maxsize);- O3 s& O9 c- w. ^' w; C4 p0 m( v& h5 m
}) r$ M) n2 b. v9 h% w: N
int dram_init(void); k4 Q$ C! |; J/ m. y) r# J
{  j! {# v& C) {* L( A4 B, I
        /* dram_init must store complete ramsize in gd->ram_size */: \$ m# X! V; D  F+ b! l' L" C6 E
        gd->ram_size = get_ram_size(
1 Y: w4 _$ _4 V7 w2 [                        (void *)CONFIG_SYS_SDRAM_BASE,- m+ a6 ]" D' n
                        CONFIG_MAX_RAM_BANK_SIZE);
9 P0 N. x; V7 |0 I9 a2 o, S        return 0;
+ l: h  W, l7 w( O}" T% x; q$ n. V

8 r. G; n$ r' A; ^8 B) ]2 v) u; j7 z0 V+ D4 q3 B

+ {0 R0 Q+ Z/ O7 u* V' _# i  m
0 Y; P# E6 O2 Z5 X% UFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, U7 E. l7 C/ Y
9 {7 K1 N; U. ^7 J2 L: o% l) h- s

* T* g. x9 Q% F$ S! p; l( C

: {$ B. \! b6 _2 n8 m$ R2 y& O
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-23 17:06 , Processed in 0.040460 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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