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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit1 K& h$ L; R8 O
核心板2:DDR2 256M Byte   NAND FLASH 8G bit% E  G7 p# \  b, a" |
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
1 \' t- k# w3 F; G; @& a
# A# J% H$ p/ g$ E是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?: j- d( p8 ~* j! A6 f) x% \9 c5 e5 i
% [2 E0 P( S. v- j& x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
+ N  f( N+ R- B/ x! ?/*
5 S4 a3 f7 @. w+ M$ U5 B( R* Check memory range for valid RAM. A simple memory test determines$ T/ J; |" b0 i4 c- R- |
* the actually available RAM size between addresses `base' and9 s. ?; ?+ H5 ^; T) u3 H
* `base + maxsize'.# G3 \- u2 [, S% j, ]1 j2 ~
*/% q$ F7 D' V8 L5 {% L
long get_ram_size(long *base, long maxsize)
7 N$ r' U+ O1 n6 }0 ~{
$ h; s5 t$ S% h  g/ ~& y" d! X$ e        volatile long *addr;
0 W% D/ ^% O4 J1 Q# u        long           save[32];* t1 ?! g* Z: c& [' W9 r( M$ n+ E
        long           cnt;
  Y. R9 G  K9 d! u9 o+ l        long           val;
# Y2 h, z: b- I+ t2 m7 m' I        long           size;# u" I8 ^, `, G: Q- M
        int            i = 0;
7 i+ i$ T- D) r% i: Z
3 B, C" x4 u. b/ S& e        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {) o3 T3 Y- Q- }* u
                addr = base + cnt;        /* pointer arith! */# z# e% g4 _8 F: {
                sync ();* p- q, B! K7 k8 q7 v) u6 K) o7 J
                save[i++] = *addr;, _1 B7 ]9 A' d/ W- G
                sync ();
1 B- U' D0 F; N" f# Y& H# {6 V                *addr = ~cnt;
- O* }9 z! K- W6 q7 r+ v6 ~) l% Q        }5 t# @- H8 C9 {& _
- c! r# w2 v; D0 a; Q8 S
        addr = base;/ \6 i# ^1 r$ B4 f/ v) b9 W, Z9 \
        sync ();5 M& K! C5 b2 q9 l
        save = *addr;  e2 W. ?3 R* w2 g. f$ A4 }
        sync ();% ^3 J6 u0 o3 i# A5 P5 j3 F
        *addr = 0;
) M1 K2 g7 s  G% E- X$ y
0 q1 k4 M# J- W        sync ();
% y0 f3 v- q5 ?8 k1 K        if ((val = *addr) != 0) {
" P  n# K6 V$ E- z                /* Restore the original data before leaving the function.
' t4 r( m7 N% M. \                 */
- c8 E. Y( {# s4 d) M3 u                sync ();
7 A0 J4 G. n1 C0 s                *addr = save;
- c3 R7 A5 x+ B7 `                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
4 m3 A9 |2 m( M9 W                        addr  = base + cnt;
  j8 Z9 M! s, ]  r( y! H- y7 a2 O                        sync ();$ F) I8 @( {6 L- A4 `
                        *addr = save[--i];
! L0 M) l4 T/ ]4 f$ B                }- J3 }) w" K+ y! X6 q
                return (0);: ]/ B5 j9 M6 D& N. `7 ~* w- {" n
        }
5 {4 {& K9 g3 ]2 i( H
# _  X1 d1 v$ G% I. K  J        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
, _! `5 ~5 q" W$ y- W                addr = base + cnt;        /* pointer arith! */$ g& E3 b5 K  H5 J$ q* r8 S8 P
                val = *addr;
0 j& `" s# z9 t6 O3 x                *addr = save[--i];( D9 v0 E( U8 v* F; y
                if (val != ~cnt) {7 \: h+ F9 P1 L' Y
                        size = cnt * sizeof (long);
* k; P/ Z# c9 u7 v6 I                        /* Restore the original data before leaving the function.: m) j  k0 N( Z/ O
                         */
* s8 @2 A9 L5 ]0 ?3 y                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% w  w) K' N. p$ L7 \  u4 g                                addr  = base + cnt;4 m) J0 I2 Y, N4 w0 J/ l) h
                                *addr = save[--i];) w( G0 {! E# C1 D  z
                        }
4 H1 A; k6 S& M- E( ~0 g                        return (size);3 f/ h8 N: `' }6 `* q
                }
9 ]% d$ y1 P- q2 o3 n  U        }/ x, B- j) j! _3 [* N
' w0 |+ ~: W  D0 S# ?: o0 H
        return (maxsize);
- C/ F( ]0 @! {( I* F}$ M0 f" [0 @9 {0 j9 U+ Q* p( e
int dram_init(void)$ L- u* L, r' Q. T
{7 ~8 k5 N7 S& A+ B. D8 d7 L
        /* dram_init must store complete ramsize in gd->ram_size */
9 @6 A$ X9 R4 i3 |" K5 }* ^        gd->ram_size = get_ram_size(
0 |; a! L+ z8 Y7 h- J/ J  L# v                        (void *)CONFIG_SYS_SDRAM_BASE,5 i0 s; ?! d/ e
                        CONFIG_MAX_RAM_BANK_SIZE);1 f4 ~* m2 F' R0 N$ G3 N  N
        return 0;3 J9 L2 x8 j4 }
}
! d. r2 i8 ~$ T0 Y9 o) u
" x7 F4 E0 h! A, ~4 f7 G
# p4 ^  ~* d; ?4 d/ U! E5 d9 B( T
6 i6 G, o0 l& q6 u0 P" V( L6 B6 S3 t1 l: _0 v2 E6 a
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
  n2 l3 l& [, S0 B- J5 S' Z
, J' a4 i+ Y5 r: }. Y' d9 T
- e' l& `% X5 P* @# U/ T

! k* v1 \2 J6 d; T
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 06:10 , Processed in 0.035371 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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