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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
  h) l# X$ E* {1 l. ]* [/ x) _; Z核心板2:DDR2 256M Byte   NAND FLASH 8G bit0 ?4 g0 B! s( @4 T
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
; d. Q+ h0 n  L' Z) C$ H* I
. K3 P2 O' `& `& f+ F是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?6 f  P6 p; y, u+ B
/ F8 \4 h' p! q: q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:# S* `. ^# I& a% v1 ]
/*
7 s: o3 a+ i  H9 j9 o9 K- o* Check memory range for valid RAM. A simple memory test determines9 @0 n) d( n4 f" E
* the actually available RAM size between addresses `base' and' h: w, a6 r3 g" E) M5 V
* `base + maxsize'.6 p# T, p, v6 Q5 U6 `
*/
0 _  O, ?; v" Z$ O3 R1 d/ flong get_ram_size(long *base, long maxsize), C9 r" R7 G; y/ n$ N
{/ ?. S  w0 y- ?* k
        volatile long *addr;
+ ~: i* b+ f0 X! D) P+ ]. I$ C        long           save[32];' y" q8 p- U$ R( i9 q( T* a
        long           cnt;
! f# D5 j) c. F$ i+ G' {        long           val;5 N4 x5 j  c, S, o% r* s: O% c2 W
        long           size;" C% z7 A: g4 Q
        int            i = 0;8 Z8 _  f4 Q, }% p$ g

2 }: p8 v* Z8 n2 K9 Z. V. C1 p$ z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
3 R5 ], E/ M. P# }+ A8 Y0 d                addr = base + cnt;        /* pointer arith! */6 @" `' m7 l/ ^( I, a9 u/ z
                sync ();
. }# s- D7 Y7 y! u                save[i++] = *addr;
" |& Q% V+ x5 ^* O                sync ();
# H* ^* ~8 A* P; j, X3 g" s. ]4 u                *addr = ~cnt;- e" {5 x' f$ ?5 g) t( c
        }
; i' ~; Y: }8 A( S% p9 w2 s- T. p6 L) s
        addr = base;7 K9 G* \+ V! g
        sync ();
  C  [6 d0 G3 H% ~! _' Q        save = *addr;% P; q- S- h2 }$ i3 B8 G2 d' Q
        sync ();
0 C& C3 Z, R" X        *addr = 0;# k$ i$ j( Q# X: J3 h

+ k6 M" P5 @9 E# A        sync ();
+ B* b6 f% z- r! c& j        if ((val = *addr) != 0) {
3 m* B+ w# i4 W: R' f: M7 ]  x( |* m                /* Restore the original data before leaving the function.
' {' G$ h$ N# G1 u                 */, q9 c% I/ K. B( r" F/ C
                sync ();
/ \( V# V7 H8 w                *addr = save;% X' `/ M+ {9 b+ L6 t
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {- t# K- t, t! I' N$ A3 i6 \
                        addr  = base + cnt;1 S4 @% v% I3 Z5 M3 D
                        sync ();( V/ h' w0 ~8 W0 }
                        *addr = save[--i];
1 y0 W4 }  Q: d$ Q5 A                }
4 H& }$ C8 M* z* h2 m+ L9 I8 V                return (0);! N  T0 C4 @: e2 d* p
        }
& W- |: M8 t7 F# ^0 X
2 R0 U: Q. j- r        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ C- V) D7 Q# U5 k9 B& Z
                addr = base + cnt;        /* pointer arith! */7 }7 c; f4 m4 [3 @$ ~0 h2 |
                val = *addr;( V# A) i1 f# D( ^
                *addr = save[--i];
* B. f1 l7 F2 N/ m3 Y* R                if (val != ~cnt) {9 `+ L& W0 T2 P/ U8 S) O
                        size = cnt * sizeof (long);5 U( T+ i7 I, h
                        /* Restore the original data before leaving the function.7 s' D' y5 r$ M6 r* K( N; N) y
                         */
. z6 U! t1 _; a2 s( w4 u                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
# c8 R* v0 K" s. T2 m                                addr  = base + cnt;, O8 t% P8 P0 b
                                *addr = save[--i];
3 I' X2 ]9 @' H6 z- O2 T) j$ q                        }
1 o; i) F0 m' r. C7 v                        return (size);4 _$ |: g0 s5 V: E! Z
                }9 b0 K) u* W6 W
        }
- W* b" |  T' a5 q0 }
% i- w8 i3 x! n2 o        return (maxsize);
# W; a7 j2 \* c0 e8 V6 q' w}
6 m' n. ~+ ~4 X! W. @. o8 vint dram_init(void)# M* {/ H- F# A% S5 ^/ ]
{0 @" _$ W% w4 r1 j! \& t, s
        /* dram_init must store complete ramsize in gd->ram_size */
9 l  {- D3 M4 F+ K" m        gd->ram_size = get_ram_size(
) x0 N& ?+ T& l+ _1 S                        (void *)CONFIG_SYS_SDRAM_BASE,, X! X0 z, V& m" u/ r; j/ ]
                        CONFIG_MAX_RAM_BANK_SIZE);  H& z! f9 L9 b9 N0 ^4 O* Z1 H
        return 0;1 g( V  |, e; K
}
% S, m7 k! c# x! I+ I4 ~7 I6 W/ W; @
8 |) P# P( r7 X2 Z
1 k2 \' N6 Q4 z+ d$ L( |/ W0 O, T4 F' c6 F/ g! C
8 [% N: [, u( T9 T+ k
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
& F1 j; d5 Q# M8 V, B0 D$ a5 d6 p, g. [! ^) P. r, A  p

  ^* a1 d4 |# s
5 M  O0 N, Z! W  P& ^  [- w
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 02:56 , Processed in 0.041039 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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