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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
+ E1 j5 W* W( Y1 O: h5 l核心板2:DDR2 256M Byte   NAND FLASH 8G bit
3 Y* F" A9 c, v, D! Y  f! ]这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?1 h3 R8 R0 Q) O7 Q0 D9 \6 J8 D, o
* o( f/ W/ o! }
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 W9 h9 x  S, X$ E/ H* h$ j: R, G
6 T! T6 Q; x7 c: |- t) R' U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:6 D2 S* U" r4 H! R7 C0 ?
/*, u& n) f& C9 c0 X: Y
* Check memory range for valid RAM. A simple memory test determines
( h! _' l! ~4 w* Z+ g8 R# q( [* the actually available RAM size between addresses `base' and
! G% i& S, e1 q+ j& m* `base + maxsize'.) O# X3 f( j* F* S. M
*/
" \3 |8 N5 r1 X- m. Qlong get_ram_size(long *base, long maxsize)
  t$ m, e$ ^! Y- H{7 H! I: E1 N% i) j1 l" Q) V" ?1 S6 v
        volatile long *addr;% _* F5 q8 c/ p0 ~1 i
        long           save[32];
' d3 c5 _* N1 Q        long           cnt;
- U# D# }7 q7 r- e$ K, I2 @/ ~% T        long           val;
2 }6 n6 M) v( T6 D* x        long           size;/ \3 y8 o& q4 W" ^; w$ [! P5 {
        int            i = 0;" ?9 J6 o! T! d( G& L7 U. ~

6 S# N$ v) h* F1 W! P        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {/ x! e: l' F1 W" ^- h/ X7 \1 `
                addr = base + cnt;        /* pointer arith! */& X5 ^: \$ P8 d! O* ^& p
                sync ();
; J9 o/ h0 D# {# G3 j                save[i++] = *addr;; K  I) d. S' S# z) S( |) X
                sync ();; X2 p# H/ {: U/ l/ o0 A+ C. e+ T
                *addr = ~cnt;
7 \# N% t) s  q1 n: L6 v. t        }* X( o6 [- r! W+ ~& h4 e/ k/ p  w* c( p
& y& l* }" B; V$ @3 N& h
        addr = base;. _6 Z) D, E( e3 X& m! i& l
        sync ();2 ]6 p+ o+ H3 f9 G3 q
        save = *addr;+ B; r% l2 m8 _# J6 [5 o& ^) @" S
        sync ();
- k* |9 h( F2 i0 |- \$ E" k& Y        *addr = 0;
  I$ H0 z+ B, O% T; ]4 R
+ F! s3 V1 }- \& _5 D+ c5 [        sync ();
; B% Q* ]; j1 `1 c  @5 p7 w, h        if ((val = *addr) != 0) {
* p# S$ l, N2 p4 t5 m7 }# J( O                /* Restore the original data before leaving the function.
) T* }( ^! ?  a" a) e' {                 */% D# B8 Y8 ~3 m" q0 j
                sync ();
) U9 S5 D1 N, l4 t$ H6 D  j4 P; {                *addr = save;; z8 f) @5 @) l2 ]) a$ y
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
3 J! \- T+ ^9 e( _6 I4 {                        addr  = base + cnt;" D! @6 z* \$ z# }9 V+ T
                        sync ();
0 l' U0 O$ B4 H5 X3 o9 Q                        *addr = save[--i];
; h9 z" U3 B; P. g% j6 l0 T* @                }, L$ ^% Y4 u1 v- f& u) y
                return (0);
# c1 }% D5 t% f( [, @5 J        }
5 R  X4 P) M7 [# E& I
0 B' S  z! R7 V- a4 ^+ X% N        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- k- g: [' N! Y7 u1 c% E' Z- M                addr = base + cnt;        /* pointer arith! */
- H+ h6 l. D# u2 _- M3 p4 @- a                val = *addr;/ o7 z; v0 d$ ~1 |/ Q7 U
                *addr = save[--i];
( _% C+ f& Y8 T. L5 B4 \$ t                if (val != ~cnt) {3 |8 f% A. t9 |; I1 q$ d$ ?/ ~
                        size = cnt * sizeof (long);
1 _) U! a" _9 v' z7 }                        /* Restore the original data before leaving the function.5 C- ]9 j, U. w# N+ V! ^
                         */; U) `+ |2 x$ M
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( n0 H3 B2 d' w& p# h
                                addr  = base + cnt;
5 Y) u8 w! p9 c* e6 V6 U                                *addr = save[--i];
0 L9 }; p: Q& x, n. M                        }& _2 T6 J" u1 k
                        return (size);
6 J: s: y* \- z( J7 y                }0 \  i8 _+ {$ }# Y( M
        }
8 S$ }" c$ j2 M, b* q
4 r, ^" Y2 A. D) M) H- }        return (maxsize);
8 e" h- m# S* ~}; E1 c0 b( B7 y4 |; ^1 D
int dram_init(void)0 `8 U! o3 ?1 k8 |4 A$ g
{) Z& I, \% ]: q% |+ A: ?
        /* dram_init must store complete ramsize in gd->ram_size */
% }# Q  p0 @+ r/ U        gd->ram_size = get_ram_size(
) E; H1 [" c" M9 g" B7 W3 i1 {                        (void *)CONFIG_SYS_SDRAM_BASE,% @& r" M  t* g1 d3 a' u( n/ `
                        CONFIG_MAX_RAM_BANK_SIZE);# c' F( o2 n9 B1 }! C1 p
        return 0;- I/ ^* M  }0 z6 z2 }
}2 ?  A1 V2 f- _2 b) J

& Q# L7 J8 j6 l6 S: M! t% N8 }% t

6 @! x+ }0 t& p# o, m' j; N' H9 _
/ x7 Y) F: S- e8 ZFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 ~9 [4 W  F+ e8 J4 I6 @

8 P; o) [2 e1 ?4 B; \4 W4 ^% O$ g$ _0 G( K& U- b2 z* u$ U( p
% S( M7 o* X- z+ V4 O5 P/ ]7 L! k
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 21:54 , Processed in 0.037948 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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