日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

lmosem

 ada_lib 2018-03-20

標(biāo)簽:android   style   log   com   http   it   si   使用   la   

實驗手冊上說了安裝DNW驅(qū)動,這個軟件我沒有細(xì)查,不過根據(jù)它的功能,它用的是USB上傳文件到開發(fā)板,所以比那種用串口上傳文件要方便很多。

USB轉(zhuǎn)串口支持驅(qū)動之前已經(jīng)安裝了,現(xiàn)在為了支持USB傳輸文件當(dāng)然也要安裝驅(qū)動,安裝時有些文檔里面沒有說清楚,這里說下。

  1. 啟動DNW,先在Configure里面設(shè)置一下,然后再點擊Serial Port/connect,接著再打開開發(fā)板開關(guān),輸入dnw,會自動提示缺少驅(qū)動;
  2. 驅(qū)動文件先按照安裝步驟先簽名一下,然后再更新驅(qū)動;
  3. 安裝完驅(qū)動,先回車輸入dnw 40008000,然后再點擊USB Por/Transmit/Transmit,添加文件到Transmit,添加完成后接著是傳輸文件,再次選擇Transmit/led.bin,上傳文件;
  4. 顯示傳輸成功后,記得輸入go 40008000把程序指針指向這個地址,CPU會到這個地方執(zhí)行二進制機器代碼,會看到燈閃爍,完成。

? ?

還是把例程代碼寫一遍吧,led裸板實驗一共有三個文件

  1. start.S
  2. led.c
  3. Makefile

? ?

start.S需要完成的事情有

首先關(guān)看門狗(盡管IROM已經(jīng)這樣做了?),看門狗的作用還是不太清楚?

首先在手冊中搜watchdog,找到watchdog這章,大概瀏覽下,然后找到這章

技術(shù)分享

定位到26章看門狗定時器,大概瀏覽一下overview

技術(shù)分享

對于硬件的操作無非是操作寄存器,寄存器就好比面向?qū)ο笾械慕涌贏PI,只不過這里封裝的是硬件而已。通常而言,寄存器無非兩大類:控制寄存器和數(shù)據(jù)寄存器,4412中的設(shè)備寄存器一般都是32位,然后具體的設(shè)備還有額外的寄存器。此處我們需要關(guān)閉看門狗,所以能夠想到應(yīng)該到控制寄存器里面找對應(yīng)的位去設(shè)置一下。

技術(shù)分享

這里呢,我們把控制器寄存器全部置零,也就是關(guān)閉所以可以控制的功能,反正暫時不要用,代碼如下:

我們只要把Reset和Interrupt關(guān)閉就可以了,這樣就無法產(chǎn)生復(fù)位信號或者中斷信號,當(dāng)然這里把所有位都置零也沒問題:

技術(shù)分享

關(guān)完了看門狗,接下來就是打開icache

這里插播一段廣告,什么是icache?參考Tiny4412裸機程序之操作ICache

CPU訪問內(nèi)存取指順序執(zhí)行,但是訪問寄存器還是太慢了,所以在CPU通用寄存器和內(nèi)存之間插入了高速緩存cache,特點是高速但是容量小,CPU會把一部分常用的指令放到里面去,cache常見的分成兩類:icache和dcache。

icache使用比較簡單,系統(tǒng)剛上電的時候是無效的,并且它是關(guān)閉的,往CP15協(xié)處理器中的寄存器C1的bit[12]寫1可以啟動icache,寫0可以關(guān)閉icache。icache關(guān)閉時,CPU每次取指都要讀主存,性能非常低。因為icache可隨時啟動,越早開icache越好。

技術(shù)分享

dcache剛上電的時候也是無效并且是關(guān)閉的,在CP15寄存器C1中的bit[2]中寫1可以啟動dcache,寫0可以關(guān)閉dcache。因為dcache必須在啟動mmu之后才能啟動,而對于裸機而言,沒必要開啟mmu,mmu是什么?所以這里就不啟動了。

啟動了icache,這樣取指令命令就快了,這次的裸機測試程序的電燈程序是C語言寫的,所以要設(shè)置??臻g(也就是設(shè)置棧指針)

下面介紹一下為什么要設(shè)置棧?參考和拷貝了文章Tiny4412之C語言實現(xiàn)流水燈,Tiny4412裸機程序

在Linux系統(tǒng)編程中,我們寫了一段C代碼然后就直接執(zhí)行了,也沒有設(shè)置棧空間。其實是C庫幫我們這些事情做了,至于具體怎么做的暫時還不太清楚。大概的情況是這樣的:在編譯C源碼時,編譯器通常會在我們的代碼中加上幾個被稱為啟動文件的代碼(crtl.o crti.o crtend.o crtn.o等),它們是標(biāo)準(zhǔn)的庫文件。這些代碼就負(fù)責(zé)設(shè)置C程序的堆棧等等,然后設(shè)置好C程序執(zhí)行的堆棧環(huán)境(怎么設(shè)置的暫時十分不清楚),然后調(diào)用main函數(shù)。要注意的是,這些函數(shù)和我們的裸板程序設(shè)置堆棧的方法不同,因為還要和操作系統(tǒng)打交道,所以這些代碼是不能用在裸板上的。

棧:調(diào)用C語言之前必須設(shè)置棧,棧用于保存運行時環(huán)境,給局部變量分配空間。

??

具體把棧指針設(shè)置到哪里呢?先來看一下4412的啟動流程吧,參考手冊SEC_Android_Exynos4212_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf

技術(shù)分享

參考代碼上給的ldr sp, =0x02050000,我不知道為什么設(shè)置0x02050000這個地址作為棧頂指針,參考了Tiny4412之C語言實現(xiàn)流水燈,Tiny4412裸機程序。

查手冊發(fā)現(xiàn)內(nèi)部的IRAM的地址是從0x02020000開始的,而根據(jù)IRAM的內(nèi)部存儲映射知道,還要劃5K給IROM用,劃8K給BL1用,劃16K給BL2用(BL2實際14K),按道理說剩下的空間就沒有用了,我們可以把剩下的空間0x02027400到0x02060000中劃一段出來作為??臻g,只不過我奇怪的是為什么不在內(nèi)存空間(我還不知道內(nèi)存地址映射到哪段上去了?)呢?

其實選取1K就足夠了,其實對于led.bin來說,根本用不了這么大,而他這里選擇了0x02050000,我不懂。

其實按道理說,設(shè)置

0x02020000 (iRAM基地址) + 5K(iROM代碼用) + 8K(BL1用) + 16K(BL2用) + 1K(用作棧))也是可以的,這里設(shè)置的是0x02050000?

技術(shù)分享

技術(shù)分享

? ?

好了,設(shè)置完了??臻g,就可以調(diào)到C程序那里去執(zhí)行了:

技術(shù)分享

下面來實現(xiàn)led_blink函數(shù),可見這里不需要main函數(shù),原因是這是邏輯程序,而對mian函數(shù)的要求是C編譯器的要求。

第一步首先找到led的原理圖,因為有了原理圖,才能知道led連接到了哪個引腳上,然后才能控制這個引腳,從而控制led。

下面是led的原理圖:

技術(shù)分享

從上圖可以知道連接led的引腳網(wǎng)絡(luò)標(biāo)號,然后通過網(wǎng)絡(luò)標(biāo)號找到和連接器相連的引腳:

技術(shù)分享

? ?

技術(shù)分享

然后再通過連接器上的網(wǎng)絡(luò)標(biāo)號到核心板原理圖pdf上去找對應(yīng)的處理器的引腳:

技術(shù)分享

? ?

技術(shù)分享

? ?

好了現(xiàn)在知道了處理器引腳名稱了,接著到4412手冊pdf上搜到這兩個引腳相關(guān)的寄存器,然后控制即可。

這里的話控制很簡單,只要先設(shè)置為輸出,然后輸出高電平就點亮,輸出低電平就熄滅即可:

技術(shù)分享

? ?

技術(shù)分享

? ?

技術(shù)分享

? ?

技術(shù)分享

? ?

led2

GPL2_0

??

led3

GPK1_1

??

? ?

技術(shù)分享

? ?

技術(shù)分享

? ?

技術(shù)分享

? ?

技術(shù)分享

? ?

下面寫流水燈的C程序:

技術(shù)分享

接下來是Makefile的編寫:

技術(shù)分享

接下來就是執(zhí)行了,但是出現(xiàn)了如下錯誤:

技術(shù)分享

不知道怎么回事,上次還有用的。不管了,既然沒檢測到,肯定是路徑?jīng)]添加,所以添加下:

技術(shù)分享

添加:

技術(shù)分享

使 .bashrc生效

技術(shù)分享

再次運行make,OK! 執(zhí)行成功:

技術(shù)分享

? ?

接下來就是把led.bin下載到開發(fā)板上:

  1. 先把led.bin拖到桌面上,我習(xí)慣用Xmanager文件傳輸,十分方便;
  2. 接著打開dnw.exe,如果端口號變了,需要先重新Configuration/Options;
  3. 然后點擊Serial Port/Connet;
  4. 接著按下iTOP-4412開發(fā)板的電源開關(guān),dnw輸出信息,及時按下回車;
  5. 輸入dnw 40008000;
  6. 然后下載led.bin到開發(fā)板上:USB Port/Transmit/;
  7. 下載成功后,不要忘了輸入 go 40008000 執(zhí)行代碼;
  8. 經(jīng)測試,本次流水燈實驗成功。

? ?

說明:

得到了led.bin,根據(jù) 裸機教程.pdf ,通過現(xiàn)成的uboot功能,把led.bin下載到了0x40008000這個地址,不是太清楚這個地址是干嘛用的。原以為程序當(dāng)然是加載到內(nèi)存中運行的,但是我不知道這里的意思是什么?是不是把程序搬到了這個地址0x40008000,然后還要搬到再搬到內(nèi)存里面去執(zhí)行?還是說0x4000800本來就是內(nèi)存地址也就是下載到了DRAM上?不過按道理說,應(yīng)該不是直接下載到內(nèi)存上吧,應(yīng)該是先下載到eMMC上吧。

? ?

我看了4412手冊描述存儲映射的那章:

技術(shù)分享

但是不太清楚這個DMC到底是個什么地址,而且也沒有找到DDR的映射區(qū)域,不知道怎么回事???

用折半法試了下,只有0x40000000到0x5FFFFF0A這段地址段可以通過dnw.exe把led.bin下載過去,led.bin占232字節(jié)(指的是教程提供的led.bin,自己的led.bin大小不是這個)。也就是大概511M的空間,我奇怪的是為什么其他區(qū)域不可以呢,畢竟這塊板子的eMMC有4G的空間???不明所以。

? ?

技術(shù)分享

0x5ffffe22+0xe8=0x5FFFFF0A

0x5FFFFF0A-0x4000000=0x1FFFFF0A=536870666(10)

536870666B/1024/1024=511.9998

512MB=536870912B

? ?

先把當(dāng)下的事情干好,想一下是不是。

? ?

lmosem-exynos4412:iTOP-4412裸機開發(fā)環(huán)境

標(biāo)簽:android   style   log   com   http   it   si   使用   la   

原文:http://www.cnblogs.com/dcscodelife/p/5790977.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多