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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit. z) t  g) l6 W
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
; L/ l' `5 W7 L1 ]" ]! Z5 S3 m2 J/ A这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?& s* N4 s2 C; D

( ?) ~( a% N$ q# N  @, C) k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! e9 L0 }: j7 p1 M$ H) w
) R1 v$ A, O5 z* q3 Y4 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, E3 t" i0 V4 ~9 r: p% |
/*! p' k: r( W+ l4 s8 j+ ~5 Y
* Check memory range for valid RAM. A simple memory test determines+ x6 g' m0 ^: R+ @9 i, P
* the actually available RAM size between addresses `base' and
- |. b9 L8 |- b% v7 e* `base + maxsize'.& F( d! S: v" ]
*/2 w1 u, D& F! s
long get_ram_size(long *base, long maxsize)
) o* |3 h! g+ u, B  s8 T9 m" m{
4 c+ T- ]) ~8 R1 m        volatile long *addr;6 I7 z2 L8 b  F+ H5 S
        long           save[32];
8 S" G; n3 f/ C" Y( ^+ P9 a        long           cnt;
4 I6 |8 D5 R1 c: k        long           val;
8 R# C+ m1 N0 q        long           size;
" z# E& ]) o, a4 {: K& c7 X        int            i = 0;7 p# u1 X* {7 [" O
1 E0 N' Q9 w3 W
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; D& \. p6 y) r" `( |6 s' @
                addr = base + cnt;        /* pointer arith! */
7 ~" G. K4 m0 C. Y                sync ();/ v+ m' I2 x: i
                save[i++] = *addr;' J8 D4 r/ V( }: P
                sync ();
0 r8 G$ V/ B+ U4 k                *addr = ~cnt;
7 d7 M& T( Y8 ]7 A. P" N" R        }
, ^  j% v4 d% }7 |7 R+ R  @
  Q! j7 V, [6 j5 Z+ F4 I        addr = base;
! X" G' [4 \  @' Y# q        sync ();% K  Q) F; a3 @! _$ O7 j
        save = *addr;5 c4 d$ Q8 U- s1 G8 c5 a/ R
        sync ();
( n1 M, J7 g1 B' e& q! q6 {6 e5 |        *addr = 0;
+ v- W: k: Q* r+ ^! _- b9 a! ~1 {, c# o
2 X( V7 ?" ^3 z        sync ();
! V9 ?+ b  @" _        if ((val = *addr) != 0) {
" p/ F- l7 H$ f* }9 y                /* Restore the original data before leaving the function." g% ?7 v; Z: ]. w; }( i) E* f" Z
                 */9 z7 v0 h# p* r$ `2 U! J
                sync ();9 {. `7 e* Z& c) ^6 k/ J4 a
                *addr = save;  X6 Q+ o8 n* g8 y. ]$ S& n8 ?2 X
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {' d; f9 a) F. F! l
                        addr  = base + cnt;
8 E% W/ d+ T  U; F& G                        sync ();) M) I+ p3 A3 F+ ~5 N
                        *addr = save[--i];
) Z% @0 O) P( D( ]0 E' i+ i5 d                }7 G  J* ?: |2 B. U: J5 D3 s
                return (0);7 L& U4 O( s. c2 T
        }* ]; x$ E* y. p' Q

( v" b' I2 i  v5 [) X2 D        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {! P% T# C5 k9 y' q. U/ _; B* b9 x5 T
                addr = base + cnt;        /* pointer arith! */
% g" a( z, u2 B$ I, K; G                val = *addr;+ R5 X8 U+ t5 H5 y+ M/ P" `8 j
                *addr = save[--i];
' F( [6 D( D4 `3 b( G! T% {                if (val != ~cnt) {
' w* ]  I# W1 C* l                        size = cnt * sizeof (long);
7 p% A! m6 r' _) Z# C7 W! M2 r) g                        /* Restore the original data before leaving the function.
6 j) {: v1 R  F' ~                         */3 g" i( M; R. o  Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
8 K% S: c; b0 p% a/ b9 C0 V                                addr  = base + cnt;& n' @5 R# {$ ^2 G/ F/ x3 j
                                *addr = save[--i];9 o* e* q6 p3 G& K. d8 ?. ]
                        }# S8 K% t7 i- Z% d
                        return (size);
& w0 L2 F* k. a                }' E! i8 j! h# e4 W4 n) Z
        }
3 i2 a% h! A$ h; B' e- Z5 K$ m/ P% r( I( F( d$ T( S2 W
        return (maxsize);
' {2 |' B# _3 Z) U! t}
3 Q! {5 h) {8 |6 ~. jint dram_init(void)
) E7 e/ I. M9 \6 F; |( p{
8 Q7 v" b, T7 V  g) T        /* dram_init must store complete ramsize in gd->ram_size */
6 E5 }( W9 H2 V! d4 Z        gd->ram_size = get_ram_size(
- D. }. `, Q3 B4 \                        (void *)CONFIG_SYS_SDRAM_BASE,
5 H# ~3 Q0 T& m" K2 ^! z                        CONFIG_MAX_RAM_BANK_SIZE);- D* O2 o$ T9 p' I  b
        return 0;' C! M0 \2 |, P% X& l
}
0 u( s& M' A, f3 h2 @# w' D3 P& V! A( j
$ J1 _/ Q6 o" Z- \) t2 D2 ^1 O' \+ e0 o# l0 ?& Y+ a) t! B
; |/ W& C; H* Y

" U5 ?0 `: I% W, q8 DFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!$ g) R9 S7 \9 I) O

; @, J4 G& W% X$ J! \+ S1 y" r. [; ]  c: ?% X1 s. u" F# x% ]

+ E+ ?. w' l- K& [6 q8 W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 22:56 , Processed in 0.040737 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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