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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
* C( x+ r' h2 f1 G9 S* G" Y# A核心板2:DDR2 256M Byte   NAND FLASH 8G bit
' `+ v: s- b: E$ M6 N& o- a这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
! k* i- b( ]5 g
0 C' P1 q2 }( L是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?" w( U/ y; F9 t5 k# c+ R

" _5 f+ y, X' X6 {! p4 `( D0 W8 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:. r- q- S1 Y: h9 H0 w* Q/ T% A& r. s
/*% ?" O6 g1 |1 g2 _4 A
* Check memory range for valid RAM. A simple memory test determines
1 P" t; s. v' ?6 _: i9 V: s8 k* the actually available RAM size between addresses `base' and. K. m6 @9 y8 |$ R* W
* `base + maxsize'.
7 F7 s/ o2 @# E( N*/
. n6 M  O. y# i% V7 o3 f8 d/ W5 C4 v) xlong get_ram_size(long *base, long maxsize)
. u* Z9 {( E7 Q3 E- a1 s6 K{
! v+ K; z8 |3 a8 C& U- l0 G4 M8 K        volatile long *addr;
/ ]7 \* M* r3 K5 t        long           save[32];: L& H7 A4 D5 ^' U1 p/ F0 @4 B
        long           cnt;, N5 w! N8 B/ i: x: i" [8 ~3 j
        long           val;8 D3 x. U0 Q+ `6 {- i5 \$ d/ Z
        long           size;
" M6 |& T' y* V" ?; l1 [        int            i = 0;- C* @! q: h0 J$ ~0 a% S

, k+ J9 w5 y* e: n* M, o+ ~! h        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
# i' a( v' y/ T9 I' d                addr = base + cnt;        /* pointer arith! */$ K; ?& V3 b! x7 D1 H! V
                sync ();
4 |& H# N/ I1 y. V                save[i++] = *addr;( `" F9 H: P0 C) ~
                sync ();3 K2 Q, P* d6 z; E$ \
                *addr = ~cnt;
# ?4 R, A2 @) K) ]        }
8 U" Y$ ^; e1 T; m/ K( l) y6 \- K
- K6 _2 h$ {3 d  ]- ?        addr = base;" h9 `' w! v* G6 b8 O
        sync ();
* C7 Q0 F) a: n# U6 ?) J        save = *addr;1 E1 b3 X6 C% I2 I
        sync ();! f% A" s7 I) v; e- Z, W$ G
        *addr = 0;( [+ M( t  {+ N1 G3 ^' W% g
  H( b7 @' \3 r5 j' _) ~( q
        sync ();
! S$ z& p, Y# |+ E2 I        if ((val = *addr) != 0) {
  t6 P, `2 C6 S9 b; D" h                /* Restore the original data before leaving the function.2 y/ u3 z: k8 K) V
                 */% Y: P/ {: @7 E' z, K
                sync ();/ S/ f* Z2 X4 a7 c- @4 n
                *addr = save;1 F/ `8 @* e3 K3 H
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
# h# p9 z$ \: |                        addr  = base + cnt;5 a5 J# y( P$ i7 K1 G
                        sync ();8 r( z- }0 X6 f& i1 E$ O1 z
                        *addr = save[--i];
9 S  p8 w& z, r                }
3 W1 D0 W* ~7 P                return (0);
$ M' a% l$ s6 t        }! l, p, S) w1 \4 h
* H3 \4 {, w) U$ ?
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' V* X, J& `6 Y( V% h                addr = base + cnt;        /* pointer arith! */% [# ~; z6 m4 b- S! D
                val = *addr;& z5 g  j7 C" s1 O0 M
                *addr = save[--i];
2 j/ M$ k4 C  a4 [  N3 A                if (val != ~cnt) {
$ B1 o. x5 H( t4 Y) z3 w                        size = cnt * sizeof (long);5 }* v1 _9 W7 s' b2 c6 |
                        /* Restore the original data before leaving the function.
6 T8 `* m6 N9 X; @- F2 t0 h- Z                         */8 l- Y/ T& q* K. v
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {- O  p0 ~1 _* I. K( \5 f! J8 Q
                                addr  = base + cnt;
# {+ d. e: J0 e5 y" N                                *addr = save[--i];
$ D" @  r, S; e( T# A                        }  d' \; D2 N! @! C
                        return (size);+ a  r( K/ ?0 v  i
                }
* N' `: i* f' [, w        }
  t: j# |. g9 D+ e3 G' o; A# R% E' c5 Z) J
        return (maxsize);( z& ?9 m* V; ?
}
6 K' `) q! H- X8 R2 Sint dram_init(void)
* U7 e3 l$ G1 [) |, B# b5 r{
' N0 b% N* N" P9 Q5 @* k: q  a        /* dram_init must store complete ramsize in gd->ram_size */0 a( X  h# q" G9 G) B( H. u
        gd->ram_size = get_ram_size(' j0 o: W- {% G; G/ o
                        (void *)CONFIG_SYS_SDRAM_BASE,
+ W  {+ w+ d" \  X: w' H2 r4 X. V                        CONFIG_MAX_RAM_BANK_SIZE);6 z$ ~$ v" q- r1 c; ^* l* `' p, K
        return 0;
# ?5 {7 [0 v  E' K7 R. I3 i$ [) ^. D}1 i8 i0 w$ k& Y) ]/ [4 A: B# h1 Z

9 P* A3 z* Y4 Y5 v, G
# T+ w& y/ V! i, |+ x! w  M0 {& H% b% m  i3 u/ _8 I8 O* _

/ L8 A% y) U7 L3 f' PFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!' p- ]' i+ _+ L' S
8 o/ W! k* m2 h% Y% z$ c
6 @6 Y. C9 [' J) U
) s: \  `* z) g/ M
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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