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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* j% |: |2 W5 X
核心板2:DDR2 256M Byte   NAND FLASH 8G bit$ [  g0 T4 t) y; D8 ^' ?  _
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?  Q& F0 S4 @/ N) W) R: q

* x* Y) `+ t( p( f" J# ?/ E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* t, c+ S8 c2 @9 g
% j7 p1 o# T; r3 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
% m) k6 V9 \% {; b9 d' ~3 U; f0 U  Z/*
' O5 S# e. U+ c1 J* Z4 g4 s. M+ O" }1 q* Check memory range for valid RAM. A simple memory test determines
% n1 X( H! B# j/ t* the actually available RAM size between addresses `base' and
  P" b+ o6 H# m* `base + maxsize'.5 b/ K/ |2 d9 q9 D% I; r  |3 ^) l" H
*/
: l8 R* Z; J' }! Y% Blong get_ram_size(long *base, long maxsize)
4 `; b( c7 b7 M+ p{
; Q" K# L  A  e! N) W5 P        volatile long *addr;
9 J7 N4 v/ ?6 f$ S( E- ^% [        long           save[32];, W8 r' w9 T( x$ U8 U
        long           cnt;
1 }9 `. m6 y; A8 _9 b: F9 H        long           val;. b, z# b# E/ N6 t1 J* ?4 f" W% `/ l
        long           size;
: \3 C8 _5 V! j, v6 U4 _0 P0 c        int            i = 0;
+ \8 ]6 M/ l7 D+ N/ q8 p2 `
( ]& [% }$ L; M  s6 S0 k        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
7 a2 j! G$ x! f) ]                addr = base + cnt;        /* pointer arith! */2 n6 U5 N) u/ R  f7 a& p: W+ n7 [
                sync ();$ K+ e* R6 ]4 C9 p
                save[i++] = *addr;" M8 S3 Q2 _* i  ~- p3 ~
                sync ();, E, v, [6 H- o& F7 H
                *addr = ~cnt;
& }& V! a! ]5 C3 c/ T        }
* D5 }/ ]: \6 s8 P4 G- Y! P
' [1 i+ C7 L1 D        addr = base;
' S; @( `4 T' \: N1 J+ X        sync ();7 e# d, Z6 o8 t9 o& D3 C5 ]
        save = *addr;1 X& d/ G: p8 t! ?% _. p
        sync ();
: ^% ~8 r  Z, N6 r% U        *addr = 0;; ?6 g% v* w" D7 I
$ E6 ]6 e5 R1 @3 S  [
        sync ();
2 `( H/ R! b5 d8 @        if ((val = *addr) != 0) {
! h: Y; x  Y* [' O  r                /* Restore the original data before leaving the function.
4 s; h: ^7 s; y. x                 */  G$ J+ P$ o1 y! F! q2 U
                sync ();
2 u7 r* K8 N: l4 J5 B; J+ n                *addr = save;
: I9 r% t8 b6 \' n$ K5 H* g3 {                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" q. t/ l7 R( K
                        addr  = base + cnt;
) u2 m- `6 F/ x! Q3 N, S                        sync ();
& N  R& {. h. L* s                        *addr = save[--i];
# U7 u" {8 `0 M) ^6 T; V8 A4 t                }: u1 r% L  K  c2 p: Y2 V: _
                return (0);. D' P( ^% R8 p3 n9 Q6 E
        }
1 i- _  F3 k" b6 U: s) c
% i" S2 |+ H  {( p% S# |- _# {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
  M; p5 c: B) ?% M* t" S                addr = base + cnt;        /* pointer arith! */
2 z( v, X  X$ U+ |  U% X5 p% F                val = *addr;
! O- X- ]0 H8 j4 L& O* l) Z3 F                *addr = save[--i];/ h$ ?9 J9 c  D0 T
                if (val != ~cnt) {
: C. M" Y8 x1 N$ g                        size = cnt * sizeof (long);; V5 `0 I+ f, r& M: t  X$ ~
                        /* Restore the original data before leaving the function.
4 v+ I8 ~" p! ?/ M+ X, Z                         *// v6 G) G5 ?7 u% ^( }
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {3 n' a+ ^% ^1 G4 Y
                                addr  = base + cnt;
4 @3 D# o7 p: i3 R                                *addr = save[--i];
$ w2 c+ t9 _! r6 D5 H% ?! t                        }
; D7 j9 u! u  c- h9 F6 L                        return (size);
4 q8 Q9 b; M! K9 j& b0 T                }
; }3 f0 X1 Q9 \' J6 Y        }
3 T' {5 p' B' K' p. R- r! u* Y# c# `+ d* N& V& P$ W
        return (maxsize);
6 P/ E: j: @' M% [6 g1 f5 Q2 y0 Q}
# I' z3 s0 {/ Aint dram_init(void)
. i1 `0 v. s! C' J{
7 p7 z( y/ c) Z) e# b& T' \        /* dram_init must store complete ramsize in gd->ram_size */, g5 ?  B  S+ `# e; c  U* ^
        gd->ram_size = get_ram_size(2 H% b2 v5 O! P. R( W& B
                        (void *)CONFIG_SYS_SDRAM_BASE,0 q; }& @- R" A/ [
                        CONFIG_MAX_RAM_BANK_SIZE);
7 P7 n3 l" O1 [/ Q+ |% r( i        return 0;/ V4 z2 A9 V. e  O* K/ o8 l
}
) ^3 O$ v/ F0 y  H2 {
- {* t% h9 ]4 |9 o
4 G/ A) }+ g1 U9 \; ^9 G
7 e; R# O% K# p! X  Q. W' v: [0 [  s  a- b
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' D9 Z! b1 |/ s: u0 m, h" z$ g

2 D4 r" Y: M8 S( r1 \
4 Q# [# L. f; q2 y" T1 Z

+ U0 B# z2 U6 e: t9 a$ t, |
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 16:59 , Processed in 0.039046 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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