娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月14日(星期一)

正在發生

2018年10月14日 | Exynos4412裸機之DDR-SDRAM中重定位

發布者:春水碧于天 來源: eefocus關鍵字:Exynos4412  裸機  DDR-SDRAM  重定位 手機看文章 掃描二維碼
隨時隨地手機看文章

上一此實驗我們講解了如何對代碼進行重定位,但是將代碼重定位到只有256K的IRAM中作用不大。正確的做法是將代碼重定位到容量更大的主存中,即DRAM中。

Exynos4412中有兩個獨立的DRAM控制器,分別叫DMC0和DMC1。DMC0和DMC1分別支持最大1.5GB的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。

DRAM控制器地址映射

DRAM控制器地址映射

Tiny4412的1GB的DRAM是由4片大小為128MX16的DDR3芯片組合而成,下面看一下Tiny4412的原理圖:

Tiny4412 DDR電路圖

Tiny4412 DDR電路圖

Tiny4412 DDR電路圖

Tiny4412 DDR電路圖

從上兩圖可以看出,這四片DDR 芯片被分成了兩兩一組,組成32位數據,四片都是掛接到DMC0處。

如何才能使用DRAM?對應Tiny4412而言,由于用到了DMC0,所有我們需要初始化DMC0和DDR3 DRAM芯片。

聲明一下:

從這一節開始我們的程序結構發生了一些變化,前幾個實驗我們只生成一個文件,從這個實驗開始我們生成兩個文件,BL2.bin和main.bin,其中BL2.bin文件的鏈接地址是0x02023400;(使用的是位置無關碼,程序可以在任意可用的內存中運行),main.bin 文件的鏈接地址是0x43E00000(使用的并不是位置無關碼,所有程序必須位于該地址處才能正常運行)。需要在SD卡上燒寫三部分程序,分別是:

1.BL1(由三星提供):實現一些初始化

2.BL2(我們自己編寫源碼,用mkbl2工具生成):板級初始化,并完成代碼重定位到DDR SDRAM,完成跳轉

3.主代碼:實現我們想要的功能

三部分代碼在SD卡的位置如下:

程序在SD卡的位置分布

程序在SD卡的位置分布

從圖中可以看出,BL1.bin燒寫到SD卡扇區1,BL2.bin燒寫到sd卡的扇區17,main.bin燒寫到sd卡的扇區49處。

整個程序的運行過程大致如下:系統上電后,首先將sd卡扇區1處的bl1拷貝到IRAM的0x02020000地址處,然后運行該部分代碼,該部分代碼首先又會加載BL2.bin,BL2.bin會進行時鐘和DRAM初始化,然后把位于sd卡中扇區49處的main.bin拷貝到DRAM的0x43E00000地址處,最后跳轉到該地址處繼續運行。

 

一、程序說明

DDR的初始化順序在前一篇文章Tiny4412裸機程序之DDR3初始化流程我們已經經過,下面就根據前面提及的步驟一一來進行設置。

注:看到這么多設置步驟,實在太繁瑣了,我們參考u-boot for Tiny4412中的代碼,搞明白它設置了哪些東西:

================================================================

//(C) Copyright 2011 Samsung Electronics Co. Ltd

//

//See file CREDITS for list of people who contributed to this

//project.

//

//This program is free software; you can redistribute it and/or modify

//it under the terms of the GNU General Public License version 2 as

//published by the Free Software Foundation.

 

#include "config.h"

#include "asm/arch/cpu.h"

 

#define MCLK_400

.globl mem_ctrl_asm_init

mem_ctrl_asm_init:

 

// Async bridge configuration at CPU_core:

// 1: half_sync

// 0: full_sync */

ldr r0, =0x10010350

mov r1, #1

str r1, [r0]

// 這幾行代碼不知道什么意思,以及這樣做的原因

 

///////////////////////////////////////////////////////////////////

//--------------------------------DREX0---------------------------

///////////////////////////////////////////////////////////////////

 

ldr r0, =APB_DMC_0_BASE

 

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

//2. If on die termination is required, enable PhyControl1.term_write_en,

//PhyControl1.term_read_en.

 

ldr r1, =0xE3854C03

str r1, [r0, #DMC_PHYZQCONTROL]

//3. If ZQ calibration is required, disable PhyZQControl.

// ctrl_zq_mode_noterm and enable PhyZQCon-trol.

// ctrl_zq_start so that the PHY automatically calibrates

// the I/Os to match the driving and termination impedance

// by referencing resistor value of an external resistor

// and updates the matched value during auto re-fresh cycles.

 

mov r2, #0x100000

1: subs r2, r2, #1

bne 1b

ldr r1, =0x7110100A

str r1, [r0, #DMC_PHYCONTROL0]

//4. Set the PhyControl0.ctrl_start_point and PhyControl0.

// ctrl_inc bit-fields to correct value according to clock frequency.

// Set the PhyControl0.ctrl_dll_on bit-field to "1" to activate the PHY DLL.

 

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

//5. DQS Cleaning: set the PhyControl1.ctrl_shiftc and PhyControl1.

// ctrl_offsetc bit-fields to the proper value according to clock frequency,

// board delay and memory tDQSCK parameter.

 

ldr r1, =0x7110100B

str r1, [r0, #DMC_PHYCONTROL0]

// 6. Set the PhyControl0.ctrl_start bit-field to "1".

 

ldr r1, =0x00000000

str r1, [r0, #DMC_PHYCONTROL2]

// DQS offset

// 實驗了一下可以省略,默認值就是全零

 

ldr r1, =0x0FFF301A

str r1, [r0, #DMC_CONCONTROL]

// 7. Set the ConControl. At this moment,an auto refresh counter should be off.

 

ldr r1, =0x00312640

str r1, [r0, #DMC_MEMCONTROL]

// 8. Set the MemControl. At this moment,

// all power down modes and periodic ZQ(pzq_en) should be off.

 

ldr r1, =0x40e01323

str r1, [r0, #DMC_MEMCONFIG0]

ldr r1, =0x60e01323

str r1, [r0, #DMC_MEMCONFIG1]

// 9. Set the MemConfig0 register. If there are two external memory chips,

// also set the MemConfig1 register.

 

ldr r1, =(0x80000000 | CONFIG_IV_SIZE)

str r1, [r0, #DMC_IVCONTROL]

// Memory Channel Interleaving

// 實驗了一下可以省略,用默認值就可以

 

ldr r1, =0xff000000

str r1, [r0, #DMC_PRECHCONFIG]

// 10. Set the PrechConfig and PwrdnConfig registers.

 

ldr r1, =0x000000BB

str r1, [r0, #DMC_TIMINGAREF] @TimingAref

ldr r1, =0x4046654f

str r1, [r0, #DMC_TIMINGROW] @TimingRow

ldr r1, =0x46400506

str r1, [r0, #DMC_TIMINGDATA] @TimingData

ldr r1, =0x52000a3c

str r1, [r0, #DMC_TIMINGPOWER] @TimingPower

// 11. Set the TimingAref, TimingRow, TimingData and

// TimingPower registers according to memory AC parame-ters.

 

// chip 0 

ldr r1, =0x07000000

str r1, [r0, #DMC_DIRECTCMD]

// 19. Issue a NOP command using the DirectCmd register to assert 

//and to hold CKE to a logic high level.

 

mov r2, #0x100000

2: subs r2, r2, #1

bne 2b

// 20. Wait for tXPR(max(5nCK,tRFC(min)+10ns)) or set tXP to tXPR value before step 

// 17. If the system set tXP to tXPR, then the system must set tXP to proper value 

//     before normal memory operation.

 

ldr r1, =0x00020000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00030000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00010002

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00000328

str r1, [r0, #DMC_DIRECTCMD]

// 沒搞明白這里發的什么指令

 

mov r2, #0x100000

3: subs r2, r2, #1

bne 3b

 

ldr r1, =0x0a000000

str r1, [r0, #DMC_DIRECTCMD]

// 26. Issues a ZQINIT commands using the DirectCmd register.*/

 

mov r2, #0x100000

4: subs r2, r2, #1

bne 4b

// 27. If there are two external memory chips, perform steps 19 ~ 26 

//     procedures for chip1 memory device.

#if 1

// chip 1 

ldr r1, =0x07100000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

5: subs r2, r2, #1

bne 5b

 

ldr r1, =0x00120000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00130000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00110002

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00100328

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

6: subs r2, r2, #1

bne 6b

 

ldr r1, =0x0a100000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

7: subs r2, r2, #1

bne 7b

#endif

 

ldr r1, =0xe000008e

str r1, [r0, #DMC_PHYCONTROL1]

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

 

mov r2, #0x100000

8: subs r2, r2, #1

bne 8b

///////////////////////////////////////////////////////////////////

//---------------------------DREX1--------------------------------/

///////////////////////////////////////////////////////////////////

 

ldr r0, =APB_DMC_1_BASE

 

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

 

ldr r1, =0xE3854C03

str r1, [r0, #DMC_PHYZQCONTROL]

 

mov r2, #0x100000

1: subs r2, r2, #1

bne 1b

 

ldr r1, =0xe000008e

str r1, [r0, #DMC_PHYCONTROL1]

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

 

ldr r1, =0x71101008

str r1, [r0, #DMC_PHYCONTROL0]

ldr r1, =0x7110100A

str r1, [r0, #DMC_PHYCONTROL0]

 

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

ldr r1, =0x7110100B

str r1, [r0, #DMC_PHYCONTROL0]

 

ldr r1, =0x00000000

str r1, [r0, #DMC_PHYCONTROL2]

 

ldr r1, =0x0FFF301A

str r1, [r0, #DMC_CONCONTROL]

ldr r1, =0x00312640

str r1, [r0, #DMC_MEMCONTROL]

 

ldr r1, =0x40e01323 @Interleaved?

str r1, [r0, #DMC_MEMCONFIG0]

ldr r1, =0x60e01323

str r1, [r0, #DMC_MEMCONFIG1]

 

ldr r1, =(0x80000000 | CONFIG_IV_SIZE)

 

str r1, [r0, #DMC_IVCONTROL]

 

ldr r1, =0xff000000

str r1, [r0, #DMC_PRECHCONFIG]

 

ldr r1, =0x000000BB

str r1, [r0, #DMC_TIMINGAREF] @TimingAref

 

ldr r1, =0x4046654f

str r1, [r0, #DMC_TIMINGROW] @TimingRow

ldr r1, =0x46400506

str r1, [r0, #DMC_TIMINGDATA] @TimingData

ldr r1, =0x52000a3c

str r1, [r0, #DMC_TIMINGPOWER] @TimingPower

 

// chip 0 

ldr r1, =0x07000000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

2: subs r2, r2, #1

bne 2b

 

ldr r1, =0x00020000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00030000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00010002

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00000328

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

3: subs r2, r2, #1

bne 3b

 

ldr r1, =0x0a000000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

4: subs r2, r2, #1

bne 4b

 

#if 1

// chip 1 

ldr r1, =0x07100000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

5: subs r2, r2, #1

bne 5b

 

ldr r1, =0x00120000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00130000

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00110002

str r1, [r0, #DMC_DIRECTCMD]

ldr r1, =0x00100328

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

6: subs r2, r2, #1

bne 6b

 

ldr r1, =0x0a100000

str r1, [r0, #DMC_DIRECTCMD]

 

mov r2, #0x100000

7: subs r2, r2, #1

bne 7b

#endif

 

ldr r1, =0xe000008e

str r1, [r0, #DMC_PHYCONTROL1]

ldr r1, =0xe0000086

str r1, [r0, #DMC_PHYCONTROL1]

 

mov r2, #0x100000

8: subs r2, r2, #1

bne 8b

///////////////////////////////////////////////////////////////////

//-----------------------Finalize---------------------------------/

///////////////////////////////////////////////////////////////////

 

ldr r0, =APB_DMC_0_BASE

ldr r1, =0x0FFF303A

str r1, [r0, #DMC_CONCONTROL]

// 28. Set the ConControl to turn on an auto refresh counter.

 

ldr r0, =APB_DMC_1_BASE

ldr r1, =0x0FFF303A

str r1, [r0, #DMC_CONCONTROL]

// 28. Set the ConControl to turn on an auto refresh counter.

 

mov pc, lr

================================================================

二、編譯、燒寫、運行

1.編譯

通過FTP或者其他工具將文件上傳到服務器上去,輸入make命令進行編譯將得到make_bl2.bin和main.bin文件。

2.燒寫

將SD卡插入電腦,并讓VmWare里的Ubuntu識別出來,然后執行如下命令:

1

sudo ./sd_fusing.sh /dev/sdb ../9_reload_ddr/BL2/make_bl2.bin ../9_reload_ddr/MAIN/main.bin

程序燒寫

程序燒寫

二、運行現象

將SD卡插入Tiny4412開發板,連接串口工具,上電,你會看到和上一節的運行效果一樣(因為我們沒有修改LED的顯示效果,只是修改了程序的運行地址,這個對外是看不出區別的)。

串口可以看到如下顯示信息;

運行效果

運行效果

從圖的信息室打印的地址0x43E00000處的內容(main.bin文件的鏈接地址)

我們將上述打印的信息和main.bin文件進行對比,發現完全一樣,說明代碼已經拷貝到了正確的鏈接地址。

文件對比

文件對比


關鍵字:Exynos4412  裸機  DDR-SDRAM  重定位 引用地址:Exynos4412裸機之DDR-SDRAM中重定位

上一篇:Exynos4412裸機程序之UART收發數據
下一篇:Exynos4412裸機程序之DDR3初始化流程

0

推薦閱讀

有了上一節《Exynos4412時鐘體系分析》的基礎,這一節我們來做幾個和時鐘有關的實驗。其實,Exynos 4412的 IROM代碼已經設置了PLL,我們可以通過串口把IROM設置的PLL寄存器值打印出來,這些值打印出來是這樣的(摘自韋東山老師的《嵌入式Linux系統開發完全手冊_基于4412__上冊》):CLK_SRC_CPU = 0x01000001CLK_DIV_DMC0 = 0x00111713CLK_DIV_DMC1...
華強北身上有過太大的光環:“全國乃至全球最大的電子產品集散地”、“中國電子第一街”、“中國電子產業的風向標”,1米柜走出50位億萬富翁的故事從這里流出,一時風光無限。 只是最近幾年,華強北“變天”的消息不斷,“空鋪潮”,一些商家開始“逃離華強北”。 電商的沖擊,地鐵施工封閉等因素,華強北在過去幾年中經受了客流量驟減的窘境,其身上南中...
蘋果剛剛發布了4款iPhone 12系列手機,從5499元一直到11899元應有盡有,價格總體比iPhone 11系列還低了一些,最高降價了800元,考慮到5G及拍照等方面的升級,誠意還是夠的。不過這次有個小細節,之前大家也看過報道了,那就是從iPhone 12這一代開始,蘋果不再贈送耳機及充電器了,始于喬布斯時代的五福一安充電器終于要淘汰了。對于這個舉動,網友的第...
蘋果已經申請了許多關于折疊式iPhone的專利。一項被授予的專利是 “具有可滑動擴展顯示屏的電子設備”,而蘋果剛剛更新了該專利。  蘋果在專利當中表示,電子設備通常包括觸摸屏顯示屏,可用于移動電話或其他便攜式設備,為用戶顯示信息并收集用戶的輸入。如果不注意,顯示屏可能無法提供足夠的屏幕空間來顯示用戶感興趣的信息,同時,很難將...

史海拾趣

問答坊 | AI 解惑

大家有用ARM做變頻器的控制器的嗎?給點建議吧

如題,用ARM做變頻器的控制部分,出PWM波形給變頻器的IGBT驅動電路,看到的變頻器都是用DSP做的,不知道ARM是否合適?大家有做成的沒有? 看中了群星M3核的LM3S615了,有6路帶死區控制的PWM,大家給點建議,呵呵。另外根本還不知道輸出什么樣的PW ...…

查看全部問答∨

IC設計流程

1.IC Specification 訂定規格: 訂定IC的規格,工作電壓、電流,采用的制程等,并于架構設計時就必須考慮其未來測試問題。 2.IC Design IC設計: 依據所訂的的規格來設計,于邏輯設計與線路計設時,須考慮可測試性設計及實際產生其測試圖樣,供 ...…

查看全部問答∨

關于EMI和EMC的相關問題

1·屏蔽 屏蔽的方法主要是采用金屬板、薄、外殼、鐵氧體吸收板、鐵氧體吸收薄、網格狀金屬殼,以解決內部噪音發射出去、外部噪音滲透進來。 2·鐵氧體 鐵氧體方法主要是采用分離型鐵氧體、鐵氧體環、夾子濾波器和平板型鐵氧體來吸收噪音,并把它 ...…

查看全部問答∨

誰需要TI的達芬奇系列的開發板

各位大俠好:     北京天睿視迅科技有限公司是一家專業從事嵌入式、音視頻產品研發、生產、銷售的高科技公司,坐 落在北京市上地開發區。公司以嵌入式和音視頻技術為基礎,為客戶提供個性化的產品和服務。天睿專注 于嵌入式和音視頻產 ...…

查看全部問答∨

STM32W108 ZIGBEE

意法半導體的zigbee無線資料 [ 本帖最后由 kouyu 于 2011-5-27 17:43 編輯 ]…

查看全部問答∨

好的系統設計方案是取得好的競賽成績的保證

本帖最后由 paulhyde 于 2014-9-15 09:16 編輯 好的系統設計方案是取得好的競賽成績的保證  …

查看全部問答∨

想買個更好點的MSP430,各位前輩來說說買哪個好。

我現在只有一個lanuchpad。還有個壞了的51單片機。 由于lanuchpad自帶一個仿真器,我想繼續用lanuchpad用作仿真器。 該買什么樣的msp430單片機,只要一個最小板就行了。然后把壞51上的零件裝上去實驗。 有好幾個例程在于lanuchpad上無法調試,IO ...…

查看全部問答∨

交流一些個人淺薄的cortex m4經驗,從一個莫名的hard fault開始

最近搞了2塊st的cortex m4 discovery 板,玩lcd玩的很開心,把我stmf1上的顯示程序都移植到了新的m4平臺。因為程序大部分都是用c寫的,所以開始的時候非常順利,可是在一個5參數的函數出現了問題。癥狀是一運行到這個函數就進入hard fault,因為程 ...…

查看全部問答∨

microblaze中GPIO與FPGA其它邏輯通信的問題

使用的是Microblaze,單獨在EDK中編寫的程序下載到板子上運行正常,但是將microblaze作為大的ISE工程的IP核加進去的時候,microblaze中的程序運行不正常。具體來說,microbalze中用了4個GPIO,兩個分別引到FPGA引腳分別連接液晶屏和按鍵,另兩個GPIO ...…

查看全部問答∨
小廣播
添点儿料...
无论热点新闻、行业分析、技术干货……
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 衡东县| 英超| 邹城市| 丰镇市| 滦南县| 梅州市| 卢龙县| 福安市| 九寨沟县| 公安县| 赤水市| 东至县| 万山特区| 商都县| 阿巴嘎旗| 公安县| 沙洋县| 册亨县| 江山市| 赣州市| 驻马店市| 咸阳市| 库尔勒市| 文登市| 尉氏县| 桂平市| 贵定县| 和硕县| 伊吾县| 航空| 托克逊县| 德惠市| 克东县| 平定县| 饶阳县| 闻喜县| 芒康县| 黔西县| 剑阁县| 武冈市| 定襄县|