TL138 uboot是怎么区分配置两款核心板的 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4101|回复: 1

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2014-9-11 09:33:39 | 显示全部楼层 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
2 R# F7 o; a* m) g6 g8 ~( X核心板2:DDR2 256M Byte   NAND FLASH 8G bit# A/ ~# A2 l0 y/ g0 d
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?8 L& G1 Y# G3 ^! V9 f- J

- i$ K, O( D/ A" q' Z是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?! g% z4 p  o6 R7 r5 a
- }: i: H, G# U5 f& ?
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
发表于 2014-9-11 18:55:41 | 显示全部楼层
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ r. T4 |/ W1 M9 `/*+ t) R# p: i, m. u) u
* Check memory range for valid RAM. A simple memory test determines0 p$ M& v, Y3 y" i* @
* the actually available RAM size between addresses `base' and- R6 D0 i+ v* z! C! P
* `base + maxsize'.
" Q/ {! r. S# _2 ?" O, t$ C*/! S' Y4 U6 c: u7 Z; k* B
long get_ram_size(long *base, long maxsize)
! p9 y7 @! W* l8 h: C# ]+ l3 r{+ Z: k$ `+ k% J
        volatile long *addr;9 B6 h& ^- V9 e, H6 F' l
        long           save[32];
/ F6 C: p$ e; i  j3 ]: A        long           cnt;
* o" K; {( i4 {0 A        long           val;
9 t& x7 L% M# X, W% W3 o        long           size;
# C7 ^7 ?5 K7 ?; J/ e. e        int            i = 0;: w6 e6 A. T+ ^, v  {, [
4 P. S0 E# [1 n0 l0 O+ {
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
, f4 `% ~4 ?/ ^: U4 H                addr = base + cnt;        /* pointer arith! */
5 T. d6 B, z$ d- o                sync ();. T0 {9 M% A! {' _% q2 P  |' L
                save[i++] = *addr;3 Y1 c! G, \: i3 }+ Y
                sync ();
' w2 ?9 V- t4 v* B4 b( R) W: O9 e                *addr = ~cnt;$ @! H2 I! n6 b0 l) U4 @
        }1 I' q4 d" N- b  ?  @+ K, k' D) a0 s

& ?6 u0 F3 q+ f9 `. t5 `" {& v+ ~        addr = base;
9 z+ H% S6 f1 R3 r- ~        sync ();
, y0 b4 }; l1 x# ~6 G        save = *addr;
1 H" d! T( k6 |2 T( D% l4 C        sync ();0 G/ d& R" W, G& n$ w
        *addr = 0;
; h& J( f! M" C) I3 Q) z* ?7 V3 ?. K* \5 b6 H5 ?
        sync ();
1 K8 ?4 I3 I& L( Y0 P        if ((val = *addr) != 0) {
1 f8 {. I2 H% F2 Z0 |                /* Restore the original data before leaving the function.
; V% ?- l# _* D                 */! K9 o7 ?6 k) }8 t. K1 o
                sync ();
; K' B' N+ V: v* j                *addr = save;
" L& F( s/ D  G1 w) S                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
2 I' }% o$ D7 i, N# M0 R3 y0 U                        addr  = base + cnt;
% E( V6 j4 s+ {5 q, ?2 I                        sync ();" w; ~, z# r  }) K& n/ [0 Y
                        *addr = save[--i];) D1 r8 Z; i  Q: c
                }
# r3 P- V) y- K                return (0);, ?0 `5 E* [. j, R
        }: ~# B: b2 G  \* Z+ A/ \
) `6 @1 W2 m- z, G5 @
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
" q8 T2 u- J/ i% W" r/ q                addr = base + cnt;        /* pointer arith! *// p7 V- {5 S# W: a2 M5 ]9 R! e
                val = *addr;5 i  B$ \& @0 y$ }+ U
                *addr = save[--i];2 n' Y5 a- {  s' u( r, g
                if (val != ~cnt) {( J" u; d6 w% o" H3 e  |) A7 B# m; i
                        size = cnt * sizeof (long);
, Q* U0 n/ u* e6 }5 @                        /* Restore the original data before leaving the function.* v; u+ K) [# v) }5 f( D# @
                         */
) b5 R* n& F9 W/ p# }                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {( N* ^. m/ I2 S9 E" F/ i) F
                                addr  = base + cnt;
$ H& m# T9 j1 V" F" {; n& `3 ^                                *addr = save[--i];+ ]2 J. U7 v) Y1 j
                        }
' v% w- L7 q( T5 w1 H                        return (size);
$ X2 [; S9 S) }# k, K                }
& L5 i" `* ?' v# Z0 t) F        }
5 T1 c% a7 n1 p( K$ e( K; |; S7 P
        return (maxsize);9 |6 c$ B8 W) \+ q" U' L0 x
}7 Z. Z( a9 }) x0 _
int dram_init(void)
+ f, c7 z6 t! l: r; Y; k9 k{
# H3 O1 \# N+ g$ F2 q( C+ p        /* dram_init must store complete ramsize in gd->ram_size */
( j6 ^' N5 V7 W/ E% e! ^3 m        gd->ram_size = get_ram_size(: W% M& T7 Q" h
                        (void *)CONFIG_SYS_SDRAM_BASE,* B& o3 M( ]% U3 j8 v
                        CONFIG_MAX_RAM_BANK_SIZE);* Q6 U) a5 C4 e$ Q" G/ N1 H2 Z
        return 0;
4 L# R3 v# d/ h3 j}8 g$ q1 B; o4 Z2 }. P0 T
; ?" j& ^3 M" h0 R* v

5 S! x; Y8 {+ Z3 j. Y5 E! R5 P+ |& O2 N5 ]8 x- o+ [

  u, K* G8 }7 J6 }, QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!4 O7 J+ z: N7 p+ s  H% E( R' w7 g
) e' s/ e  G6 ?1 G4 c  c
& W' N3 d$ r) F& P

5 I) Z0 e- I: t$ r
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 13:54 , Processed in 0.038299 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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