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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
3 J6 b* T/ H! f: Z# y4 W" B核心板2:DDR2 256M Byte   NAND FLASH 8G bit% Y  k: z9 c( U5 R, u
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" V: O! ~3 u8 w8 O0 o# T
0 M4 J1 E5 p, S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 b! I+ C! o* Q: k3 L, l
# V+ O; g% V3 M8 n2 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
$ P, W0 e0 r0 C; ?/*
- E5 q; j: p6 h8 [( R' H5 s* Check memory range for valid RAM. A simple memory test determines
% v7 G" J4 j  _$ A) q+ ]* the actually available RAM size between addresses `base' and
% e2 s) j- N; ~& n" ~* `base + maxsize'.
2 K9 S8 z" `, y  F; ]- N* G*/
( X& c% z% T- klong get_ram_size(long *base, long maxsize)
- |5 R3 L) j. `# `2 |+ E. I{$ E& w. F( }8 Y( C2 S0 e% [
        volatile long *addr;4 g" J6 v' q4 U4 \0 u8 a. X6 l7 W& B- q
        long           save[32];
& Z, p* o4 b# d# s  r4 H5 B# z        long           cnt;# h2 E' i, h4 z6 \
        long           val;
6 ^# N2 g4 s: Q  N! Y        long           size;
# @4 I$ d! u$ o" O: M) I! Q        int            i = 0;4 A& v- _6 V' m+ _  B

( O" C! Q* U5 Q; R& v2 u- {        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ d0 q3 [" k+ S( m- ^6 z7 U$ d
                addr = base + cnt;        /* pointer arith! */4 U, p: {: P  H6 C: C. H& A) H9 `
                sync ();  M, u- n% a( b. i4 L2 U! Y& h
                save[i++] = *addr;1 H% S; l; w' S9 ?6 |
                sync ();; X4 C4 g; @- |/ D
                *addr = ~cnt;  b0 Q& S" E6 _1 E
        }$ O# r; e7 r1 r; s; x
+ L4 g, L6 x, i( w* ~, Z
        addr = base;
6 X$ v3 Y# n' C: c. \+ O        sync ();/ C1 v! {8 l3 Z
        save = *addr;" o, k3 `7 q7 i9 b& ~5 d& L: y
        sync ();4 d% W& S& p7 I, [0 M& f
        *addr = 0;: K, C+ g2 u8 z+ P, c

8 [; Q& V  ~9 ]1 C        sync ();
' x: b; j; z5 d* P' ?& u3 a; L        if ((val = *addr) != 0) {$ s8 G+ a1 }; S' ~- X
                /* Restore the original data before leaving the function.% A' f# U/ e- @$ C# d
                 */
' W3 H% ]" x. j2 W) |                sync ();2 F8 D! P: p" A6 ~* H* y9 W$ c
                *addr = save;( y$ x8 `8 F) N1 b/ a( m- {; |
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' j7 o8 p: ^- ^
                        addr  = base + cnt;
( j( K/ `( j7 O: s$ ~6 H$ [" r# T                        sync ();+ b6 B+ f! m" y9 Q: t' Y2 t3 h1 a& c) l
                        *addr = save[--i];7 x7 P, |2 ?  B: h  `
                }
( X  b6 @$ b* A0 v                return (0);
) F2 E; S/ h! f( n3 J) s        }
" k& r2 ~- A" u1 G
* s5 y1 J7 B. _8 U( j, [        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 n  B/ Y. P& t9 G
                addr = base + cnt;        /* pointer arith! */" u' ^/ j& {% ^# n9 q
                val = *addr;
# K0 e6 b8 x0 P' l  a' T3 A                *addr = save[--i];
' [4 d) p1 J  B4 q                if (val != ~cnt) {! e1 y: K; |' C+ b! E- W/ V
                        size = cnt * sizeof (long);3 c' x3 f/ m! b9 _
                        /* Restore the original data before leaving the function.% c' X/ R  z  Z3 X5 k4 \9 T* n
                         */
4 d( U$ U- o; U2 S" e                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& X- w0 U" y& t% h. S6 X' |* k
                                addr  = base + cnt;1 f( F) \5 I' C, C
                                *addr = save[--i];
. s+ M! T# {; I/ Q1 D  M5 }                        }" k: H) d0 X% @( S& }: d1 a. q
                        return (size);6 O& S/ W9 {8 _' `) X8 _
                }5 R7 V0 \3 |9 ^9 L- L
        }# @* D9 A1 n. F
  ]6 x" O7 G3 R2 F
        return (maxsize);3 c  r6 f0 [7 y
}
4 B# o( R3 \9 q: Nint dram_init(void)
7 E) B% j+ \# k  T{
6 e  Q4 u" B4 d' _5 _        /* dram_init must store complete ramsize in gd->ram_size */2 l8 y1 Y+ S0 F3 k! K( [
        gd->ram_size = get_ram_size(
& S5 N$ g0 r5 z6 S, \2 m                        (void *)CONFIG_SYS_SDRAM_BASE,
( ~$ y/ \8 o1 q/ C# V3 {& h: b                        CONFIG_MAX_RAM_BANK_SIZE);
+ Z( w# T9 v9 N- S3 ~# ]        return 0;
$ P+ N* P6 g% H5 U( N- r}
' @0 O# Z" T: X$ J) N5 ~. g  t8 W% n# n8 z  j  e. s- h+ {8 F
% {/ ~6 w% X+ @1 A6 T  l

. p3 }- ^/ Q8 j7 ~4 h, @
; d* R. X) ]6 P& v5 D2 I! g* AFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!) X9 G+ v5 E3 Z5 ~4 |; T3 y; \( s

# a5 m5 y8 @. V) I% ~. z( E) h! X- r- u4 |' Q4 w. s
0 C9 m; p/ r# Y( E5 \3 p& N; |$ ^
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-7 02:14 , Processed in 0.039554 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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