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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit- G6 f7 c* Y2 g  Z( d* }( Q6 J/ P
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
& Q% a( ?5 p, r. ]- U这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
3 R& U+ L& E! X$ J/ m  r: ^" s
! f- T& x4 c' t1 t5 K是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?) X8 O7 K  r" O3 J% R1 F9 d
9 s1 u/ Y; h' `' u: b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:& J3 ^7 @' }. \+ N% G4 r
/*# s7 r( i" _4 F7 m
* Check memory range for valid RAM. A simple memory test determines0 t* ^, ~  U' \7 f1 l3 D* b$ A
* the actually available RAM size between addresses `base' and& T9 P7 w* V# g1 i% [, n( v4 @1 [
* `base + maxsize'.
* C% V. {5 ^- ^$ T3 U*/
( p! p$ h! m" h- M( ~5 e! Dlong get_ram_size(long *base, long maxsize)8 {/ A1 U- K. W( N. g
{
8 s: U4 A" S1 G" u' f% M" v        volatile long *addr;
6 \3 _% E& p+ f$ `        long           save[32];
$ F0 c# B' n) G! B: J        long           cnt;
3 [" X2 N% U& V6 ]0 Z        long           val;
5 ^$ H3 w2 P% C/ b' B, E$ [7 Z        long           size;
2 w+ p, U. d- n        int            i = 0;
8 C3 Q7 f% q* q5 R5 p
  j) j" B) b$ v1 H) t+ d        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' O8 X. [3 A4 \5 L% V0 {7 R, `                addr = base + cnt;        /* pointer arith! */
7 A+ ?2 t" b) W* V& s: M; Y                sync ();
3 v6 F3 I" ~) {                save[i++] = *addr;1 |$ V8 f1 C. G/ [3 M& D
                sync ();% M) s5 o6 v3 ~$ o
                *addr = ~cnt;6 P% G9 r: a9 f3 T* ~' N- l* D9 U
        }$ V) z9 ~$ Q; z$ T: M3 c3 ]: z, D
4 k7 S" d$ w/ V0 E: V- A$ q
        addr = base;
6 q. V5 m( C, q- V: p5 Z; u/ M9 q        sync ();) Z9 ^. D+ _- X$ H4 G" A
        save = *addr;
( ?3 d& W1 f* N$ X        sync ();
% @4 j' D! P5 a0 {8 _" _        *addr = 0;
9 @0 I6 t6 q" l- x! g
! h9 l& K2 C3 m        sync ();
! Y3 l& o9 v7 g7 H. K% S        if ((val = *addr) != 0) {) T# W7 T! E7 D% D4 \1 K
                /* Restore the original data before leaving the function.
% t5 H. O. }. F1 h4 q; K% @& x                 */" N2 q& N. C: G# O
                sync ();, R+ B# h" d. t) z5 O# [6 a
                *addr = save;
# G" C: B( u* b% @3 W4 V, Z                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
% c0 Z, l' v, x8 C  {' k                        addr  = base + cnt;1 I" K6 S1 V, E& R4 D3 N. Y
                        sync ();3 o+ d9 V6 U, k; G' Z
                        *addr = save[--i];
5 o+ u7 Q) d. U- I+ U                }# K& ^. V1 ^5 K5 S5 a1 t
                return (0);8 l; @) S. D* C3 O/ v; C
        }! n2 b* v; B  t6 q
: V: O, x- f* m4 X& m  |0 X
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
' F1 Z$ K' s8 f& y: Q# _2 W                addr = base + cnt;        /* pointer arith! */
( c( {' x, x/ E. J                val = *addr;
' c3 c- C: o& X( H& ?                *addr = save[--i];
+ Y6 {, r$ {9 Q0 t4 [2 E' S                if (val != ~cnt) {8 Z) r) w7 W& F: ^' T( v
                        size = cnt * sizeof (long);
! v3 `% L( o! v: g" D  q# o" }                        /* Restore the original data before leaving the function.
4 i/ ^. M, q6 X! q                         */
' s' L8 |, X7 ]" @9 v0 @6 T                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ v- e3 Z8 {2 x# U/ m0 [
                                addr  = base + cnt;
" B) q8 j. J( X; U2 X+ B                                *addr = save[--i];
+ s3 m. |8 f8 a                        }
0 S6 F" N- v2 b" f! Q3 O                        return (size);- M* K/ z8 {! ~! ?5 Q; R6 W# Y5 {
                }! M9 w% p5 U8 b2 N
        }
& A) \+ p! f3 p( m5 Q
: n( _/ b' P& R1 A) v* o1 X        return (maxsize);
6 b" N; v7 o7 F7 |/ T}
" G* v$ v* E+ P( o( n( c# b5 B$ f3 sint dram_init(void)& x/ h% B# B- D! ?) P
{
7 O# J3 p- T6 F        /* dram_init must store complete ramsize in gd->ram_size */+ s/ S" a. Y' X1 w; K
        gd->ram_size = get_ram_size(
$ v) Z1 P9 b7 f5 \5 N- y2 Z4 K8 l! i                        (void *)CONFIG_SYS_SDRAM_BASE,
' L* D( B4 Z  }: I; g. N                        CONFIG_MAX_RAM_BANK_SIZE);
3 Y% X/ n# H6 {        return 0;
4 X2 k/ m# |9 G8 I$ E}4 `7 c) p, E) D

. G/ l; i+ E6 O" N6 x9 j& _7 |: h+ |- l/ n# I/ p+ A

; W0 g' s* T, R  K& `- ?# G9 I1 T  C5 b0 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ B4 |; _9 M2 v
" H5 `: d3 h% l6 A, \7 \5 f5 T) z5 G

+ j9 a4 ~3 R% v
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 05:00 , Processed in 0.045057 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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