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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ G. p: ]: ~, c! I; d, E& M: e1 }
核心板2:DDR2 256M Byte   NAND FLASH 8G bit) s" @7 T% H, H7 u  D* `
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
' t6 O9 d1 S8 m
7 {9 G( j6 j. F6 w是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?( j7 r( O: w) Q" j) V5 G: d* ?, x

0 Q9 e: t. l' |$ z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
# W: `" o+ h2 W% \/*
+ y$ |' |, Y8 b. _8 [0 {) {. E+ I3 q* Check memory range for valid RAM. A simple memory test determines" ^5 w8 R4 ]6 _" I; {% u
* the actually available RAM size between addresses `base' and
9 M5 C0 ^- Q0 k& o3 h* `base + maxsize'.9 }* F9 f9 N6 ^. K
*/
8 ^1 k1 b% ^5 a& i8 S; Nlong get_ram_size(long *base, long maxsize)
/ @: |" W9 q0 U( n; ?6 E* v( z- C{! r0 l3 H+ j3 x$ Q! ?
        volatile long *addr;
& q" j! T  E  R7 R( g        long           save[32];" B9 m: c1 f4 g% S
        long           cnt;
* t' h; l& D+ g* @1 o        long           val;
, E; ]0 {% D8 R        long           size;
: S3 |/ R5 W7 l4 o. c  T! V        int            i = 0;
9 T# o/ ]" a2 x- z8 |
+ L1 F3 Q1 Q' @9 e4 z        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {; Z8 C# z8 h; v
                addr = base + cnt;        /* pointer arith! */2 e9 `3 W1 a% o, K; V
                sync ();
8 m+ B8 F9 B# F) t$ @                save[i++] = *addr;
0 z1 |0 F5 U/ L% O9 ?8 D                sync ();
+ F, A( ^. s: W( ~7 x, a! f$ S                *addr = ~cnt;  {# h7 x4 z, G  E4 @' V" B7 ?
        }
" J% P0 B+ u, t9 \
6 d! f$ q8 V3 l        addr = base;
6 ^# ?' f# ^2 r8 @        sync ();6 K/ N: F" ]) G0 k: y$ b! B
        save = *addr;
" F) h6 b$ V) p+ u# g4 w        sync ();/ @4 d& v! ^9 M) y
        *addr = 0;
& l- g/ D" g% q. @8 q2 g8 ~. {% J& Y, q' m
        sync ();
9 b( _3 @3 v# z+ J8 N, G        if ((val = *addr) != 0) {
( O+ q5 b3 O5 Q9 H5 F$ U                /* Restore the original data before leaving the function.5 A* u- ^! O3 i) D# \7 [3 c- h) C
                 */
8 e5 f" k+ Z' _                sync ();$ e! t" e* H+ O, I4 z: d
                *addr = save;% |6 {4 X3 E7 y0 C
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
7 o9 Y+ D# _' Q+ d7 a0 C9 J                        addr  = base + cnt;& r( V4 c' M5 p
                        sync ();
2 J" g2 w' N9 J. X/ G                        *addr = save[--i];) M+ E% G& m* e! c' d; S
                }3 L* y: q3 X  Q; i2 X- E
                return (0);! B) ?" a* P9 U7 O% L% L  a
        }
4 X# f& h+ g# F% t- K0 R( S' h: K+ r; v* S( M$ x/ o1 P& ~
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ b" ~) t# u- h2 {& D2 R9 V                addr = base + cnt;        /* pointer arith! */
" I4 q6 v7 l  Z) [# L# ~* C                val = *addr;, B4 q) M* ?0 i, n7 S2 I
                *addr = save[--i];& X6 Y& ?/ ]2 W: b2 v
                if (val != ~cnt) {7 l+ F+ u( n! I7 J7 c+ j2 C
                        size = cnt * sizeof (long);% c1 N$ R# \4 @( v# a2 @
                        /* Restore the original data before leaving the function.* i% i- Y* |- G# g
                         */. p: c6 B- {& ~  a$ |
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
- k& P  K, F* p1 s) N$ O% f                                addr  = base + cnt;/ r7 @7 b5 I5 n# u! z% p
                                *addr = save[--i];
9 X1 ^2 F  {# S                        }
* [) `* g) `4 c  C+ G                        return (size);
; C8 v% o* i) |" G' i                }
/ y, f& _' l" G2 Y7 `4 S6 c        }
2 ~- g& O3 @0 z$ t9 g9 k. k+ j2 h' P+ [# J. A
        return (maxsize);
2 Z. A- w+ x! a! d( ~/ M* ]}
3 m4 R9 {. n, a. G4 s' |, H! e; gint dram_init(void)
$ ~9 I* C0 Z) ~9 Z7 m{
: T1 ^& `0 b5 }( n2 ~! Z. Z        /* dram_init must store complete ramsize in gd->ram_size */
; n7 F3 O  {7 u; V  ~1 j: X        gd->ram_size = get_ram_size(, A1 |9 }+ I! s4 Y2 u1 H
                        (void *)CONFIG_SYS_SDRAM_BASE,
1 \3 E+ u+ S& m2 ~- f2 m                        CONFIG_MAX_RAM_BANK_SIZE);8 w' L( y7 d! Y8 @8 q- F  r
        return 0;
- f8 w4 X4 x6 ~}2 V' E7 e3 t! Y" \0 `) x: ?

% S0 ~. H# f! g6 Q# M4 y8 |/ W. F
" D1 a  n6 ^  A0 a0 P0 Y. i+ p
' P! N0 F, w5 ?( [- F' ]; Q. q8 E: Q8 x! y! g6 @
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: g1 E  m1 v' g+ I9 [% B
5 G6 M  ]6 n7 o1 O9 L  F% W1 R
& ^! t! T+ h# R* z4 i1 _6 e. m
7 |/ D( E/ O8 i3 ?: y# h5 ~* I
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 09:39 , Processed in 0.037710 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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