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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit0 o# W- J+ f) K  r# ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. U4 s/ q+ W* c* {# L1 I这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?; s: C; G& K% G- l( v" V. a0 [
& M  g* \# V! ]: K: A9 M
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?. Z1 R: p0 ~. s: F- w, w: ?# ?) r
# o) {$ I- L+ Z1 ^" {' Y/ j4 d, {* A5 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:0 v2 `# [; H  l/ m. F; c
/*; u/ }( ]4 s% ^$ S  G! i
* Check memory range for valid RAM. A simple memory test determines" ]" a% E  J1 H2 x- i; ~8 Y
* the actually available RAM size between addresses `base' and
" a# ~2 v$ [, U( u: M+ y* `base + maxsize'.$ R4 }0 E/ }5 n' @. Q2 Y
*/9 h% o) u% g7 B, z
long get_ram_size(long *base, long maxsize)
7 N1 m: M% g4 H9 s' s* E% O{
% w7 l# S! c1 S        volatile long *addr;
& B3 f% M5 `; i, r        long           save[32];
# F7 q- a. e" }# Y4 k2 Q5 A        long           cnt;5 J! _9 r% R8 c2 E* I* ]; B
        long           val;" T/ e, w# t0 C
        long           size;' X6 F0 g* H* A& R) B8 k% f
        int            i = 0;
; P6 |, B5 w; d( u
% b0 d3 p# h/ H% C: @        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {# @& p1 _  O/ i1 I7 M
                addr = base + cnt;        /* pointer arith! */, P$ w- y. z7 ?2 G0 K
                sync ();
- ^2 I. W4 H, o* Q                save[i++] = *addr;
& v& m7 q7 `  p  F7 i( r# Z& P                sync ();
4 Q: n4 f- v! j) B$ w$ m/ S                *addr = ~cnt;/ f% l; S+ v- i6 t& _
        }, I, `, c$ L% d! z; g* b
; d$ p/ X" ]. f$ f
        addr = base;
0 b/ d9 _$ o5 L5 ]4 `0 [* {        sync ();
5 S" T& I. r2 j! J        save = *addr;4 {' t8 E* S2 S, t& I: W
        sync ();1 L% R/ @) a& B
        *addr = 0;
% _: `' e1 p, T/ r) k/ H  F8 E/ i
6 [3 S' M( W  X7 x8 `& t4 F        sync ();
4 R/ g- y  W$ a( N6 }3 A5 U& B4 l        if ((val = *addr) != 0) {
) }& z+ f+ Z7 n                /* Restore the original data before leaving the function.+ \5 \$ u  k2 \8 K  T. I: ]  u. q
                 */
. e4 C. U7 i/ i+ A/ H7 V% V7 ]# t                sync ();+ W% Q2 v4 U5 R/ H
                *addr = save;: Z2 r9 e- _  W9 |) I$ [
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {. F1 `. Q/ S6 S* @! R3 S
                        addr  = base + cnt;
2 S% l  |) D3 |5 D" h( w7 y                        sync ();
: U3 V$ N0 l0 S# T5 X                        *addr = save[--i];2 Z( R0 q% n  A, M' \
                }- v" n* r4 o  n* c
                return (0);, {1 B9 ^3 R& u+ p" V% l! f
        }! R2 o8 X7 A9 l3 `

6 P( N5 L2 R$ F        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
6 A! K3 m: n+ o* u5 E0 L                addr = base + cnt;        /* pointer arith! */% G9 v. v3 k6 D7 l( k; Y) \# \0 W
                val = *addr;
# n" f# Z) u, v/ Y/ n9 Z  g                *addr = save[--i];' k5 ?" m* D5 ^/ `  r; Y. l$ O
                if (val != ~cnt) {0 v5 L8 W* L. z+ u
                        size = cnt * sizeof (long);6 ~  E" p8 C7 |( A1 Q' u0 Y, U
                        /* Restore the original data before leaving the function.
/ @& E: U; i7 V2 @8 g                         */
6 M; u& w9 E+ u$ v, U4 O                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {9 a5 D  t$ q/ o+ {
                                addr  = base + cnt;
8 u; N0 O+ ?( ]' s' n% |1 z                                *addr = save[--i];
0 i7 o3 A9 G8 p' }                        }* t: k1 `5 L& P/ ^
                        return (size);% ?4 x: ~% K6 j. y5 s
                }
/ N/ f9 ?& _& K+ t6 P; G- r/ a        }
1 x4 i& o5 Y; r8 e: y) L; p5 Y( W; S& I3 S
        return (maxsize);
2 T) Q1 n$ ^) J0 P}8 A9 H, l- J% [- ~' |
int dram_init(void)
: i6 k" l! `; A! z# ?! ^: H{# A: l% \6 y4 ]
        /* dram_init must store complete ramsize in gd->ram_size */. h. j- `  C: j. X: |/ D
        gd->ram_size = get_ram_size(
  `3 d* d' V' T  L( k$ I                        (void *)CONFIG_SYS_SDRAM_BASE," g& u5 t, b$ J2 I3 X
                        CONFIG_MAX_RAM_BANK_SIZE);
8 g. c  }/ s) k* e/ ]        return 0;
+ g  o4 f7 {2 F3 O& J# M7 L}
& [, @' L2 X) `4 b2 }8 x: j
6 O, Z0 U+ y/ }, G9 z8 T
. Q: {# s* O: B8 `. g1 P6 Z1 R; z; |4 ]- d1 X9 c

% Y. |% u; v5 e% QFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!! {/ \* G! V& ?0 q) X8 `
( F0 n6 w* L: X, w# y
% K) c. D/ g, n8 }! o
1 f1 N. q% N1 {6 p
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-3 07:58 , Processed in 0.037271 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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