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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit7 q# a4 K# Q1 E8 Z" Z' o
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
* A$ W3 f' ?9 @( w% e+ |8 G* H, P这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" Z" v0 y& F8 f' U1 p0 C8 X  K

8 W3 t2 t+ Q( c$ [" P是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' x. L+ d7 `0 T& H3 b  o$ x3 n
; t& W, d9 g+ G' T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# ~" Q& m- V0 O1 R5 i
/*% i- [5 G) Y7 o: X) h
* Check memory range for valid RAM. A simple memory test determines
% @- q2 R# M  @4 \; e$ k7 M* the actually available RAM size between addresses `base' and
  i& F, a( A3 s  T* `base + maxsize'.
' v, J; v9 Z; h& ]# ~*/
+ d& R- Q# O% q1 @) f" ]long get_ram_size(long *base, long maxsize)
. j+ ~8 H$ o# I5 ^3 j$ G6 V{, Q. w4 ]8 I3 m8 @: B) G
        volatile long *addr;$ p3 ?& r7 \. K9 a: I6 n, N2 x2 s
        long           save[32];4 X3 F- |, F* x! H( P
        long           cnt;
& o3 i# L4 U2 I9 w8 r8 k7 ~' b        long           val;( P, U, `: r/ T& M' a+ {* s/ C
        long           size;
- v' t: l2 z( g; V0 v        int            i = 0;6 [% N" ~* X6 x# K- n  X, ~$ Z
0 t; Z( B2 e0 @6 f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
2 u) W1 A8 n& B                addr = base + cnt;        /* pointer arith! *// W6 |) g2 L0 g; ]2 R0 w3 K7 I
                sync ();( @' w1 R% Z5 v7 t6 w
                save[i++] = *addr;
' ^! x: x$ [3 w' ]                sync ();. F% U  ^5 r6 q, S
                *addr = ~cnt;+ D5 j! m' R7 m$ D" }0 d* E
        }1 ~6 K4 |! ?( T& K( _

  P' u1 u6 v6 D! \+ z' G3 K        addr = base;
! |6 U2 n# v7 f4 \$ I        sync ();
3 N1 C/ n7 T4 D8 Y4 q        save = *addr;
' R3 t$ C9 U- h6 K" N% R        sync ();8 t0 T9 n# n9 K- C3 g1 m# o
        *addr = 0;0 X. p& g$ h7 p

& \' i5 b: g: A0 T5 ]        sync ();  r3 x7 v$ Y* Q0 l& ~
        if ((val = *addr) != 0) {1 o' a* P  ^) t
                /* Restore the original data before leaving the function.
! t2 u, J3 X- b6 c                 */1 B# s. K5 y+ P4 ]0 p' ^* X
                sync ();6 K. k% I) Z) w$ r
                *addr = save;
" Z9 y$ M/ k0 W* v                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
0 h& M. L* @9 h- k  \% N                        addr  = base + cnt;
- v' V$ c* H  g6 ^                        sync ();
; _0 M: q' f  d& ]' `! Z" D                        *addr = save[--i];
6 O2 ~$ u- x  P; I; H9 o3 i0 Y                }1 ?/ S) T- f- u
                return (0);) J) b) g: }7 R
        }5 T6 W, s) g1 r, e& j4 k/ ]! B
6 b" M8 i, }2 B0 j2 P" ]
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {: G+ R, U; c) ?/ G
                addr = base + cnt;        /* pointer arith! */4 V. V% r# b! t- Q' f" W
                val = *addr;
* Y* B' s* x+ u; h# ~                *addr = save[--i];9 g& r8 p+ p/ \5 Q, q! A7 A( `
                if (val != ~cnt) {+ g! Y# Q6 I  t. Y" f; h+ q
                        size = cnt * sizeof (long);
6 Q4 M% z" u6 t                        /* Restore the original data before leaving the function.! \8 U# \0 I: D. W
                         */- @( k% B0 ]( w
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {* ~1 B, A$ C- H2 n* J
                                addr  = base + cnt;
5 x& F" e5 m/ p. ]1 ~* w                                *addr = save[--i];, R7 N: o8 ^* J8 {7 T/ {
                        }
4 U1 A3 P3 f: m0 V/ u  E$ a                        return (size);' H4 G2 ~$ Q6 C% P0 O' H
                }
% e8 ~! [. s0 X+ X        }/ B; b* H1 r6 s% B
. A% j1 U7 @( Z7 K) \) U; B
        return (maxsize);6 ^% B5 S! F! [
}( b' e. R* t' v; z9 J! B- V. k
int dram_init(void)8 Q4 C3 w& Y) y* W: y
{
' z0 q4 `7 X1 A8 \7 b6 R5 k. _/ m        /* dram_init must store complete ramsize in gd->ram_size */
0 x9 r3 X/ W: G4 T3 I: T1 U        gd->ram_size = get_ram_size(2 \2 O8 ?7 ^$ D0 s) I- O2 ^4 U
                        (void *)CONFIG_SYS_SDRAM_BASE,2 L9 ^9 Q/ s* E
                        CONFIG_MAX_RAM_BANK_SIZE);
* k) ]* q6 h# X; l1 r1 ]" p        return 0;1 P7 ^% W9 q& ^: l% l/ ?8 p
}
4 \* Q; s, b) Y1 B/ q+ F- w# v# D" g; `: o2 B; L" T
4 z* @' J/ t# X1 b
0 J0 J% `, y; V

, m: r: z' L# rFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!  U9 [6 L% j! L' @0 o% Y

; |, g0 v# k2 p/ m: W/ t, r7 i
5 l+ Z( B7 n) C- J
5 y# T: v4 l* M+ A& W0 j1 w
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-19 08:10 , Processed in 0.038685 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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