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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit  E3 ]; \, }/ r, N  Q/ {
核心板2:DDR2 256M Byte   NAND FLASH 8G bit4 G' U& G& g, v6 o$ A9 W& C$ k
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?, X9 C, D, C" [3 t
/ K8 s3 G* \0 N3 ^' k, Y% t  S
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?* v% {& e  c" I: \9 _

4 F  O1 o2 a" I- a0 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
" }5 Z7 H1 s4 m( X- ^/*
2 d/ o8 E; P% K' |4 A+ b0 V% q2 x- g) `9 t* Check memory range for valid RAM. A simple memory test determines- `8 p6 o0 q5 G. F0 Z
* the actually available RAM size between addresses `base' and
- [1 i( v' W; y$ i, Q6 g; {" U- E* `base + maxsize'.) E5 V' k- n4 }* K: @, C0 W, R
*/7 u. Y+ t: I6 W0 J) z7 l4 u1 u
long get_ram_size(long *base, long maxsize)8 `  r- e( d% [- r
{
- h! k0 R0 }# O- _        volatile long *addr;
& s! q* m* Z3 m" d( [- ~$ |3 _        long           save[32];
, y! r6 U2 o& x# b        long           cnt;" d8 ~: F3 F0 i
        long           val;
5 I: f) R- B% H% B0 o        long           size;
' a9 @, i2 p0 v' R        int            i = 0;/ X3 J9 w, I. f
0 `$ i5 L3 Q  R
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
! G: |; _+ z  P5 q                addr = base + cnt;        /* pointer arith! */
; r/ [; c6 j0 ]9 w7 o                sync ();
0 u7 W  i6 W7 b3 m                save[i++] = *addr;
- H; j5 u; B( q; S" f. y# V                sync ();
2 J5 |% {) C7 g: v                *addr = ~cnt;
5 u4 A# ]' M# v; f+ e! y+ }; R        }: ~4 b9 P7 u) q

* D! T/ U0 z6 a3 N8 Y        addr = base;
8 D% z" [* I' L. B        sync ();
" A; R  K' C' F. _; U4 ?8 ^) `/ C        save = *addr;
6 ?9 e9 N- a, a" ?2 F' Y, ?        sync ();' }" T/ V8 X. R1 F& Y/ w( H- J
        *addr = 0;3 Z- Z; _8 Q7 x

! _/ B/ e. t2 Q% G2 `+ A9 o        sync ();" D# ^. z$ n" p
        if ((val = *addr) != 0) {
( h  B& J- L4 |" _/ H7 z                /* Restore the original data before leaving the function.7 D0 v' l6 @2 v" i$ y7 u( K5 Q
                 */8 _: P/ [/ |8 O2 X/ f" {
                sync ();2 n) ]; C% H1 P% n0 r: \" E
                *addr = save;
3 s8 F( D+ [# c2 x                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {: |+ q" g$ W8 q1 n4 X: Z5 D
                        addr  = base + cnt;
7 ^. b: D& @4 |9 \# h* F* L                        sync ();4 }' E0 o1 Q, b3 ]4 n* Z
                        *addr = save[--i];
5 r0 J) w# J$ X5 e                }
7 L+ M# k- z. X% a+ s                return (0);9 L8 }4 `( {* k
        }" V1 i& Y9 y' x
! o) U0 J# q6 Q5 l/ y
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {5 q1 W; u- q$ m! X1 E* ^* x
                addr = base + cnt;        /* pointer arith! */
& l9 E) r6 S6 u0 Q                val = *addr;# L2 _: h$ H/ l- R) L* q7 k3 W$ W
                *addr = save[--i];
! O* n3 \4 \4 ~                if (val != ~cnt) {
# R& D( ]7 l" S/ a' U- t& |  Z1 t                        size = cnt * sizeof (long);, C- Z5 w( W* c) F* ^
                        /* Restore the original data before leaving the function.7 j# a9 R( ^" }, {
                         */7 E2 p/ z0 _/ f7 u0 T
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
+ u8 a3 D; T3 g. r2 R- n/ ~                                addr  = base + cnt;9 e7 x. N, B9 M' U4 h% _* c/ W
                                *addr = save[--i];
$ \$ U# y- O6 h+ }                        }
  \: Q* i1 R8 P                        return (size);
: T$ B1 t; D5 e8 g0 P                }0 n, C% m3 l  D# g7 k+ X- e! [$ ~) z
        }
- E1 V: k! n) e9 A2 i" Y; R/ o* e% J: W' E/ ?
        return (maxsize);
( e5 j4 c! B% C: U8 `7 I7 Y5 N' }}
3 M2 M! {5 b8 sint dram_init(void)
/ c# O5 |# w) N7 ~9 }1 i{
( j8 h, y  }. V' e' A3 L1 R        /* dram_init must store complete ramsize in gd->ram_size */
2 L1 p( j" @$ M6 Z        gd->ram_size = get_ram_size(* Y" \: C) A) e' X$ M2 ~
                        (void *)CONFIG_SYS_SDRAM_BASE,& z5 |$ q) d; {
                        CONFIG_MAX_RAM_BANK_SIZE);$ e. A8 B, K# S( y
        return 0;: n- K/ F  z  h9 F5 \
}
+ Y- [: ^+ g" D; ~* D1 o/ e
# R: h  O; L1 m4 X
" |6 ]2 e8 l" k: {* m& Z- ]
6 X% B5 O5 m' G" l3 }7 `& F2 ^! `. i5 }1 [- f
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!: p* k5 }. ?1 @3 F9 Z) u
% E1 y5 g( i& x- j$ F

4 l2 D/ Z, c. [# ~

3 Y3 C2 N0 s8 i) a, r+ W
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 21:46 , Processed in 0.044206 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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