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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
跳转到指定楼层
楼主
发表于 2014-9-11 09:33:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
核心板1:DDR2 128M Byte   NAND FLASH 4G bit
4 L) Z6 e1 a0 w核心板2:DDR2 256M Byte   NAND FLASH 8G bit
. f, L  v9 s$ h% Y# E( P  `; X这两个核心板公共一个uboot,DDR2的配置肯定是不同的,uboot怎么检查到是哪个核心板,然后去执行相应的配置呢?
- t1 I& J5 \0 t& Y2 N2 u0 K# ?
是不是通过读NAND FLASH的ID,两款核心板NAND FLASH不同,ID也不同,这样读到了ID就知道是哪个核心板了?1 I) O4 ?6 G- }; W0 p- [% s7 O! w" K

- v, R9 Z! {5 {1 ~2 H. m' e6 |0 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

14

主题

102

帖子

821

积分

创龙

Rank: 8Rank: 8

积分
821
沙发
发表于 2014-9-11 18:55:41 | 只看该作者
DDR通过检查最大有效地址来识别容量,具体请看uboot的common/memsize.c文件中的检查代码,也可以看如下:
8 g: T" i+ S# @, C/*
. Y8 ~  g8 Q0 P1 \, n5 y! n* Check memory range for valid RAM. A simple memory test determines' ~) T$ A' P! o+ W1 ?
* the actually available RAM size between addresses `base' and- ~. N1 N* o7 J1 p4 I* W, Z1 m7 z
* `base + maxsize'.
8 D2 w: M) q& m4 O( i3 i0 e*/
. r% H9 X' i' w& n9 g  N* ^long get_ram_size(long *base, long maxsize)4 p* t- ?/ P3 c4 |0 ?3 t
{
! |7 g: `2 o% c3 p5 X/ ?" \        volatile long *addr;% l& @! A+ H4 q: S4 m! @
        long           save[32];6 a2 H0 d3 S9 v! E" X
        long           cnt;0 a4 U5 n) l5 U, N* |
        long           val;; Z8 F! P- O( Z8 w, C
        long           size;  l) O) x% b( b  E
        int            i = 0;
5 i( J0 e8 [7 q, y6 }5 D7 g
/ r6 G( e& I2 A; l4 L& b" G! y7 J        for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) {0 J$ ~. e* \, X
                addr = base + cnt;        /* pointer arith! */
( g/ p5 u; ^9 x4 v" s% q! m* Q& ?                sync ();
7 f+ Q, y) v% H" P0 e/ D1 U4 V- G" q                save[i++] = *addr;
& y4 z. z! g; Z, k# A, o                sync ();
% b+ S4 A9 _% ?# v7 J                *addr = ~cnt;
( u% S4 G. P1 q4 P9 G! z        }  B5 I2 O) O! F0 x' |- b

( P, I# X% ?+ b; |) Z- y3 Z        addr = base;5 G- K% e* ^, j% v7 E2 `) E* z0 ~, W
        sync ();0 G* Z1 S+ o& Z
        save = *addr;
: Y: n. X( t* o% G( Z        sync ();$ U( e* a' Y/ v9 M2 l
        *addr = 0;
7 f' x# i# Q" Z( d/ Q8 `
; Y' ]- @. q9 Q$ E        sync ();& g" N5 i6 U/ d
        if ((val = *addr) != 0) {
4 k7 M9 F' e# m, `5 s  z0 T$ _                /* Restore the original data before leaving the function.
6 F! ~; F% ^# R# ~1 d. e1 G                 */
/ l& n  c* h' \" w0 j) Y* M' ~+ P                sync ();
- M0 ^' C3 u" [  d2 P$ }4 [! e                *addr = save;. A, d1 K7 u! |+ Z
                for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) {" P/ z* `+ ^2 P# g( a4 |; B3 _
                        addr  = base + cnt;6 d8 S# T9 k) e9 l1 X
                        sync ();3 B4 M. a8 U+ E  U5 i' O/ X/ @* e
                        *addr = save[--i];
4 I4 M$ I5 n8 z6 O- j                }9 ?. I# \3 @, O! V/ {% n
                return (0);1 j# L) {# x! i' ?. [7 i
        }5 ^7 I% y7 o% f
; ~3 K; `, A8 f' o$ u
        for (cnt = 1; cnt < maxsize / sizeof (long); cnt <<= 1) {
: A% k) p$ x$ a5 z# {0 t* c                addr = base + cnt;        /* pointer arith! */
8 J0 G4 G* h, Y0 }0 E8 p. m  G% K* ?                val = *addr;
1 E5 d8 U; `9 ?; F$ Y2 x                *addr = save[--i];
- n$ z  O) y, B% @3 a; k6 Z                if (val != ~cnt) {
/ F7 B2 b: n2 J8 o6 i9 w; O                        size = cnt * sizeof (long);5 f; O1 t2 a3 q
                        /* Restore the original data before leaving the function.7 I! d  `  k! k  V
                         */  a3 w+ P% ]: t/ N$ z
                        for (cnt <<= 1; cnt < maxsize / sizeof (long); cnt <<= 1) {" l$ ^$ ^9 ]5 s' r1 J+ C7 J
                                addr  = base + cnt;
- s( K$ c1 \1 ?) W- U9 z                                *addr = save[--i];
. W6 X9 s  a  \; P                        }" i# X# C! B& M& y
                        return (size);  p1 X( s* [' p+ b; N3 h5 [* Z
                }3 _/ ^8 e9 r3 u6 z
        }
4 ]; t2 P) p; c; [; E$ U/ U* q" R2 G+ a& e9 {$ M! k8 i% S# [
        return (maxsize);
" U. k( w6 k/ E}5 u8 }' N$ k0 h* x) V/ O
int dram_init(void)
$ E+ h5 V6 x5 o{- }& z: M, c9 n4 e# E5 ?; p
        /* dram_init must store complete ramsize in gd->ram_size */# F, V# @7 d( ^5 e: ]* O1 R
        gd->ram_size = get_ram_size(4 S8 n2 }& d5 s4 }- j! O* I
                        (void *)CONFIG_SYS_SDRAM_BASE,
4 E7 e2 ]6 g5 j0 C/ j  G                        CONFIG_MAX_RAM_BANK_SIZE);0 A* c& J' v( f) d
        return 0;7 N7 _- |9 j" K+ G% f0 l
}
9 ~- n- s% E0 a
4 B) c5 M8 X8 A: V3 x) s" q3 i$ I7 o' s  S4 O2 T+ H
' T  e  u1 n7 q9 F+ V; w

5 c! I! v6 {4 IFLASH是通过检查FLASH内部的ID识别容量,希望对您有帮助!
$ f/ g. B. K7 Z  o, q1 V8 p0 W; i) e7 Y) Y2 \1 ]2 r
$ _4 B5 \) l, ?8 n
, {# z% z- f9 H4 P
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 03:32 , Processed in 0.041016 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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