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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit* O6 u+ r6 a4 @6 ?
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
9 D$ s7 t4 V; O  x/ w% }这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?7 q* D/ ]# w2 e6 s# `6 B, P
3 h% d2 G& W) O2 y4 n6 v
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
0 l9 \- y7 R, Y* Z1 n; L) m
& l) D+ X2 ^$ M- l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
/ N% }) n% k- ~/*
! T8 |/ o! i' V3 F, c: ~- `5 M* Check memory range for valid RAM. A simple memory test determines
( c4 _0 X0 P( R4 ^  r7 h* the actually available RAM size between addresses `base' and4 J8 j) t* _4 l$ l+ M
* `base + maxsize'.! Y  o: F; o. `$ k
*/
6 k3 \2 Y3 l" p( V' h* D+ ulong get_ram_size(long *base, long maxsize)9 T! R" r- R' R  y9 n& n
{/ r( o) ]" t$ d" `: K; O0 i
        volatile long *addr;
- J! j5 s% ?4 j2 ^0 w        long           save[32];9 d  i" n+ H$ W" `
        long           cnt;
& E$ J' ~4 M& ^5 e$ K        long           val;
; S! Z' [  q6 p# i        long           size;9 s( v, D* U/ Y+ ]( r$ z# }3 v
        int            i = 0;
3 e% f6 U# W( G5 I' V! |' @* Y, S# C( Z; h* ?9 \* v, D
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {+ K" M6 V; X  `7 k3 f8 E
                addr = base + cnt;        /* pointer arith! */# y2 H+ `  n( s  d7 Z3 I  Q
                sync ();
4 i  `8 L1 K, R5 E                save[i++] = *addr;& R2 O# F" V. O: y/ Y4 B+ S
                sync ();
9 z* [  i  a* Y: O* v8 o5 e( {                *addr = ~cnt;
8 q2 \% m5 v$ P7 C+ X- ^, i        }' j7 H) {# M  N% i. g

  ?+ E# O* m8 o/ X" }* d" z        addr = base;; t2 z4 u# S: U' A# h/ |
        sync ();0 N: p2 R) d- a" p2 e; C1 u* p
        save = *addr;7 E- T' @, c! y: Z: [) H8 d
        sync ();# l. c/ W( f1 j" A. C
        *addr = 0;! y! c) i- M0 v% h6 ?# r/ H9 I& C
; ~! @2 G; g3 G3 ?! U( y9 c+ T
        sync ();: V. d  Z# e' l! f% N
        if ((val = *addr) != 0) {: a6 z: D6 h- ]3 p2 o, i6 b1 B$ F
                /* Restore the original data before leaving the function.5 T( W) Y! @  O5 a$ y9 D
                 */2 J1 k$ t2 b3 o+ u, R1 I( V" W: ]9 y
                sync ();2 W4 O) Y+ D  S, _# ~7 s8 G6 u
                *addr = save;
. J$ U- u7 E) M& P* P                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
* o% j) Q0 G0 a6 b                        addr  = base + cnt;
+ U6 a" C0 z% }2 o# A, O/ ]& J                        sync ();: Y3 \* v% b* c. I7 d. z2 F
                        *addr = save[--i];
/ R; Q& O3 K$ e2 _2 Q                }1 N: ^. B/ V0 s/ w6 n2 g+ t# S
                return (0);3 Z' e, U& `0 u0 e8 u7 E. L( X
        }$ ?" ?3 _. `# W- _+ I
- }8 c/ w2 E/ N! {  N, X6 g7 P
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% R% j4 Z  f6 \7 `                addr = base + cnt;        /* pointer arith! */6 }+ x5 g- C& T! R( z6 k
                val = *addr;1 u% Q' U* v8 @* ?6 l
                *addr = save[--i];1 i3 }- S8 V1 z9 r$ j
                if (val != ~cnt) {- A7 k0 ^. K) o4 y* t9 q
                        size = cnt * sizeof (long);
& V) v9 U$ P  H                        /* Restore the original data before leaving the function.
7 L" `9 f: R" W) j& P  ^                         */1 T0 B+ n% S* Z" ~$ ]7 F3 a
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
5 l6 v5 }- @' c$ ]- N! K                                addr  = base + cnt;
4 g# J  O' w9 [( c                                *addr = save[--i];! e8 {  ?& T( `- I. K  _0 u  O0 G
                        }5 l3 _! H6 o* @& X9 c0 N
                        return (size);
3 g: \3 t8 T/ w5 p; n/ G/ H8 f                }
/ d. X+ E" R* s( S6 |& B- K        }
; ~8 @" \! }8 {' o8 u$ W$ h2 J
. a4 E2 B* t) ^8 r' `        return (maxsize);
: n8 U8 x5 B+ A; C3 H' w5 m}) O" P: U. k5 Q5 ]; u" U+ C1 C
int dram_init(void)
- s3 @! O5 M0 T- E4 M1 e$ Z8 _{
" [9 ?' u1 x" _) M6 `5 B/ m2 {: U        /* dram_init must store complete ramsize in gd->ram_size */5 A; @- |1 {) P3 o
        gd->ram_size = get_ram_size(7 i7 u, U3 y7 Y2 B9 N2 i" s
                        (void *)CONFIG_SYS_SDRAM_BASE,
9 m& b3 d  Y4 m6 n: ~7 k4 W0 G                        CONFIG_MAX_RAM_BANK_SIZE);
: b! V/ T' g5 a& |        return 0;
/ F' D* U9 M. r" h; j! @3 u* w}
# k0 `; e. h# [& v# Y5 r9 I2 g3 X4 I7 G& T9 @/ y7 }# p! F

9 D/ E; s# _! d8 n0 g+ H
, g  g9 b+ t: a% u; j( g8 `+ Y; ?  {
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!, g) _" J7 [! ]  N  s; C
. ~) l* X5 }+ ?8 S6 X
' k8 L( h+ o  [7 t% z( D
) m( f7 z& b2 p9 S3 r3 u
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-25 04:39 , Processed in 0.039414 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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