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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
, k, z; ]. }6 @7 X! c核心板2:DDR2 256M Byte   NAND FLASH 8G bit# t" \5 Y! Z& ~* o2 }
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 H6 ~' v% }1 [5 w5 {/ }1 d7 n- ?3 d* V% G0 Y1 J' V- |
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
$ w2 j+ `  q% ?
5 E) V) r* y% p/ y. q& V8 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. }3 r) B0 z5 X8 u: X% F9 e
/*
4 C8 g, A( T  U# B+ C$ _* Check memory range for valid RAM. A simple memory test determines( x" @( u& ]2 |9 P+ B
* the actually available RAM size between addresses `base' and: i6 {0 E  ^9 l5 {8 s! |- m4 V
* `base + maxsize'.
6 x; F* T. y. @& R+ v! T8 U*/2 v$ u# D. f/ e+ ?# n( O. l
long get_ram_size(long *base, long maxsize)
# |4 {/ N2 p% E/ c; A6 l{; b; Y- S) E0 f! V( ^
        volatile long *addr;! k$ s; X5 n8 Q$ E% Q/ ?% Q1 t7 l+ t1 n* r
        long           save[32];
1 w/ e7 q% k3 K9 R" c3 {        long           cnt;" w* r# o, ]( q
        long           val;! d! o# @" H1 I% p% \% H
        long           size;
* Z0 Q5 i9 @' E- F% ~2 N        int            i = 0;
: r# F/ {# k6 U3 w* X2 r: U" N9 D8 B; q& T! d8 z" E( ?
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
. N0 e+ E$ U, X7 @! O3 t7 }) I                addr = base + cnt;        /* pointer arith! */
  t* h8 e; h, {( R5 s. u% _. i                sync ();
" {4 a/ U1 a9 j$ h% ]5 u  i                save[i++] = *addr;
/ `; A0 p0 }; k$ j& u                sync ();5 N9 t. Q7 N7 R6 _
                *addr = ~cnt;
/ L' x$ y0 {3 T* R        }
  i1 X) v2 t0 U! o" ^" B! k  I
7 K# n9 c8 ]0 E1 b+ h/ g        addr = base;# V. }9 I( i. H: j6 B5 ?
        sync ();7 j! n! j, z7 m% D1 q$ }# i9 Y
        save = *addr;+ x7 W( B1 e* U
        sync ();
: @2 @4 U" ?2 N5 i2 f/ W        *addr = 0;, q+ p0 a% m" \2 ~  Y/ u* t8 Q, G

! N" p  h5 ^; R) i& O        sync ();2 ^7 r. G' V5 e) T4 o2 R
        if ((val = *addr) != 0) {
- B9 c" ]9 f6 c. E                /* Restore the original data before leaving the function." D* ]" O, f" a( E8 v4 o- ^
                 */' a2 |# u$ {' D% J" H
                sync ();$ `7 q! Q$ s( t
                *addr = save;
% g( B( r) u: f0 ~+ |                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {( g+ |  U4 O; I: |
                        addr  = base + cnt;7 d* Z; j* {3 c  }0 j, S  H
                        sync ();
. E1 ?' Q. \2 _# j! @+ l0 p                        *addr = save[--i];3 g$ y0 U# K8 L0 Q  m4 }
                }
+ P, k7 ]  f9 N7 N' b' G# n6 `) B" k                return (0);3 V" o- ]! d$ I$ B" C6 K+ m/ x
        }
2 @0 j, _2 w- F7 Y1 D, F( G3 c" X) e  ?- ?5 B4 s) W. ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 d' R( s8 A) j% o8 e8 g3 N' |- o                addr = base + cnt;        /* pointer arith! */6 X" a# @, \, F- }. z2 b7 Z9 \
                val = *addr;
1 s( ^6 Z! @$ J! u& |                *addr = save[--i];
9 _" P$ ]" {( \1 J" K& p) V                if (val != ~cnt) {
0 l7 c# L6 d% Z1 `                        size = cnt * sizeof (long);' O! O  d* \% E' n( g% G
                        /* Restore the original data before leaving the function.
  w$ I! i* I' Q% D$ ~                         */
* @8 e/ V, V  s                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {& |# }% ~8 Y5 S' P/ o7 z
                                addr  = base + cnt;& j* S2 X$ j" i1 m& x1 l
                                *addr = save[--i];
, r& j6 m0 {7 [9 H3 I7 E2 Q                        }3 u: t# q) I, x: M5 {( l
                        return (size);- s2 @6 C- D4 ~3 J
                }
+ w% r' L2 q4 Q        }9 j9 P% V% {7 T
  g6 x* r  B7 ]8 O5 `8 Z
        return (maxsize);
2 F4 ^' U0 Y) h* M}7 X- L/ W: \  g3 ^% K5 H' Q- D$ |
int dram_init(void)' S8 a% u7 a' p0 r) }# p
{
! D6 W- @5 S7 l2 `4 Q        /* dram_init must store complete ramsize in gd->ram_size */! Z, |  h0 Y# h3 x' @( B, C; x5 m
        gd->ram_size = get_ram_size(
' B. ^, h, K9 H                        (void *)CONFIG_SYS_SDRAM_BASE,( N8 V. M# C+ f+ |
                        CONFIG_MAX_RAM_BANK_SIZE);3 |- L: G& e8 U+ d) V
        return 0;
# v( h% m! W8 K/ r+ k3 t& h+ h}4 t( y1 z" v9 T. o! h
/ s% }& Y& E: [  g2 O+ d: I8 V8 z. {
% g- f4 e. z! X* n

; n+ s$ q: E/ M, }5 z$ c5 D2 B" c# Q# R1 }: o# g8 X
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!6 z. r$ K, [1 s" `3 ^$ P' h, ?
. Y6 i8 s+ c- B+ V+ D  _

' \* P& ~9 Y" Q- e( R' l
+ ^" p+ Y' u9 n8 R3 c  c2 `$ i7 A
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 03:24 , Processed in 0.037971 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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