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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 p7 \& ]$ A4 s, J
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
2 m- S* E' T" l8 O这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& R3 n. @) A, {$ Q. G: W
7 @3 Z  U7 V$ a
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
) D9 z1 \6 [. {: e: z& N1 `. ^' q
4 D, g* Y7 z+ w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:) ^0 e. D6 g5 f: {0 ~' g" N
/*
2 C& a6 }: ~. H- F$ |! F* Check memory range for valid RAM. A simple memory test determines- ^5 g  C6 t7 Y( d4 W
* the actually available RAM size between addresses `base' and5 s$ e3 I0 |, [" f, T
* `base + maxsize'.- y% _7 I* }3 a
*/$ n0 S1 s6 ]! y
long get_ram_size(long *base, long maxsize)* @1 v& h( R4 ]$ x6 [) b/ u
{1 L& f8 S7 r" h1 p
        volatile long *addr;# B1 g' d  q' T- E' D7 [1 t
        long           save[32];: a. Q  M. m, G5 E
        long           cnt;/ y1 l! G. ^" U3 I0 a; T9 m
        long           val;$ |7 M: k4 T  l- p+ @
        long           size;
2 ]* Z# C: [# M# M        int            i = 0;
9 Q; X3 W; q& u1 y; k# ~" P1 N+ b, B
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
- V/ `9 [, \( C7 X) G2 ~8 L                addr = base + cnt;        /* pointer arith! */' D( }" J& z* f- w5 O5 Y- l
                sync ();1 g& j, B7 U' J, p
                save[i++] = *addr;' H; d9 l0 p# r! h! G2 @8 z
                sync ();
, B0 U7 O2 A" `6 C5 p                *addr = ~cnt;
! ]( @# O; ~7 E. p. t0 L        }8 y  _$ S' j0 T% h& r" n+ b
8 n* w3 w2 ?: v% ?' g+ q9 z/ m
        addr = base;$ J) |0 \. i: F7 I; i. k" b& q
        sync ();
  b+ D/ o4 ]; a& {, @        save = *addr;3 g: U7 c8 u" k0 t2 m8 w2 w# c
        sync ();
' k; F5 S# _6 C7 T+ |/ _8 t        *addr = 0;
; i4 {( B' [# o- b: N& A, ]$ X7 S4 m& m
        sync ();
7 j6 ?' m# k$ t, k3 v        if ((val = *addr) != 0) {
( N$ ^( D+ p+ _                /* Restore the original data before leaving the function.
* f6 }5 x# M5 D9 p( N2 Q+ o                 */. s# G- Z7 H1 r% J' g( w
                sync ();1 o" Z8 y+ y$ I  R; i
                *addr = save;
/ n7 @6 j4 Q/ r& o* w                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {# ^+ m( Z  u" G+ L- N
                        addr  = base + cnt;7 l: H. z; r& O3 ~
                        sync ();
& _- J6 l1 h" ]3 Q' X6 m% J+ p                        *addr = save[--i];
5 q$ b; u& F3 I* N9 n0 m                }+ I; p$ N. e4 [8 U) `
                return (0);) w% m) a- h' k! E( m
        }
. A2 r6 r, x& n9 t' A
2 W1 Q7 I# Q' _        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
; A4 l5 W1 a7 R! W7 j! j& d! ~! z                addr = base + cnt;        /* pointer arith! */
1 Q3 w) Q; u4 J" t" `                val = *addr;( g9 }) I* I. i, F1 x% q
                *addr = save[--i];
# R# Y& c; S, A                if (val != ~cnt) {; \+ f; s0 }# O$ m1 W
                        size = cnt * sizeof (long);- B! y, w, R0 `: ^( S' w7 a
                        /* Restore the original data before leaving the function./ J( i7 \+ I) Y
                         */
. o5 x9 V7 z# f! i, M$ ~* t                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- P, b! w3 l$ Q& g( G0 ]6 V                                addr  = base + cnt;
' Z5 X: J$ p  A/ `) A. B                                *addr = save[--i];) C- S3 u3 y* s7 j, ~4 B
                        }" G; T' D, w/ `# G9 w+ J0 J
                        return (size);
" h0 o' t$ g: ^% b                }3 m/ J8 W$ z/ ]; {  d! \) K1 J- \
        }' F8 \1 U; J. b" k; t
; F: ^! @8 E% U
        return (maxsize);2 \+ J( y3 h. U7 O) N( w! _/ J
}
% m9 D, S: a5 b0 ~8 Tint dram_init(void)1 F0 H( \6 h& f( R
{1 I3 f! k" Y0 ^% E* s# M
        /* dram_init must store complete ramsize in gd->ram_size */! J; g7 u1 ]1 h* T
        gd->ram_size = get_ram_size(
8 X" f5 F& b8 T3 C4 c                        (void *)CONFIG_SYS_SDRAM_BASE,) q" @% Z% _5 f" E: f
                        CONFIG_MAX_RAM_BANK_SIZE);
4 w* M. r; G  ~3 |0 ^' C        return 0;
5 X0 }+ A+ t7 V  J}
6 N9 X( {/ \* l" G# t6 z
$ S6 e) x5 R) [
. x9 _+ C5 {5 K$ y7 T7 j
4 S! L# K% `' n3 c2 _' x# y6 v
! M, ^' c  @) o# ]' PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!% t3 k6 Q) D: `& h' ?

5 }6 d; r9 |" Q4 ^/ G; `4 y2 K$ r& ]7 U5 Z  X7 Q% W+ s

6 k- t+ G. g/ W! \! p
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 10:10 , Processed in 0.063530 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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