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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ l* I2 k: N/ x* ~  d核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 `+ D, ^2 j, W! _这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
4 E7 G4 S4 U' U& [& {: `0 W, E  V* C  j+ d% D4 q$ F8 m8 w/ q! h
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?# ~/ x8 j: b2 t: J# n: W
4 \! f3 U4 w% z+ G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" @2 U% Y+ H, H; P7 q/*! T5 V" d' H4 k+ p/ b. E
* Check memory range for valid RAM. A simple memory test determines
, m% d! X& n% O. Y; Y6 s* the actually available RAM size between addresses `base' and8 _! r9 P( I+ ]% S7 ~
* `base + maxsize'.3 r9 e: C' A5 F1 U3 j
*/% n2 n! {0 K3 o1 z
long get_ram_size(long *base, long maxsize)0 D3 u* m% f6 w
{
# V4 I# W5 i+ y5 }        volatile long *addr;
9 j  {( o) W% Z4 n( ?& d/ l4 O        long           save[32];
7 o8 X, n  D7 r: K, W8 H+ F" }% e/ `0 V/ S        long           cnt;1 r! U; I; ^2 p
        long           val;' k# l4 R  i/ s3 u9 A% z
        long           size;0 {- R5 h$ N! A% n" c) i
        int            i = 0;
$ x# \+ G0 G2 g9 y3 R" v7 \* ]- @. D) `1 j/ V& V+ t7 Z+ f
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {' i& x/ A/ B( r1 |3 ~3 ^
                addr = base + cnt;        /* pointer arith! */* C6 h/ r8 P  h
                sync ();3 `3 i3 c6 m" O0 F# c
                save[i++] = *addr;$ m, Z. K" K- f$ s  O2 `
                sync ();
7 T  y6 E2 v+ X; |                *addr = ~cnt;9 k8 e- X; q; ^8 S+ M
        }
/ Y! o. m! ~$ H( @0 t. L! o
. j7 Y% Y1 q3 u: x/ e# O        addr = base;
! j% ^2 y/ e$ R" [5 L- r- d( U$ r7 |        sync ();
4 g. ], H* e! p        save = *addr;
' j) d: Q3 l! R: [% {* O6 v+ _0 {( T( Z        sync ();
1 [. Y1 S/ J$ S- _. V% ]' N        *addr = 0;
, J1 D# w+ n" e8 D- x8 ~: q" {6 y5 v- v$ ?3 I! [* R
        sync ();8 P5 }2 x& l3 Q; m$ Z  G* p7 V
        if ((val = *addr) != 0) {
/ `8 i% K4 z1 s0 @/ N* M                /* Restore the original data before leaving the function.
% n! q# y, r9 L, ^* Q! n: W, h                 */% w( `. @  n. U5 i
                sync ();) T+ O" ~/ K/ z0 o! O' K  m
                *addr = save;
" w$ `5 M9 q$ D                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
9 J. T. a2 x+ i( V1 T& M                        addr  = base + cnt;
$ h. o9 [, p* W2 y3 G/ @; y+ ]                        sync ();
6 ^* `5 c6 ~) g7 \! H                        *addr = save[--i];
6 E$ u8 P! v( w1 K                }$ y. {, b# }: N) s
                return (0);
" B& }4 p; w, u: n1 n7 M        }/ A9 c$ ^7 W  S  N2 F, a

3 E# ~/ ^0 _0 N  i, y9 B7 k8 p3 W9 s        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
1 `0 ?! ~7 m) k+ t7 x8 d                addr = base + cnt;        /* pointer arith! */
6 ]6 ]( ]: ~- e. g9 T  z" ]                val = *addr;
/ z; o9 I" J% p5 Y; q                *addr = save[--i];
% O0 ~0 C+ R4 W: m% n; @# {- U& i" F                if (val != ~cnt) {6 z+ X, f: _- Z& V, \! G" E! g
                        size = cnt * sizeof (long);* h: p4 s* n# ~
                        /* Restore the original data before leaving the function.
# b. F0 C6 }3 T3 h# o                         */! u) V0 d0 }& R9 @- ]2 w# @+ W
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {0 l( h& _! ?' J  r0 n
                                addr  = base + cnt;9 h$ Z8 m6 r% ]7 H6 P; o
                                *addr = save[--i];2 ]6 L1 k3 I: m: `  D& k$ J
                        }
1 l1 f6 t' ]0 t/ V                        return (size);
7 i5 Q' s, j& U; Y. m                }, d: i0 K. ~6 N, N7 T: u
        }$ W4 P* w# h1 _9 n9 R( W

" H+ H" D6 f9 D7 ~7 N        return (maxsize);! k( T) t6 u+ b
}% d! ]' G1 G% U2 D1 ?+ p4 M' H
int dram_init(void)
. V+ H2 W! E; \6 {. q, H{9 w; g- l0 C  e) P, C
        /* dram_init must store complete ramsize in gd->ram_size */% a6 ?0 |4 E5 C( L; H0 ~
        gd->ram_size = get_ram_size(  s2 I0 P5 i. m3 N5 a
                        (void *)CONFIG_SYS_SDRAM_BASE,
" H- ^7 {! ]" ]8 X                        CONFIG_MAX_RAM_BANK_SIZE);" o( u( d4 E0 r  f3 j0 M
        return 0;3 i/ D5 A' Y, K& c% t: N% w# ^
}4 e' B# i  B- u0 ^6 n

9 V  ?0 X' E) S/ K, k' ?
! p. _( B8 t2 N4 E5 q6 o. d6 Y
5 }1 ?  c# _, R# K! M, Q
2 {% f& Z5 x# W* H6 QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!8 l; o* r0 T% ^

. l( x6 f/ k+ X% F2 c  i. O2 `" m

5 ?" H" o0 F  [' G) I. b" u. }8 Z) N
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 04:21 , Processed in 0.037472 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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