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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit+ K2 w7 _0 x0 L; f1 z
核心板2:DDR2 256M Byte   NAND FLASH 8G bit
5 J2 O7 `+ K2 r这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. \7 A; o8 B4 S5 q/ ]8 t* a0 o

+ y  i# O. X; e" J) ?; G% V: O) k是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
# S$ k/ n( L! a2 U- k& Z& V& p+ |: f0 i: b5 B) K- I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:( Z# y+ V5 `) u) }% i7 l7 A
/*
$ f6 T6 n7 P% r  S* Check memory range for valid RAM. A simple memory test determines
9 Q+ y) c4 I3 M! e  x' }6 ]* the actually available RAM size between addresses `base' and
  [9 o( @% O" J4 c) ]5 `* `base + maxsize'.! f: y, [8 H% K* T. J& Z$ S+ C
*/5 z; }8 _7 X# v. J
long get_ram_size(long *base, long maxsize)
9 O2 H) p/ Z$ H8 e0 R{
" Y* J1 @1 ]6 u" F+ y8 d0 V, q' M        volatile long *addr;
5 X' {9 Q8 [. o        long           save[32];! n: {. T% S6 T8 u' \
        long           cnt;
# c  R. A  x: p, b! j- F        long           val;7 j" z8 T1 T0 `; I. a, B
        long           size;. p; x9 `- p" }% ?, e$ U
        int            i = 0;
2 q3 C2 T! p# q* l7 {2 o$ W0 {6 h9 s) Z0 @& H; `
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {
' N; C1 u3 @( J- n; l) q0 S, R                addr = base + cnt;        /* pointer arith! */
  @$ ~1 L. X8 i1 P% s2 w                sync ();
, b1 N% y2 v: W! Z" {! H5 w% H                save[i++] = *addr;" h& O3 g$ U5 l
                sync ();$ p% m# N0 p) B0 R1 Z- c
                *addr = ~cnt;
- ?8 G; }9 i' T7 L' x* S        }
0 @/ ^8 l( @; ?. N; u
" i# E1 N0 _! z6 Y9 U+ N        addr = base;
) o' W+ P' ^; F' t3 ~! m" ?        sync ();1 e& ^0 F6 e: \! K
        save = *addr;: k, j" s; _9 |9 U$ e6 B% {! ?
        sync ();
0 u" S' U, `7 o* U        *addr = 0;
$ ^( z/ b+ M5 T: \6 d( J" U' G) |4 r' i8 M' d
        sync ();
& J+ B7 u7 s. }+ g( r/ [        if ((val = *addr) != 0) {
' g: ~. a1 [' m                /* Restore the original data before leaving the function.6 l2 J0 D- Q! h- O+ b
                 */
; O4 h2 R/ U. R9 _& P2 C+ l2 b3 w                sync ();, e9 k/ F* H8 `2 I/ K
                *addr = save;
9 a+ [' @3 u- N# U" K2 z% }7 p                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {/ M6 G: w- b+ b+ J3 D
                        addr  = base + cnt;
" }9 O& ?1 Z9 N# \  q" \# R, _                        sync ();
2 [; q( L8 R4 Y- l# f                        *addr = save[--i];7 n9 H# Y$ J" u+ v5 s9 G/ S; C
                }# C1 H1 b8 L2 ^2 h, F
                return (0);
8 H3 g9 A2 @! N, Z( `/ j        }* I9 n/ ?0 K8 l& O' X' L: H

4 ~$ w5 H0 R. \        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
7 P: R8 A  h1 E( F                addr = base + cnt;        /* pointer arith! */
. Y9 U+ k: U* d) y- Q                val = *addr;4 w2 c  I4 q) S
                *addr = save[--i];  ~# B; z" C( w
                if (val != ~cnt) {
9 t: v2 H8 `8 f& |6 i* v                        size = cnt * sizeof (long);
* M( E7 l& e  Z                        /* Restore the original data before leaving the function.
4 ~2 k% z0 ^- f7 u3 K                         */
' j% J. D& V1 O% Y: J- g                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {/ L+ M( p; R2 v% z4 c) C
                                addr  = base + cnt;
/ ^2 |9 S- x5 q- h) K9 T                                *addr = save[--i];8 B: ^* R  p3 B! t
                        }+ [" c8 {4 r# a3 b2 O. t& N
                        return (size);
# ?1 K) I) J, [9 z' I                }/ ]3 ?0 q; x3 M1 q8 Q* D9 m
        }
1 I7 ]- _8 ~, b; z9 e; c0 V0 A/ \* d9 t  L6 g
        return (maxsize);
) T- b9 E' J$ ]1 d1 `- N}
; R5 P8 M0 m) w$ \+ o, ?0 I2 q. _int dram_init(void)1 \7 y8 N" U) {- d, A; k: F
{, V! F# g, q5 U* {5 u
        /* dram_init must store complete ramsize in gd->ram_size */
) p5 U9 O, h4 Q/ {3 ?0 O        gd->ram_size = get_ram_size(9 [/ z3 H! Q. V9 n
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 {3 s( l& L- a7 D2 H                        CONFIG_MAX_RAM_BANK_SIZE);; H  b" m9 ?1 _) ]
        return 0;
, o% [0 h$ L$ ^) c}
6 ~! ~6 q% S; I. ~/ g# q+ s9 z7 J4 K& S

, \, U4 K9 r; f9 `& \' Z9 D$ l, p9 e% J. \% Z
( F. L6 E: q, r, G' t9 J$ [9 ]
FLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!& f! {+ r- Y2 C# }+ t

, g5 E5 W) j2 a% t# B: I  N' b; g& z8 O0 q

/ s" @$ e% a8 y4 s2 r: T, Y
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 22:09 , Processed in 0.037700 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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