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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
# V8 N) W6 y2 ^核心板2:DDR2 256M Byte   NAND FLASH 8G bit# m  _4 o+ G1 f6 o( U
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?6 w+ J, i) E9 j* ~, J. E8 [
6 ^7 ^# `* ]2 |3 x4 \) m) J
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?' G* r+ u; r4 I2 G( g9 x& \: G& u2 _
( I2 ~1 }' [6 G* V; [* O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
- q" t: p4 K' q5 M* C) C9 H/*0 l  Z0 G- p4 k8 o# d: e1 R
* Check memory range for valid RAM. A simple memory test determines: S: P; K$ e$ A3 E
* the actually available RAM size between addresses `base' and
* z" p+ h- ]$ o* `base + maxsize'.# F2 a- l( R) ~' T6 a' @
*/
8 d' A- S7 v- K- _6 Klong get_ram_size(long *base, long maxsize)) w6 ?" A2 B* `6 D: t
{6 C1 m' e: Y! x7 }" c- F
        volatile long *addr;
( i; P8 C; u9 r) ]        long           save[32];
! c* ]6 p! l( v) ~8 M        long           cnt;. i7 a: \6 M& a0 S  ]5 k: }. [
        long           val;
  m1 O, ]* e' t! {5 k% q# M        long           size;
+ J# _- j$ H7 d$ k. i3 O3 {( A        int            i = 0;
8 F( N, v0 \7 ~7 v2 b. g
; U+ @& V* w" P* q        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 r/ l. F% G2 U1 h- {* q  b0 X- X
                addr = base + cnt;        /* pointer arith! */
$ r1 U! ?5 O" [                sync ();7 G! M8 ?/ z/ d
                save[i++] = *addr;% i3 \/ O0 A% B  G+ m
                sync ();
" B+ Y1 l) w5 N4 W) y                *addr = ~cnt;
0 U0 D5 H+ E8 k  b  j) }        }
* [& L" z5 V/ |/ S( D, g0 p( R& [' [
        addr = base;
1 }& z# J; p+ e7 ]% n        sync ();
/ e! [5 ]; v0 U2 X$ B; ^        save = *addr;' x# k* K; `. ^& c2 `$ {* U) L3 C
        sync ();- H+ P" O, O: \. F3 w% @
        *addr = 0;
+ f6 Y% y( g4 W8 b' P
3 P, s- t6 ?( [& d1 |3 Y, i# @- }        sync ();9 V) T" G- E! {+ k/ W0 z1 s
        if ((val = *addr) != 0) {
/ c9 e9 y  B& R- B" S" n                /* Restore the original data before leaving the function.7 L) j+ a' Y$ |' n2 ^
                 */, x( Y9 c2 y6 I& `' ]4 g4 U9 D/ O
                sync ();
- m2 v1 D6 E: n" N6 q                *addr = save;! Q0 W9 T: J4 Y* F  j+ m* E
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {3 H2 [) I! c4 a$ q
                        addr  = base + cnt;& M6 V) ~( s( ~
                        sync ();/ ]  h+ j' m( u2 ?& w# n3 [
                        *addr = save[--i];
: N! I9 D7 i0 K" U                }$ Z: J, J9 A4 J7 \! o) z5 g
                return (0);
6 x+ P1 w1 B' a' M8 W        }
" r; l  {  D9 ^' h7 }8 D* W" D3 }7 @) j2 {( C# g2 c  K
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
4 a/ O. ^& T0 [( m4 H) l+ h8 Y6 f$ Y0 L                addr = base + cnt;        /* pointer arith! */
( R3 b& u6 t6 k8 t" d: e                val = *addr;
: H1 _) z3 U5 w                *addr = save[--i];
0 f3 Z+ {4 f1 A) j' j                if (val != ~cnt) {
' W: j6 O3 v: V+ c7 _* T1 x                        size = cnt * sizeof (long);0 i% M- i: C0 N: V) a% c4 e( d
                        /* Restore the original data before leaving the function.
, ]7 x4 H9 u  P0 u1 [2 I. f                         */2 R  t6 F9 w1 z3 ~- z- {: i7 U& H
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
. A3 \$ A6 ?: U                                addr  = base + cnt;
1 y/ z$ W) \; e& N! `                                *addr = save[--i];9 f- f5 e$ |6 ]3 k) t1 p3 K
                        }, x7 Q/ k6 |  r  K9 n
                        return (size);
7 b" ]4 z' I# ?3 c! v  H                }6 F$ y5 g  R5 e6 w8 \8 u! }
        }
5 b3 Z/ Z! g$ P4 P6 a. p9 ^% s5 m' Q! r( k- O5 b8 ]
        return (maxsize);4 Q9 I. C$ d, q8 P2 v6 L( R
}- i; F- f( z8 y3 s( g
int dram_init(void)
( [6 l; E3 W8 T' J. C{) d% j" o1 r7 |3 y: N
        /* dram_init must store complete ramsize in gd->ram_size */
) L3 N+ h/ C' p        gd->ram_size = get_ram_size(
; V0 N5 z/ }* U! l' Y                        (void *)CONFIG_SYS_SDRAM_BASE,: i5 W. X* F6 l+ r* q- \# b' ]
                        CONFIG_MAX_RAM_BANK_SIZE);: E3 _2 c! h. L9 W& k0 s6 N' }" y
        return 0;
5 y1 B3 t( ^7 h}' }" {  o$ W4 L- r! d

  Q$ `( }) X: W7 t9 v, D* A
; C- [3 R- O1 S/ p) \3 ?/ t. s* n8 k/ M

9 \  F' s! U' }FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
2 p0 d1 z# V& Y& y& J: a" t
0 `- W- [4 o# m3 R: x; B% F( Q' J9 `! p/ {& P
" Q8 m- P, }% E2 @$ n$ b$ E
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 10:52 , Processed in 0.042121 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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