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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit! A1 V& `) i, ~' `+ l3 Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 i; A4 E% Q  ~9 G
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; D. b, \. ]: c. H: C+ W% ~, z  n
6 k5 e. v; h8 |) h2 o! L' C是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) A. r% d( R# C+ N- Z' a* Z  T/ g$ S5 U" `+ `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
7 y: I* @& y: d' |( p: R/*
) s1 k. R6 T4 N( r6 l1 ?+ ~) p/ t* Check memory range for valid RAM. A simple memory test determines0 G' x0 \! ~* y4 u0 e& R; ]
* the actually available RAM size between addresses `base' and& o$ K8 z& x/ l0 G; G' D
* `base + maxsize'.7 p' c7 ~$ T( O) ~0 b! L$ W
*/  H6 R% [1 n/ p) Y( m+ e9 K6 l
long get_ram_size(long *base, long maxsize)# u' ?' T: \1 r% {4 r7 F9 `1 V2 a" E8 U
{
( c. O" N8 P2 k, I        volatile long *addr;: N) J8 g+ I2 k% r
        long           save[32];5 ^' g( @: X# |2 B% e+ k- X
        long           cnt;) e# ~6 @6 I* f4 T, f- u
        long           val;9 A% i9 k$ H  p% b0 A  b
        long           size;
5 m, `% O7 E3 U' m5 x$ v        int            i = 0;
, e. @, n( n2 Z/ @5 I$ a- j- Y
( _& U" l+ m0 A        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {4 ^- i3 x( x) c, `
                addr = base + cnt;        /* pointer arith! */4 O! M$ Q* C: }3 W& f
                sync ();
& ?5 ^8 g: Q+ `: y; c1 Z                save[i++] = *addr;
2 D# @* d; J/ b- J+ l6 i0 q8 `4 E                sync ();0 B' r5 V! R  ^# t8 h4 y
                *addr = ~cnt;; m! [& `% y! l
        }' D0 c( ^& m/ ?  d* x
' }2 Y# n, t6 y! }6 \$ M- w
        addr = base;  L: O9 G: f+ r
        sync ();
% z0 j" h  X* G5 D9 \/ v        save = *addr;/ }; \4 _9 _  `6 I. r0 H- c& i
        sync ();
6 L* \2 I' T( ]4 A( Q% X        *addr = 0;
0 K3 \. M* D" K& S: Q
+ E% ~3 u  B1 c! q, G% L0 k" H8 B# l' Q        sync ();3 _# s( R1 @1 t5 y3 k- l. _
        if ((val = *addr) != 0) {
& U3 h6 Y5 F+ B- z                /* Restore the original data before leaving the function.' |; ?" d2 l( [
                 */; u- z. p3 A1 V5 B
                sync ();! X; B3 {! c+ H% L: j1 n& g; C
                *addr = save;
: Y- [3 s' E. b6 U                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' r6 N6 W/ j5 H6 x. D+ W8 {. B$ Z
                        addr  = base + cnt;
; w$ S0 Y* k  H/ b) ]                        sync ();/ F7 s% d1 n& i3 \
                        *addr = save[--i];# T6 P' ]# U, K. p/ I0 X: J& \
                }/ `. i3 o8 r  v% o& g0 M. M
                return (0);( D5 x4 z! a4 W4 b% a) g
        }
( i8 W9 C. n# O' H, p$ ]
: t! k0 @& E9 L, M9 ^, r/ R! M' b        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ }( z) B( i9 T! ^4 c; r* m                addr = base + cnt;        /* pointer arith! */% F/ x2 J  i: d! _! Y; T9 q
                val = *addr;% Y$ i9 t8 b9 Z: E) r! Q
                *addr = save[--i];; ]5 Q: K7 h! |" x, t1 r
                if (val != ~cnt) {
$ A/ k+ m' f& t, W) u; c: C9 L                        size = cnt * sizeof (long);
' X4 u% X& f- M2 M* f) q9 ?  a& Q                        /* Restore the original data before leaving the function.4 Q/ x: |8 o3 g: u
                         */. w: D& O1 i1 `
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
$ ^% \4 ^# e0 `) d                                addr  = base + cnt;
6 e  J; H: ^  Y0 Q$ r                                *addr = save[--i];! M9 t  B( W+ i* U7 m0 @. P1 N+ V
                        }$ Z: R8 }! W! n, r# q! j
                        return (size);7 k# A: f" b. m
                }
  d' f& X( L  S        }
, B( t" E7 {! V0 U/ K) `. A+ m6 J3 f% B
        return (maxsize);) Q& h& L1 [5 ~0 Y
}
: V5 q0 n* p( z7 @int dram_init(void)
* p8 E# [# o$ s, p# o; R2 \( {{$ N. R8 P* p4 Y7 v* }
        /* dram_init must store complete ramsize in gd->ram_size */4 w7 b0 Q" E5 o& s
        gd->ram_size = get_ram_size(
. W$ }8 s4 ?3 g/ j                        (void *)CONFIG_SYS_SDRAM_BASE,. U( X: z, J' V) @, x
                        CONFIG_MAX_RAM_BANK_SIZE);
6 a  G+ {, m" V& e. W        return 0;
/ V$ |/ _# k) I: P' S( p3 l  k}7 u: |  K3 M& ?6 W% u+ D" f& W

; t8 S# E0 M, q, c: L% Y: s8 d! R8 y5 k
* Y/ M9 f+ G! Z
+ w/ s- J3 A3 K- P. M) [. b4 K5 j) V
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!* W9 N1 o; D/ C; h

3 s$ ^( i# v4 M) \& w/ `( U+ R0 s: V0 ]$ z

- s. w$ [. @0 Q! x4 n
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:48 , Processed in 0.038158 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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