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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit: R" S: R5 C1 x# t* V2 E6 J& H" n
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
0 [# e; z0 c7 U4 {6 M( o* ]5 C. g这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?" B7 _/ [# E* o! j4 e6 \5 D
+ Z+ @' y( V: y
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
5 M. R; {+ U) e$ V9 \% z
4 O/ q# Q7 G3 ~5 E4 ]3 I! X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
, W  G) m: K+ B' z/*
( R8 j8 S4 R5 `9 D* Check memory range for valid RAM. A simple memory test determines
7 v: g* F, C5 U4 f  g* the actually available RAM size between addresses `base' and6 L: F6 e9 C2 c1 s
* `base + maxsize'.
$ P. `8 ]" F9 j6 Y4 M; T2 H& I*/. j, {/ h7 ~* Z: |: ^
long get_ram_size(long *base, long maxsize)
( e- v  D( Y4 }( i) {( E' T{
$ Z0 U- F/ t! A  K        volatile long *addr;
9 t* {" M  k1 j        long           save[32];
1 I& ^4 J+ d( |( N' l* W        long           cnt;
6 Z5 d7 |, P# A: }- r        long           val;- I! R; U- T  y4 b+ L9 T- I
        long           size;5 Z3 U# B, }. b
        int            i = 0;6 y3 O" c( n# y- R/ J: \7 H  I

* p. t. t7 \: _5 b, m$ N: U8 v& X1 ?        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) o. F5 V. j  ~9 n8 {
                addr = base + cnt;        /* pointer arith! */6 _$ ]+ `( W2 c) ]
                sync ();
  k0 A. t6 O# e                save[i++] = *addr;
$ Y+ D) P/ e7 v% w( b/ _, v. a                sync ();3 R. C$ ~4 Q5 V4 N9 L2 f
                *addr = ~cnt;
: [- A0 U3 n! @. D( ^7 y        }5 \$ y3 n6 V/ u8 _
: B) m& ?! C6 C# O, t& ~  n* h
        addr = base;; t9 n( f2 r$ g' n% ]
        sync ();5 o, r. J# y/ W2 g# N
        save = *addr;
  a8 t# l: H  ^1 I2 O$ j        sync ();& O+ \3 e' a5 Q2 |
        *addr = 0;
+ Z. @# H0 C; a9 J" x5 d
+ f* P! \6 M. P' }3 O. n  q        sync ();
3 Q: _) Z; ]3 M5 S! N! w7 \        if ((val = *addr) != 0) {
/ K4 Y4 i$ s! l7 X7 Q                /* Restore the original data before leaving the function.
" j* [& X: e" D; x1 K                 */0 w) B, Z6 ^, q# Q
                sync ();
3 o' V/ z: a( J4 _; O# M                *addr = save;2 O$ f& y: `7 K5 s& Q& ^8 i
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {4 ^) T9 J1 ^% g$ r2 L! s7 R/ p0 m
                        addr  = base + cnt;3 c7 r8 o( d; t% G( _7 j/ _
                        sync ();  ?9 [5 H, R  ]1 ?% D% R' P
                        *addr = save[--i];4 b  O# b0 |. C
                }% W& m; o, t6 _/ W% I
                return (0);! v/ Z; k( i8 ~1 K& r% j# ~
        }7 O+ e; A. q' e* ~! i3 e, M" l. @
7 [3 p8 d' X# w! b. P3 C5 z
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" g, `+ x1 p0 H+ q+ R
                addr = base + cnt;        /* pointer arith! */
. X' h2 X! e7 a% |8 M' ]2 }                val = *addr;
. V" _% z, q& a: x- R% A! y                *addr = save[--i];$ z3 `- y, W6 n4 y5 G+ y" j: o- `
                if (val != ~cnt) {
6 d% J0 ~; o% G  x9 I3 p                        size = cnt * sizeof (long);, Z) f# H6 @/ I0 z) P
                        /* Restore the original data before leaving the function.! g* X! |  v9 P" M. A
                         */
, a3 \, k1 _8 `/ ^                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {' ^, m) B' H9 W8 D
                                addr  = base + cnt;
# r) p: R2 G- P6 b                                *addr = save[--i];
8 T; d" s8 y2 i# ~& x0 B                        }2 H# y% p2 d0 c+ U9 q2 X8 b* e/ |9 t
                        return (size);
% d) h3 u& h( j( d) m5 l$ K. }                }
! w* K% y4 t/ ^# N5 u7 w        }3 g) c8 A8 Q- @& G; |* z! ~/ R
0 s4 c# E; p* l
        return (maxsize);
6 p( ]% O; ^7 R7 v}
+ K- g1 j3 t9 O& H# Fint dram_init(void)& @/ w) A' Y/ l2 `
{5 v: ?# E5 p. H& j
        /* dram_init must store complete ramsize in gd->ram_size */* g3 d- [; ~  x% p( {
        gd->ram_size = get_ram_size(
2 ]1 w3 Y4 `# Z+ u" c                        (void *)CONFIG_SYS_SDRAM_BASE,2 ~6 h: S, V1 g9 K/ l$ `& v
                        CONFIG_MAX_RAM_BANK_SIZE);
  P8 w1 u- d% i4 d3 w& G% U4 f        return 0;
0 v  `5 ^! x7 C}& ?9 `1 k6 n  W( _5 W* T
6 R' e* \" s# b

9 S/ ^% T1 m" H9 ~
+ v( p7 q2 f, v$ D
" E" W) g7 V8 K8 \( jFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
# c2 P3 \/ L  x* ]' _) k9 ?! ~3 d. y* Z6 ^. O1 V7 p! t
. H( E4 b$ N4 E- K8 i

& y/ I( S  ?4 k7 U
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 21:10 , Processed in 0.041719 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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