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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
7 K  Z* o: F1 D" v9 _! a4 @核心板2:DDR2 256M Byte   NAND FLASH 8G bit, T. [/ `1 }' p
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
: Y& y/ ]. B: D4 `5 I3 g. _% c
, B! e" E/ U& k# h$ ~是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
. ?0 s$ L1 a2 U+ s# ]5 B9 o; `" @$ L3 G- \6 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% b$ ~( k- x* e) j$ P8 @/*
# ?1 s: T- H3 e& P) i; o& I* Check memory range for valid RAM. A simple memory test determines
2 m  l3 M3 o1 k& L' [6 |; ]* B. T* the actually available RAM size between addresses `base' and
) d0 j8 x" p, ^: O% n# c5 y4 L; a- Q* `base + maxsize'.# I  C9 w" Z* r( r2 H& Q
*/
' }8 Y: f! F( |4 u# vlong get_ram_size(long *base, long maxsize)
9 j4 Y9 f3 G/ n) h, [! U/ _{
/ o+ v9 O! i, C5 c  ~        volatile long *addr;9 l9 m8 p! \  ^  r  n
        long           save[32];
# N: o% R- u1 p1 j        long           cnt;! X( r' v& o5 x* F* F/ i1 h
        long           val;$ X( ~/ Y) B( r- i/ Y
        long           size;2 ^5 n* t: C* E- ]
        int            i = 0;% g) I$ Q( o- m8 Y3 R( n) q' q

8 y! }  R$ }8 @; Q% E        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {$ v8 ^' |, `5 `9 `, T/ Y
                addr = base + cnt;        /* pointer arith! */
/ [# X. U+ ]* {9 l: r+ a; Y- D                sync ();
7 d) v' H" k2 Y" }                save[i++] = *addr;
  U2 t* ]6 ?5 j: S+ e; b) P                sync ();
+ k- e: ]6 e- L, |/ s2 e# m! k                *addr = ~cnt;
8 V$ g4 f# t7 e) N2 C0 x7 O3 j; o% W        }
4 {+ ]/ O0 m) c, o4 A/ l7 g+ `3 Y3 p! N
        addr = base;
/ F7 f; @+ l/ t1 k& p$ |: i3 E        sync ();/ W) B- f$ o" m0 \& [" t+ @& Q' Z4 H( ]
        save = *addr;
( l, z3 F/ f& k$ p& H        sync ();2 E- C# n! ]/ z+ X. W# U8 [
        *addr = 0;: k( J1 i, j' p; y( O2 [
) x/ {! ~, m# {: Z( C
        sync ();
9 B' ~2 H2 D& k! _' I% x        if ((val = *addr) != 0) {
9 I; {8 d$ |1 {' S( h+ {9 E                /* Restore the original data before leaving the function.
; g! B% C' D+ e, T, u# n+ a                 */
/ u! b/ F" i  A                sync ();, _6 o4 D0 {) X+ m3 D0 M
                *addr = save;
* p! f# R, p+ O, E                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" }$ Z7 o' y8 T
                        addr  = base + cnt;
1 b, C% d/ C- T0 _- ^9 r                        sync ();
0 g9 v& d+ Q8 \8 ^) s                        *addr = save[--i];
/ {: @2 u6 Y# m                }! H( d# @8 R$ N" O6 @/ T' O3 w( L
                return (0);
( F& O* l/ ?2 w9 n7 D# i2 R0 Z        }
+ _2 y  F8 T* h" S
, V5 t% ~2 k  X/ z  f2 Q        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
( H) Q+ D! }, @9 K                addr = base + cnt;        /* pointer arith! */2 O+ i/ ~- F' t5 _
                val = *addr;
2 {% B) m" w: c* S. M% e                *addr = save[--i];4 }( Z; x! z: [5 @
                if (val != ~cnt) {- W3 @7 q2 q' s' t* J4 U5 Y
                        size = cnt * sizeof (long);; B: [! V) }( M$ f" e
                        /* Restore the original data before leaving the function.$ A2 w* r# V& ]
                         */2 V0 p: [- l1 _, D) z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 s% j5 |( {$ |) A& A8 c. \# ^                                addr  = base + cnt;
' w" K5 E* |3 d4 N- z                                *addr = save[--i];) _" P* F0 V, \, B' _
                        }! Z  B; i; p3 B4 ?. c, S
                        return (size);
& H: M* T/ E7 {: _8 I9 t* N: L                }9 s1 Q- [: f* }% O9 Z
        }* s- L  A: L/ P* F$ {: c

! i7 z1 d2 B* [" }        return (maxsize);
- D3 k' |1 g" O- E- ~, m3 L5 X}) \9 ^# ^$ B3 }- f
int dram_init(void)- }6 p. v' S$ I; t
{
7 X& g5 @0 Z4 }" V7 p" l. Y        /* dram_init must store complete ramsize in gd->ram_size */
" u% v6 x5 e# h2 M! D$ M5 Z        gd->ram_size = get_ram_size(( [5 E  {, Z  B$ E2 q
                        (void *)CONFIG_SYS_SDRAM_BASE,' z% h# c( [' b8 R
                        CONFIG_MAX_RAM_BANK_SIZE);7 ^/ E9 W  `6 G" v7 }( p6 i5 P
        return 0;
2 A% \7 e/ w* t, M! L" X}- J! J  Q' H. Z$ S

% e. W, }' V% J, O3 L0 ~) V3 x8 R0 E: R; }0 ]; E

' g8 r  F4 h* o1 ?: k3 @# P6 V& b4 _, K% W
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
, R  R" ?: ^/ }3 E+ b% y, V& W! F9 G& V  e
! V$ a0 T- I' R
$ c) o1 z; y0 W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-9 20:53 , Processed in 0.043011 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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