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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
/ {- P! c( W' g! D1 m核心板2:DDR2 256M Byte   NAND FLASH 8G bit; b' c/ R/ t: n
这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?. ~, U6 v. o+ F" x; y4 t

1 l* E8 W( `% [; S* N是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?
4 S: b, J, B/ x1 O" @! C6 O* T2 Q- Z+ G& D+ j) b% v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:, E. X# Z) R6 S
/*
: C: d% P/ P) O! L9 d6 ~* Check memory range for valid RAM. A simple memory test determines- j! [  p/ n) E. K# k& p( D
* the actually available RAM size between addresses `base' and
, ^- i% [5 A; [. R2 ~* `base + maxsize'.
9 c8 Z  D# a' M8 A*/0 ^5 S5 j/ k3 J6 d8 ^- q  ]5 o3 D" h
long get_ram_size(long *base, long maxsize)! T% h9 k# e4 k8 O, S
{
2 {, x! I3 ~- I7 X4 L+ r5 u        volatile long *addr;
* R3 G9 Z& {+ o" l7 F6 W        long           save[32];+ C$ d& E6 E% D- K* Y3 ]8 c
        long           cnt;
& F& T  l) o! P7 M' ~6 Z- p% n0 F        long           val;+ ]; E; T/ C* \, o
        long           size;
: i2 e% }* `$ e" ~3 @        int            i = 0;
, g0 x9 x4 m" q( V. b; q4 N7 ~( e7 F8 g8 O0 D9 Q& G
        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {5 h" E" C6 d% W' b
                addr = base + cnt;        /* pointer arith! */
& J3 n6 V7 F' B3 [                sync ();6 t& j6 f+ K3 V4 Q. n
                save[i++] = *addr;
: n6 s" R/ v" g7 n1 P                sync ();
' y! Y1 ~% {5 X                *addr = ~cnt;  U8 ?# r$ v- e9 w2 o1 I
        }
5 i& Q" n5 L6 ]" U) ^) {' z% b9 i
8 G* f4 r# C, L5 u$ L& }- N        addr = base;
; n8 P6 |# z# V3 D  I# @7 I3 \        sync ();
% u1 ^# M/ g4 |        save = *addr;- D* C: f) B7 r/ s9 T% K- |
        sync ();
( U% T# r  L* L. j/ d        *addr = 0;
0 m/ x! _4 T5 h. `9 L- R7 i
8 \/ I, m7 g! `2 W        sync ();
/ Q2 r6 M1 q) Y8 a+ I4 q  _        if ((val = *addr) != 0) {1 g* a3 ^2 W" f1 a
                /* Restore the original data before leaving the function.* Y/ W$ c1 j' d, O8 i! j
                 */
; l4 c. Z- s2 A5 E! v                sync ();2 y5 c$ E1 Q$ S( o7 N7 X
                *addr = save;
; H) A1 `0 W1 p' `* J/ H8 }( _                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {
+ t5 ]. ]1 i+ [6 h9 a/ h. A# g                        addr  = base + cnt;
5 S9 w+ i* g( i( u& y2 O5 z                        sync ();; B9 j# U2 c3 n# o$ N2 m: T
                        *addr = save[--i];- b# C$ ~. [# c" y8 }5 ^
                }
" l$ y$ N4 O' v                return (0);" I* ~7 t6 u$ q- Q+ k; W2 B* F
        }
8 R" L) i: f; @" v! v- z) F/ `# t2 }. A
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
% y" w+ x6 L8 G; V( W                addr = base + cnt;        /* pointer arith! */
3 g% k: U" o: z# G; v& H                val = *addr;
0 J1 ~$ K# h, w# r! q3 `( W5 s                *addr = save[--i];
; w8 _7 k/ Q9 Z4 ]! Q  i                if (val != ~cnt) {6 G5 E/ p" {. C4 R) u; b
                        size = cnt * sizeof (long);
1 a1 E" m. d! C' E0 S3 d                        /* Restore the original data before leaving the function.0 R( D+ i+ D( [; B" O* D# q
                         */) h2 h! \! Y% Z  R  J/ W+ [
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {; ~/ l* T6 y- w; I9 J: f8 b9 c: P( R
                                addr  = base + cnt;
, W8 B. N: A) r" h+ [$ ^0 h; k/ ?                                *addr = save[--i];
! k( e4 x# N0 \                        }$ d& n$ C! L$ {( W( X5 Q( X( w
                        return (size);
# J% F2 ~) L1 Y  o5 W: j, `& k                }
) b$ x: r# ]) X! |        }
: n; Q/ ]8 h- l9 j6 t7 w
6 f- o6 V7 W9 f: y; R: ?        return (maxsize);
9 i9 ^& n/ x' U) \1 \0 O}
& _$ O2 c+ c# S: rint dram_init(void)3 h- g# s# Q& \5 s8 n8 ?
{
# S3 L& v& X% R  ^        /* dram_init must store complete ramsize in gd->ram_size */
' J8 Z) \5 i% C+ l4 p        gd->ram_size = get_ram_size(
4 I: O, u/ F8 H9 {+ j2 h4 b6 o                        (void *)CONFIG_SYS_SDRAM_BASE,8 k. H/ J) `  p, {+ M$ l1 h/ `
                        CONFIG_MAX_RAM_BANK_SIZE);
7 o* u. @$ m6 F/ N- m" E        return 0;* R# N2 D( l' Y
}- z- G. T, I' a6 x- ~5 j5 R
7 t3 |" m! R* t" y: p* ^

1 D: }6 i2 }% R5 Z8 L' H8 @
! d" @/ r0 M0 @2 R7 U, z
3 |: O/ D( g! F' }3 O5 V3 bFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!3 E. J; J8 m; S% w
+ S1 D# J3 K) X& `5 H; s, N
5 W( K. S. x" R- \( L1 n* B

6 A$ L: `! ?# s4 y! P) b$ Q3 x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 09:37 , Processed in 0.048581 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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