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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit' @4 c! j: R& c$ [+ Z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit8 c& d0 y8 S* Q  A: ^. P* g# O
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?( f! W* p& x2 P4 C+ o" ?
/ A7 q/ V% p/ R! {, K6 P( [
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
3 w% y. N7 s$ |  w0 E9 x9 J7 h" e1 u- A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
( c: c3 D5 I9 e& u6 R; r/*
+ {" x# n6 w$ v7 x: m  e8 m* Check memory range for valid RAM. A simple memory test determines' J4 p" {6 O; k1 _& V1 Y( ~
* the actually available RAM size between addresses `base' and/ i7 j. u$ l" i( Q* K- y  c; q
* `base + maxsize'.
: a- `5 I( V+ \" k3 X! J*/" `* K, x6 A7 \7 X0 a5 W
long get_ram_size(long *base, long maxsize)* g( J5 x$ l! t1 V, k
{' o/ \1 C( F8 R" \6 f8 A% {& X
        volatile long *addr;* h+ B( O2 A4 m' }- C
        long           save[32];. O; Z& x7 o" l
        long           cnt;
0 s5 `# _6 e# P; u1 z4 ?        long           val;
4 ^4 r+ F4 k" O        long           size;
$ A7 B! V$ I% {$ W3 Y1 h3 f. c        int            i = 0;
* H7 _# U, o7 U, ~2 t/ O8 y8 H* a, V3 I' x# j$ G9 T
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
/ C) a6 @8 M2 @1 c7 Q* R$ b                addr = base + cnt;        /* pointer arith! */+ d1 |# q/ [( H" c
                sync ();/ P1 |9 J' ?& M  c7 ^! E
                save[i++] = *addr;: b/ C- R. D+ Z- O% m8 [
                sync ();
1 y2 K& w* I4 ~6 C' C, b( Y                *addr = ~cnt;
: U9 e2 V7 X* G. m) P! a        }5 C! n& g/ {8 u' H5 C
1 W! y. i, k9 z5 }: P
        addr = base;/ P+ S  \  h: \  K1 x# E
        sync ();
& P/ L  o0 U- N' G- {5 }, i$ }6 d        save = *addr;% @( H0 a( f' ], W. Q* Q
        sync ();: z2 O% r* U2 l* q& j
        *addr = 0;
5 j" x8 O& V" k8 I% F
& e  N3 B. d) N& m4 s1 {        sync ();
9 }; _; G7 ]9 O+ g        if ((val = *addr) != 0) {
/ B$ f/ g- l% E2 u$ o4 g5 t                /* Restore the original data before leaving the function.
; r) s) p* f; g8 K& p                 */
7 z; N, y. C7 ?/ b' q! G7 y5 }2 [6 [                sync ();
' \( x2 U" B' L' s* k4 l# g                *addr = save;
0 a0 r- s0 J* h: Y# u2 y, E% i; p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {0 f1 J& P' L3 b9 C3 G" \  y
                        addr  = base + cnt;. ~0 q( U+ V  O! J) ?/ C- n4 p) v& z% Y
                        sync ();) @0 a$ T7 s$ b$ J8 `5 \) D) P
                        *addr = save[--i];: g$ S8 j& ~9 ?0 W7 }3 C7 [
                }
5 A5 A. Y# ]% R5 b. I                return (0);% F' ^# b  p; [. F
        }
; p6 J0 C, u( E) `
; p+ L. Z/ M) ?, l% E6 b4 c        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {$ c% ], O' C" a$ J6 ^6 T0 e
                addr = base + cnt;        /* pointer arith! */: A/ u, G! h( N$ c9 c) }/ K8 F- ^
                val = *addr;& A6 M3 i& b$ ?* A
                *addr = save[--i];
* P1 j- L/ X. ]+ F- I8 W) \2 w                if (val != ~cnt) {+ I2 o0 p9 F. H. T* m
                        size = cnt * sizeof (long);
8 D# C- R: d; k3 D/ T# K6 @9 d( `7 n                        /* Restore the original data before leaving the function.
* p9 M7 i5 j7 ?* p9 g: a                         */: ^/ m$ E8 ?! _, `& Z' Y
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {% M+ J/ W# q" F) F# N: E/ e
                                addr  = base + cnt;
% ~- j: E9 T9 i6 o0 X                                *addr = save[--i];) D4 g/ R0 _# n( P
                        }
% ~" N6 x2 B& W- ~  z% o                        return (size);
; o# B9 X. f) H% g                }9 K- }1 v+ ?5 q& {/ E( ^
        }; I6 S# Y4 V. z$ Y) _4 I: `5 y

6 M" H$ @: t: X" {        return (maxsize);9 b6 c. `0 g9 k6 w" a& Y
}- p: b: m1 C$ }
int dram_init(void)
& v! V3 i: }8 S$ ~{
5 s6 {' [1 y5 @$ q2 ~3 D        /* dram_init must store complete ramsize in gd->ram_size */
0 ]- `: g6 {, S/ H* b        gd->ram_size = get_ram_size(3 R# V4 l3 Q( |* a( P1 W
                        (void *)CONFIG_SYS_SDRAM_BASE,3 K$ g* f, y) D4 b. A
                        CONFIG_MAX_RAM_BANK_SIZE);
, t) {0 v3 n8 h! \- j0 u' B        return 0;/ y0 H! y% ?; Q/ J; F1 [3 D6 d
}
% n5 t* q. F* k- v- P2 ~; w7 r+ T7 t7 \7 h+ k
" c2 E( l+ |: J7 `' W
' Y1 ~& p! ^# m/ N5 p, ~' b& `
' g; n# B& k. f8 [! X2 |" B8 s( T
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& |2 Y1 ?( ~' i# C5 M1 P
9 F8 x9 z5 ~# m
5 f6 G$ e. ]( Q) b9 a

# X9 m& g+ t: y5 V7 h' Q
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-24 09:32 , Processed in 0.037516 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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