TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
0 ]( s1 ~' s- Q$ H核心板2:DDR2 256M Byte   NAND FLASH 8G bit% \( a4 |6 F9 b% [- R5 p% [+ t3 J
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- ]/ I0 Z: |) d% N+ L" |% q
9 d4 j1 z8 n' t6 @是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?3 t% X9 W6 E( b

* v8 z# x, T7 T) ]- |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
2 J! U3 e/ ^& i& c/*2 I# U" k3 N. {8 a4 F6 l
* Check memory range for valid RAM. A simple memory test determines( `5 A4 J3 `; ^% l& k' |
* the actually available RAM size between addresses `base' and
5 z1 c0 H0 a9 i9 ]7 I* `base + maxsize'.  b$ s' C- G5 c9 F) z( k$ B* B% i
*/! }+ ]" H: j, y7 H8 D% b- T
long get_ram_size(long *base, long maxsize)
* i5 H" k0 O4 q3 {4 T9 H% }( F{' p1 x0 S% _) i
        volatile long *addr;
2 P( U3 W5 J- u; ^0 `- }        long           save[32];
- o5 c$ y" H7 p0 I$ n6 o7 E, B* c# e, ~# g        long           cnt;
$ S& L3 p1 U' \        long           val;
* F8 L" E  A' ~        long           size;7 I) ~% X, t7 O2 ~; L/ X3 @/ b
        int            i = 0;
( x2 J0 i1 @0 v+ T" m8 P; }; f
# b" h5 D# j$ F/ t$ a1 K5 T% b" g        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {1 `- U) N4 y6 m7 e6 y  t
                addr = base + cnt;        /* pointer arith! */+ C, c7 X6 U/ e
                sync ();
3 }2 G4 |2 |7 U- j                save[i++] = *addr;
5 _) w; B3 j9 Z3 z                sync ();, f2 J# E1 @& e$ s6 I6 J
                *addr = ~cnt;; w7 _, T, y" M7 J- K* A. P" b( }2 ]
        }) w, M6 k6 W9 j; M; T+ z
5 V1 x5 B# f. L
        addr = base;- C0 l. x2 v! j' ?/ y) Z' z
        sync ();
' Q! R2 E0 Q- {# S        save = *addr;+ L9 E% |: v, q! S" H# T
        sync ();
- a! c9 G) R) s# c! x$ K        *addr = 0;1 v: Z4 X1 i5 Q9 B/ l7 _: v% ]) i9 y3 K$ |2 d
9 o6 I, O2 A5 H; A9 J
        sync ();
$ |! z  W+ I9 B        if ((val = *addr) != 0) {
. y$ _: [7 d' }% T% `. t) l                /* Restore the original data before leaving the function.9 e# Y+ `4 W$ |5 W4 h) C( R4 d$ Y
                 */
, ]6 f5 C2 X. C9 [4 [& y. |* f                sync ();- K& D# A  M. k
                *addr = save;
) Q: @3 E3 w. R, W                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 d8 l+ u9 }! h3 X9 j: m
                        addr  = base + cnt;/ k# [/ m& }& Y9 w# j1 t! J" }7 Y3 b
                        sync ();
1 N' t7 V# U4 u- O& V) X                        *addr = save[--i];
9 {# l" V; J# f                }5 f$ u0 L0 a8 B# h
                return (0);
; A9 E5 y# c$ c$ k( m! b! Q9 k        }* u/ c' Y0 D9 e5 f
0 g6 M; M& ^- u: H8 O! T
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; U2 m6 j  z. v' u. ~8 f2 t
                addr = base + cnt;        /* pointer arith! */
% T! y! X; B! t6 ?3 B, N                val = *addr;
$ @: s; e! r" Z" U                *addr = save[--i];
9 P  y, v* \( ?                if (val != ~cnt) {. h- }, I0 s1 P" C& T  M) V
                        size = cnt * sizeof (long);
6 j/ F" k- v# W                        /* Restore the original data before leaving the function.
1 B) R2 a; D/ [' l" \                         */: I. \% i9 f3 q3 I( Z$ ], l
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 G$ C2 J5 v- Z7 k$ w0 ?4 @& D                                addr  = base + cnt;
  I4 R3 k0 H# }7 E* z                                *addr = save[--i];
$ j" N6 R1 n' g- k) u# c                        }# a6 P5 j; F2 ?6 Q" }
                        return (size);0 \$ X5 a2 I2 |. C7 e' @, F) h
                }
( q2 ?! P( W( w' l( E        }
: ]) N. X. f7 r) X: f' i( O3 J' y# f( h+ Z% H1 U5 v# S
        return (maxsize);5 K7 U0 J4 S* L* n0 |& O' K5 `
}3 ]& K1 f# J: `/ ?4 i5 `
int dram_init(void)- G$ k( m0 C7 ~% \# \! n& t, w0 U
{
. p3 W3 w1 `: E        /* dram_init must store complete ramsize in gd->ram_size */  Q2 d' t* m: e1 v" W& v
        gd->ram_size = get_ram_size(6 Y+ k% @2 z$ @; ^4 E1 p
                        (void *)CONFIG_SYS_SDRAM_BASE,
8 ^% s  ?5 @0 ?' Z6 l) O" s" f                        CONFIG_MAX_RAM_BANK_SIZE);
8 S1 |3 p! [0 P4 y$ _5 _/ }+ Y        return 0;/ G1 p/ x7 D. ?  s1 r( b
}
+ l; Z; U1 q' H9 E# L
! r6 C5 _5 K9 t0 Z7 S  [7 I8 N1 ^! N( t

) _; o7 N! T9 z' @9 g" Z3 l! Y3 H# J# Z# C# t! c
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
9 z# g: S( u7 S* g) C; I* k
! @' f2 n+ x% m0 b8 a% P7 E: N9 y0 y& p0 O5 W

7 |# a% S4 S4 ]+ [+ N
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-6 14:58 , Processed in 0.037777 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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