一、關于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處
上一篇:tiny4412 裸機程序 六、重定位代碼到IRAM+0x8000【轉】
下一篇:tiny4412 裸機程序 九、串口排查驅動原因及字符圖片顯示
推薦閱讀
史海拾趣
澤耀科技(Ashining)在創立之初,面臨著資金短缺、市場競爭激烈和技術難題等挑戰。然而,公司的創始人憑借對電子行業的深刻理解和堅定信念,帶領團隊攻堅克難,不斷研發創新。他們深入市場調研,準確把握消費者需求,成功推出了一款具有競爭力的電子產品,為公司的發展打開了局面。
DB Unlimited始終將客戶放在心中最重要的位置。公司堅持以客戶為中心的服務理念,為客戶提供全方位、高品質的服務。無論是售前咨詢、售后服務還是技術支持等方面,DB Unlimited都始終秉持著專業、高效、熱情的態度,贏得了客戶的廣泛贊譽和信賴。這種客戶至上的服務理念也成為了公司不斷發展壯大的重要保障之一。
請注意,以上故事框架僅供參考,實際的故事需要根據DB Unlimited公司的真實發展歷程和具體事實進行編寫。
隨著全球環保意識的提高,Coil-Q積極響應綠色發展的號召,將環保理念融入公司的生產和經營中。公司投入大量資金研發環保材料和技術,優化生產工藝,降低能耗和排放。同時,Coil-Q還積極參與環保公益活動,推動行業的綠色轉型。
隨著全球環保意識的提高,Coil-Q積極響應綠色發展的號召,將環保理念融入公司的生產和經營中。公司投入大量資金研發環保材料和技術,優化生產工藝,降低能耗和排放。同時,Coil-Q還積極參與環保公益活動,推動行業的綠色轉型。
臺灣積體電路制造股份有限公司(TSMC)在CMOS技術的發展中也有著不可忽視的貢獻。作為一家專業的半導體制造企業,TSMC憑借其在生產工藝和質量控制方面的優勢,成功地為全球眾多知名半導體企業提供了優質的CMOS芯片制造服務。通過不斷的技術創新和生產優化,TSMC的CMOS芯片品質得到了業界的廣泛認可,使其在全球半導體制造市場上占據了重要地位。
概述:TD8351是一個場輸出電路,它具有高率直流對稱場輸出橋電路、垂直回掃開關、內置自動保護電路(7和4腳之間的輸出短路、輸出和電源之間的短路、溫度過熱保護)。 &nb ...… 查看全部問答∨ |
應用很簡單,2003輸入接MCU的IO,輸出接一個加熱絲(加熱絲電阻100歐姆左右),現在的現象是不管MCU的IO是什么信號,加熱絲都一直進行加熱?,F在批量生產的10臺機器中有一臺出現了這個問題,是元件本身的問題,還是電路的問題呢,小弟很著急,請大 ...… 查看全部問答∨ |
我在PB4.2下定制WINCE,build時出現1個錯誤,系統提示參考WINCE420目錄下的build.err文件,文件的內容如下: Starting sysgen phase for project ( common ) Found localized resources for Languages ( 0404 0407 040C 0410 0411 0412 0413 041 ...… 查看全部問答∨ |
u-boot引導linux,在出現如下問題后就不動了……請求幫助! 網上有兩種解決方案: 一是串口的問題,即ttySAC0; 二是時鐘頻率的問題。 這兩個我都排除了,但還是不行! 出現的問題如下: Starting kernel ... Uncompressing Linux................................................................... ...… 查看全部問答∨ |
請問:如果某一個timer到時間而沒有被關閉,將會有什么結果產生? 我是這樣想: 設置并且啟動timer后,timer開始計時,一旦指定的延時結束,函數立即被調用。 可是如果timer到時間沒有被關閉,將會產生什么樣的結果呢? 請高手們幫助解答一下… 查看全部問答∨ |
現象:使用查詢模式能夠實現正常收發,使用串口中斷時,沒有中斷時,在主程序循環中正常運行,如果收到字符,不是跳到USART1_IRQHandler,而是跳到了 HardFaultException中斷,可能是哪里的原因,如果說硬件有問題,可查詢模式很正常。請高手 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 傳統晶體管的極限!臺積電3nm N3P已量產
- 分析師稱H20出口管制毫無意義:對中國AI發展影響不大