標簽:android style log com http it si 使用 la
實驗手冊上說了安裝DNW驅動,這個軟件我沒有細查,不過根據(jù)它的功能,它用的是USB上傳文件到開發(fā)板,所以比那種用串口上傳文件要方便很多。
USB轉串口支持驅動之前已經安裝了,現(xiàn)在為了支持USB傳輸文件當然也要安裝驅動,安裝時有些文檔里面沒有說清楚,這里說下。
??
還是把例程代碼寫一遍吧,led裸板實驗一共有三個文件
??
start.S需要完成的事情有
首先關看門狗(盡管IROM已經這樣做了?),看門狗的作用還是不太清楚?
首先在手冊中搜watchdog,找到watchdog這章,大概瀏覽下,然后找到這章
定位到26章看門狗定時器,大概瀏覽一下overview
對于硬件的操作無非是操作寄存器,寄存器就好比面向對象中的接口API,只不過這里封裝的是硬件而已。通常而言,寄存器無非兩大類:控制寄存器和數(shù)據(jù)寄存器,4412中的設備寄存器一般都是32位,然后具體的設備還有額外的寄存器。此處我們需要關閉看門狗,所以能夠想到應該到控制寄存器里面找對應的位去設置一下。
這里呢,我們把控制器寄存器全部置零,也就是關閉所以可以控制的功能,反正暫時不要用,代碼如下:
我們只要把Reset和Interrupt關閉就可以了,這樣就無法產生復位信號或者中斷信號,當然這里把所有位都置零也沒問題:
關完了看門狗,接下來就是打開icache
這里插播一段廣告,什么是icache?參考Tiny4412裸機程序之操作ICache |
CPU訪問內存取指順序執(zhí)行,但是訪問寄存器還是太慢了,所以在CPU通用寄存器和內存之間插入了高速緩存cache,特點是高速但是容量小,CPU會把一部分常用的指令放到里面去,cache常見的分成兩類:icache和dcache。 icache使用比較簡單,系統(tǒng)剛上電的時候是無效的,并且它是關閉的,往CP15協(xié)處理器中的寄存器C1的bit[12]寫1可以啟動icache,寫0可以關閉icache。icache關閉時,CPU每次取指都要讀主存,性能非常低。因為icache可隨時啟動,越早開icache越好。 dcache剛上電的時候也是無效并且是關閉的,在CP15寄存器C1中的bit[2]中寫1可以啟動dcache,寫0可以關閉dcache。因為dcache必須在啟動mmu之后才能啟動,而對于裸機而言,沒必要開啟mmu,mmu是什么?所以這里就不啟動了。 |
啟動了icache,這樣取指令命令就快了,這次的裸機測試程序的電燈程序是C語言寫的,所以要設置棧空間(也就是設置棧指針)
下面介紹一下為什么要設置棧?參考和拷貝了文章Tiny4412之C語言實現(xiàn)流水燈,Tiny4412裸機程序 |
在Linux系統(tǒng)編程中,我們寫了一段C代碼然后就直接執(zhí)行了,也沒有設置??臻g。其實是C庫幫我們這些事情做了,至于具體怎么做的暫時還不太清楚。大概的情況是這樣的:在編譯C源碼時,編譯器通常會在我們的代碼中加上幾個被稱為啟動文件的代碼(crtl.o crti.o crtend.o crtn.o等),它們是標準的庫文件。這些代碼就負責設置C程序的堆棧等等,然后設置好C程序執(zhí)行的堆棧環(huán)境(怎么設置的暫時十分不清楚),然后調用main函數(shù)。要注意的是,這些函數(shù)和我們的裸板程序設置堆棧的方法不同,因為還要和操作系統(tǒng)打交道,所以這些代碼是不能用在裸板上的。 |
棧:調用C語言之前必須設置棧,棧用于保存運行時環(huán)境,給局部變量分配空間。 ?? |
具體把棧指針設置到哪里呢?先來看一下4412的啟動流程吧,參考手冊SEC_Android_Exynos4212_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf 參考代碼上給的ldr sp, =0x02050000,我不知道為什么設置0x02050000這個地址作為棧頂指針,參考了Tiny4412之C語言實現(xiàn)流水燈,Tiny4412裸機程序。 查手冊發(fā)現(xiàn)內部的IRAM的地址是從0x02020000開始的,而根據(jù)IRAM的內部存儲映射知道,還要劃5K給IROM用,劃8K給BL1用,劃16K給BL2用(BL2實際14K),按道理說剩下的空間就沒有用了,我們可以把剩下的空間0x02027400到0x02060000中劃一段出來作為??臻g,只不過我奇怪的是為什么不在內存空間(我還不知道內存地址映射到哪段上去了?)呢? 其實選取1K就足夠了,其實對于led.bin來說,根本用不了這么大,而他這里選擇了0x02050000,我不懂。 其實按道理說,設置 0x02020000 (iRAM基地址) + 5K(iROM代碼用) + 8K(BL1用) + 16K(BL2用) + 1K(用作棧))也是可以的,這里設置的是0x02050000? |
??
好了,設置完了??臻g,就可以調到C程序那里去執(zhí)行了:
下面來實現(xiàn)led_blink函數(shù),可見這里不需要main函數(shù),原因是這是邏輯程序,而對mian函數(shù)的要求是C編譯器的要求。
第一步首先找到led的原理圖,因為有了原理圖,才能知道led連接到了哪個引腳上,然后才能控制這個引腳,從而控制led。
下面是led的原理圖:
從上圖可以知道連接led的引腳網(wǎng)絡標號,然后通過網(wǎng)絡標號找到和連接器相連的引腳:
??
然后再通過連接器上的網(wǎng)絡標號到核心板原理圖pdf上去找對應的處理器的引腳:
??
??
好了現(xiàn)在知道了處理器引腳名稱了,接著到4412手冊pdf上搜到這兩個引腳相關的寄存器,然后控制即可。
這里的話控制很簡單,只要先設置為輸出,然后輸出高電平就點亮,輸出低電平就熄滅即可:
??
??
??
??
led2 | GPL2_0 | ?? |
led3 | GPK1_1 | ?? |
??
??
??
??
??
下面寫流水燈的C程序:
接下來是Makefile的編寫:
接下來就是執(zhí)行了,但是出現(xiàn)了如下錯誤:
不知道怎么回事,上次還有用的。不管了,既然沒檢測到,肯定是路徑沒添加,所以添加下:
添加:
使 .bashrc生效
再次運行make,OK! 執(zhí)行成功:
??
接下來就是把led.bin下載到開發(fā)板上:
??
說明:
得到了led.bin,根據(jù) 裸機教程.pdf ,通過現(xiàn)成的uboot功能,把led.bin下載到了0x40008000這個地址,不是太清楚這個地址是干嘛用的。原以為程序當然是加載到內存中運行的,但是我不知道這里的意思是什么?是不是把程序搬到了這個地址0x40008000,然后還要搬到再搬到內存里面去執(zhí)行?還是說0x4000800本來就是內存地址也就是下載到了DRAM上?不過按道理說,應該不是直接下載到內存上吧,應該是先下載到eMMC上吧。
??
我看了4412手冊描述存儲映射的那章:
但是不太清楚這個DMC到底是個什么地址,而且也沒有找到DDR的映射區(qū)域,不知道怎么回事???
用折半法試了下,只有0x40000000到0x5FFFFF0A這段地址段可以通過dnw.exe把led.bin下載過去,led.bin占232字節(jié)(指的是教程提供的led.bin,自己的led.bin大小不是這個)。也就是大概511M的空間,我奇怪的是為什么其他區(qū)域不可以呢,畢竟這塊板子的eMMC有4G的空間???不明所以。
??
0x5ffffe22+0xe8=0x5FFFFF0A
0x5FFFFF0A-0x4000000=0x1FFFFF0A=536870666(10)
536870666B/1024/1024=511.9998
512MB=536870912B
??
先把當下的事情干好,想一下是不是。
??
lmosem-exynos4412:iTOP-4412裸機開發(fā)環(huán)境
標簽:android style log com http it si 使用 la
原文:http://www.cnblogs.com/dcscodelife/p/5790977.html
聯(lián)系客服