tiny4412 裸机程序 七、重定位代码到DRAM

发布者:平章大人最新更新时间:2022-01-15 来源: eefocus关键字:tiny4412  裸机程序  重定位代码  DRAM 手机看文章 扫描二维码
随时随地手机看文章

一、关于DRAM

上一章我们讲解了如何对代码进行重定位,但是将代码重定位到只有256K IRAM中作用不大。

正确的做法是将代码重定位到容量更大的主存中,即DRAM。Exynos4412中有两个独立的DRAM控制器,分别叫DMC0和DMC1。DMC0和DMC1分别支持最大1.5G的DRAM,它们都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的内存设备,支持16/32bit的位宽。DRAM0 对应的地址是0x4000_0000~0xAFFF_FFF共1.5GB,DRAM1 对应的地址是0xA000_000~0x0000_0000共1.5GB。

 

图7-1、DRAM控制地址图

查阅Tiny4412的原理图:

 

图7-2、DRAM电路原理样图

Tiny4412的512M的DRAM是由4片大小为128M的DDR3芯片组合而成(上图仅为其中一片),观察片选引脚可知4片DRAM芯片都是挂接到DMC0处。

如何才能使用DRAM?对应Tiny4412而言,由于它只用到了DMC0,所有我们只需要初始化DMC0和DDR3 DRAM芯片即可,本实验所有的初始化代码全部来自于U-BOOT程序。需要说明一点的,我在写这个裸机程序文档之前,已经看了一段时间U-BOOT程序,U-BOOT程序中对DRAM也做了相应的初始化工作,我就直接拿来用了,在参考学习U-BOOT过程中,我也记录了一份学习文档,里面有比较详细的DRAM初始化说明,等我U-BOOT实验成功后,我会整理一份相应文档。

Linux平台下Mini210S裸机程序开发指南》文档从我现有资料中找到他所说的类似的芯片说明。我只能参考着他的说明,从U-BOOT中找到一个函数,从他那里COPY了一些代码,来实现这个函数。大家先来一遍《linux平台下Mini210S裸机程序开发指南》文档关于此函数的说明 ,我在说一下我是怎么写的这个函数的。

 

经过mem_init函数对DRAM的初始化后,我们就可以拷贝代码到DRAM中然后跳转到DRAM中继续运行了,由BL1目录下的mmc_relocate.c来实现这部分功能,mmc_relocate.c的代码如下:

void copy_code_to_dram(void)

{

unsigned long ch;

void (*BL2)(void);

ch = *(volatile unsigned int *)(0xD0037488);

copy_sd_sd_to_mem copy_bl2 =(copy_sd_sd_to_mem) (*(unsigned int *) (0xD0037F98));

unsigned int ret;

// 通道0

if (ch == 0xEB000000)

{

// 0:channel 0

// 49:源,代码位于扇区49,1 sector = 512 bytes

// 32:长度,拷贝32 sector,既16K

// 0x23E00000:目的,链接地址0x23E00000

ret = copy_bl2(0, 49, 32,(unsigned int*)0x23E00000, 0);

}

// 通道2

else if (ch == 0xEB200000)

{

ret = copy_bl2(2, 49, 32,(unsigned int*)0x23E00000, 0);

}

else

return;

// 跳转到DRAM中

BL2 = (void *)0x23E00000;

(*BL2)();

}

首先我们定义了一个函数指针copy_bl2,将其赋值为0xD0037F98。为什么要这么做,是因为IROM内部固化的代码已经帮我们实现了一类拷贝函数,其中就包括从sd卡拷贝内容到DRAM的函数,这类函数所位于的地址见下图:

 

 

由上图可知,External Copy Function位于0xD0037F80~0xD0038000处,其中sd卡拷贝内容到DRAM的函数就位于地址0xD0037F98,其函数原型如下:

 

其中:

StartBlkAddress:从第几个扇区开始拷贝,一个扇区为512byte

blockSize:拷贝多少个扇区

memoryPtr:拷贝到DRAM的哪个地址上

with_init:是否需要初始化sd卡

有了上面这些知识,也就很容易看懂copy_code_to_dram 函数了。通过读地址0xD0037488上的值来确定是使用通道0还是通道1,芯片手册上明确指出“sd/MMC/eMMC boot – MMC Channel 0 is used for first boot. And Channel 2 is used forSecond boot”,我们的BL1.bin就是first boot,所以会使用通道0,调用CopysdMMCtoMem函数将BL2.bin从sd卡的扇区49拷贝到DRAM的0x23E00000处,拷贝的长度是16K。最后给BL2这个函数指针赋值0x23E0000,然后调用BL2函数即可跳转到0x23E0000处运行BL2.bin里的代码了。

 

大家看明白了,一句话三星的芯片内部已经有一个函数是用为从外部存储COPY东西内部iRAM或者DRAM中了,但是我在现有三星手册上没有找到类似的函数说明,没办法,我们这些学习者,是很难拿全芯片厂商的资料的。但也不是就没有办法实现这个实验了,U-BOOT中总会干这么个事吧,里面肯定有相关代码,所以我只能去分析U-BOOT的代码了,里面有一个文件叫/arch/arm/cpu/armv7/exynos/irom_copy.c的文件,里面的一个函数movi_uboot_copy(),就是将U-BOOT复制到DRAM中的,好了从这里复制必要代码实现自己的函数吧,我们的函数主要内容如下:

下面内容是定义了我们将要使用的COPY函数,这个函数就是实现了Mini210S中的copy_bl2的功能。

#defineISRAM_ADDRESS   0x02020000

#defineSECURE_CONTEXT_BASE 0x02023000

#defineEXTERNAL_FUNC_ADDRESS   (ISRAM_ADDRESS +0x0030)

#defineEXT_eMMC43_BL2_ByCPU_ADDRESS    (EXTERNAL_FUNC_ADDRESS+ 0x4)

#defineMSH_ReadFromFIFO_eMMC_ADDRESS   (EXTERNAL_FUNC_ADDRESS+ 0x14)

#defineMSH_EndBootOp_eMMC_ADDRESS  (EXTERNAL_FUNC_ADDRESS+ 0x18)

#defineLoadImageFromUsb_ADDRESS    (EXTERNAL_FUNC_ADDRESS+ 0x40)

#defineSDMMC_ReadBlocks(uStartBlk, uNumOfBlks, uDstAddr)  

\定义COPY函数的原型。

    (((void(*)(unsigned int, unsigned int,unsigned int*))(*((unsigned int *)EXTERNAL_FUNC_ADDRESS)))(uStartBlk,uNumOfBlks, uDstAddr))

 

下面开始复制代码到DRAM中,首先声明了两个串口输出函数,实现这两个函数是为了调试用的。因为我说过,我现在程序不一定能执行成功,有时LED灯闪烁了,有时又没有。所以我打出了必要东西来调试用,大家也当学习嘛。

externvoid uart_asm_putc(int c);

externvoid uart_asm_putx(int x);

voidcopy_code_to_dram(void)

{

    void (*user_bin)(void);

    //这里怕DRAM没有初始化完成,等待了一会

    volatile unsigned long  count=0x100000;

    while(count>0){

        count--;}

 

    uart_asm_putc('C');

    uart_asm_putc('O');

    uart_asm_putc('P');

    uart_asm_putc('Y');

    uart_asm_putc('r');

    uart_asm_putc('n');

    //从SD卡扇区49处复制32个扇区的内容到内存地址0x43e00000处

[1] [2]
关键字:tiny4412  裸机程序  重定位代码  DRAM 引用地址:tiny4412 裸机程序 七、重定位代码到DRAM

上一篇:tiny4412 裸机程序 六、重定位代码到IRAM+0x8000【转】
下一篇:tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示

推荐阅读最新更新时间:2024-11-20 12:42

Exynos4412裸机程序之DDR工作原理与时序(一)
下面先介绍一些DDR的有关概念 DDR SDRAM 全称为 Double Data Rate SDRAM,中文名为“双倍数据流 SDRAM”。DDR SDRAM 在原有的 SDRAM的基础上改进而来。下图是DDR和SDRAM的数据传输对比图。 DDR和SDRAM的数据传输对比图 上图可以清楚的看到,DDR可在一个时钟周期内传送两次数据,上升沿传一次,下降沿传一次。 一、DDR的基本原理 DDR读操作时序图 从中可以发现它多了两个信号:CK#与DQS,CK#与正常 CK 时钟相位相反,形成差分时钟信号。而数据的传输在 CK 与 CK#的交叉点进行,可见在 CK 的上升与下降沿(此时正好是 CK#的上升沿)都有数据被触发,
[单片机]
Exynos4412<font color='red'>裸机</font><font color='red'>程序</font>之DDR工作原理与时序(一)
IC Insights: DRAM与NAND位居今年 IC细分市场销售增长率前两位
IC Insights目前正在更新2021年1月第24版的《麦克林报告》(The McClean Report),并且公布了最新版的部分细节。 该报告更新了对集成电路行业的全面预测和分析,其中包括对销售和单位出货量增长的预测,列出了2020年半导体销售和收入增长的前五大产品类别。 就销售额而言,前五名的IC产品类别均与计算或通信应用有关。 DRAM的估计销售额为652亿美元,在2020年的销售收入中名列前茅,其次是NAND闪存(如下图)。个人计算机和手机处理器也一同被列出。 自2017年以来,即便考虑到2019年内存市场急剧下滑的情况下,DRAM仍是创收最高的细分IC领域,预计2021年这一局面不会改变。新冠病毒疫情增加了在线
[手机便携]
IC Insights: <font color='red'>DRAM</font>与NAND位居今年 IC细分市场销售增长率前两位
2009年半导体行业遭遇十年来收入低谷
  根据全球技术研究和咨询公司Gartner的初步估计,2009年全球半导体总收入为2,260亿美元,比2008年下滑11.4%, 这将是该行业在过去的25年来经历的第六次收入下滑。      Gartner半导体调研总监Stephan Ohr先生表示:“2009年第一季度半导体收入急剧下降,这一持续恶化是从2008年第四季度开始的。而2009年第一季度末收入的轻微上扬,则导致了随后明显的同比增长。”      然而,对于半导体行业来说,2009年依旧是自2001年网络泡沫破裂以来收入最差的年份之一。于2008年第四季度开始的全球经济衰退导致了当年全球半导体收入下滑5.4%。      Stephan Ohr先生接着表示:“随着市
[半导体设计/制造]
2009年半导体行业遭遇十年来收入低谷
智慧手机和平板助攻 行动DRAM声势看涨
    在智慧型手机和媒体平板装置的带动下,行动DRAM(Mobile DRAM)需求也随之水涨船高,包括低功耗DRAM和虚拟DRAM(Pseudo SRAM)的声势正不断看涨。     2010 年全球DRAM市场规模为391亿美元,行动装置相关应用就占14%,达到55亿美元。行动DRAM的出货量和记忆容量也不断提高。苹果iPhone 4的行动DRAM容量达到512MB,而宏达电的Desire HD更有768MB。而iPad的行动DRAM容量有256MB,三星的Galaxy Tab更有512MB。     根据市调机构Gartner预估,今年媒体平板装置平均行动DRAM容量为 507MB,而智慧手机平均容量为279MB,
[手机便携]
兆易创新65亿并购美DRAM厂ISSI !
2月13日消息,兆易创新公告,公司拟以发行股份及支付现金的方式收购北京矽成100%股权。其中发行股份支付对价为45.5亿元,现金支付对价为19.5亿元。同时,公司拟募集配套资金20.3亿元。北京矽成(ISSI)的主营业务为提供高集成密度、高性能品质、高经济价值的集成电路存储芯片的研发、销售和技术支持,以及集成电路模拟芯片(ANALOG)的研发和销售。 根据这份交易方案,兆易创新拟以发行股份及支付现金购买资产收购上海承裕、屹唐投资、华创芯原、闪胜创芯、民和志威合计持有的北京矽成100%股权,交易价格暂定为65亿元。 同时向名建致真、上海承芯、民和志威、昆山芯村、海厚泰资本、京创恒益、芯动能基金、兆浩投资、庆历投资和员工平台等
[嵌入式]
工程师实战:单片机裸机程序框架是怎样炼成的
前言 前不久,我有位做测试的朋友转去做开发的工作,面试遇到了一个问题,他没明白,打电话问了我。题目大概就是: 在单片机裸机开发时,单片机要处理多个任务,此时你的程序框架是怎样的呢? 这其实是个经典面试问题,我以前面试也被问过。 答案一:轮询系统 代码结构如: 左右滑动查看全部代码 int main(void) { init_something(); while(1) { do_something1(); do_something2(); do_something3(); } } 这种结构大概是我们初学单片机的时候的代码结构。在没有外部事件驱动时,可以较好使用。 只答出了这种情况,印象分估计会比较低,多半
[单片机]
工程师实战:单片机<font color='red'>裸机</font><font color='red'>程序</font>框架是怎样炼成的
Eclipse开发调试ARM裸机程序(七)sd卡读写
主要用到了sd card官网上的几个文档,《SD Specifications Part 1 Physical Layer Simplified Specification Version 4.10 January 22, 2013》里边讲了SD卡内部的寄存器,一般的时序。还有《SD Specifications Part A1 Advanced Security SD Extension Simplified Specification Version 2.00 May 18, 2010》和《SD Specifications Part A2 SD Host Controller Simplified Specificati
[单片机]
Eclipse开发调试ARM<font color='red'>裸机</font><font color='red'>程序</font>(七)sd卡读写
OEM厂备货 将拉高DRAM上旬合约价
    虽然日本强震导致半导体生产链供货不顺,但是因各家计算机大厂手中仍有1-2个月库存,所以4月及5月份计算机出货仍没有太大问题,由于英特尔修正版6系列芯片组已恢复正常供货量,OEM厂已开始放大英特尔Sandy Bridge平台出货。   不过,因为日本矽晶圆厂信越半导体(Shin-Etsu)及胜高(SUMCO)仍未复工,OEM厂为避免后续DRAM供不应求,近期开始扩大采购,提高DRAM库存水位,包括台湾、日本、韩国等DRAM厂则顺势提高DRAM价格,4月上旬合约价可望调涨约5%。   英特尔6系列芯片组在1月底发生设计瑕疵事件,虽然英特尔紧急宣布停止销售,并于2月14日开始回复正常供货,但实际供货数量仍低于正常水平,直至3月
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved