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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ a( S( }. Y  |  S
核心板2:DDR2 256M Byte   NAND FLASH 8G bit' x# @2 P. G% w
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 ?. j# i( d6 x, ~/ s; J$ T, R, J& e+ k
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?/ P! Q7 @% I8 h, }. ?6 l' {: T" @

. b1 e. g: a% f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& }& `9 T3 A. V# S
/*
2 o+ ]2 Y+ k0 A* Check memory range for valid RAM. A simple memory test determines8 F0 s0 U5 R' {% A. s7 C; F+ C
* the actually available RAM size between addresses `base' and( E- C3 c- d6 P3 T) o0 U& o8 ^
* `base + maxsize'.
% n8 @" T4 G1 v8 [* F" G+ o*/
5 Q0 W9 u& ^% d" W: k; Ulong get_ram_size(long *base, long maxsize)  t! `' s7 m( m* g2 }
{
+ ~4 w( w8 R6 w' P* z: j7 |) N6 a        volatile long *addr;& U/ ?: b' Z' e- M% y8 ]
        long           save[32];8 @2 C) L: f% @# g8 T6 `6 O% m
        long           cnt;$ e3 D5 z, a5 @6 T
        long           val;
+ o# ?( O0 x  k0 U& `        long           size;" a2 ?/ {6 m+ L
        int            i = 0;
) ?: L/ q3 d4 R9 J" J3 ]' I$ g5 \& t7 w0 y- s: u
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {* I$ M& X% O7 z, _7 R6 t- U( {
                addr = base + cnt;        /* pointer arith! */
7 F0 j  _# U9 [! V                sync ();
+ @4 Z4 u! }1 \3 X- T                save[i++] = *addr;
  i3 b) c; T+ ^3 B                sync ();
4 S3 g; S+ {, T, m                *addr = ~cnt;
- D' |& A1 A9 V# ]$ L* I; h        }
# U" ]$ S* w& O* n/ c) E' `% I, c& ~& C2 {
        addr = base;
, ?+ b0 d# Y, o, k, }4 g- u/ n! t        sync ();
) G6 u$ Q4 O- U3 K, ^6 G        save = *addr;
2 W, X7 t2 \1 I3 u9 q+ ^/ T        sync ();
7 a" C7 Z* C6 Z+ X7 x8 b5 G9 ~        *addr = 0;' n& ~9 I+ _- X; ?+ B1 P0 f0 [

6 Z. |9 ]/ h; I/ T        sync ();
) J7 d- ]5 n9 _/ l0 I# o8 m        if ((val = *addr) != 0) {
3 B1 X7 G: r7 ^                /* Restore the original data before leaving the function., J6 Q  X: Q0 ~
                 */
1 [( Q9 o3 M8 M& W. V2 A                sync ();
1 m1 I2 E: G, v+ b4 J                *addr = save;* O. ^9 s) s$ W0 q# u: x! |+ z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {* n& T( `% _; s( v0 u" V$ r
                        addr  = base + cnt;
: r* x' A5 W1 ?5 X$ z/ Q                        sync ();- H! t6 x4 f2 k* G2 v
                        *addr = save[--i];4 c# L; ]* U$ p, d6 Z6 t% b3 l% H
                }
8 L( P2 q8 ?: p4 N                return (0);% k( |% d5 q7 a$ q' W9 ~# i
        }
: p. y! \; {5 n, d% Y  g
/ F& Z0 I2 h9 R2 {        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {+ X0 A8 n# Z; L8 O
                addr = base + cnt;        /* pointer arith! */  o0 A* B& f) G, r( F1 f: ~
                val = *addr;
& g4 T: y1 A9 C' Y4 [                *addr = save[--i];
% C$ o: G4 m3 U* E; p                if (val != ~cnt) {" ~! v$ p* v# L* k* p* g3 s0 h
                        size = cnt * sizeof (long);. |5 H  J9 C# {8 w, Q; ?
                        /* Restore the original data before leaving the function.
0 _" c2 o; Z# ^& E0 D                         */
+ h, x7 W, Y9 _4 p; r                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {7 C( c/ A8 ~' ], k
                                addr  = base + cnt;  @* }- e2 ^7 k6 D0 X& K2 D
                                *addr = save[--i];& m' G( K( f! n* J. [5 p  d
                        }
+ D  \2 ?8 I  b# S' ^& c                        return (size);$ _$ i! J$ r! z) {' H
                }# d5 a! X& a* Z: p% s5 m$ R; g5 f9 Q
        }3 h0 u  Y; H. [. }* W& o

5 N9 ?4 A9 R& `1 i; x        return (maxsize);
' \7 r, H9 n9 a. r}- N; e5 n& h2 |2 ^+ d
int dram_init(void)' j, y7 U! P, C9 W& L
{
) X9 Q- p8 x8 K( q        /* dram_init must store complete ramsize in gd->ram_size */6 L( r9 V; q# d1 k- [' E$ `
        gd->ram_size = get_ram_size(
7 H1 }# d- ~  A' ^1 u+ I% H$ |7 u                        (void *)CONFIG_SYS_SDRAM_BASE,$ w  T* U" c, y9 J1 s* m
                        CONFIG_MAX_RAM_BANK_SIZE);
9 K+ o6 z, C) ~: s        return 0;/ v; P: \/ j) s' c( w, W
}# J+ R% w3 }5 H  p: ?$ ^6 r. o
( U* o6 x& g9 n4 b7 j% U
' j0 o) S" ?* v5 p/ i+ I
4 W( e9 w5 b8 }- P+ I8 X3 {
1 O* R. r& i3 y) q$ S
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!/ q/ {' t% b4 v- M, j: k

! i2 W3 N! m- l, Q* x' X  x  t* P5 o; R4 v( m# y1 V6 O

" e) J+ i1 b1 F2 L' {
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 04:24 , Processed in 0.038882 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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