-------------------------------------
2011.02.28-------------------------------------
1.
原本DPSRAM在CPU端與FPGA端的Memory map空間是同一塊,但是有byte addressing與word addressing的差異
但是依照上述方式測試時有錯,後來發現在Driver中已經先行把輸入的address*2
使的FPGA端與CPU端的都是以word addressing的方式存取DPSRAM
2.
測試並確定
FPGA的4 bit address (0x0~0xF) 對應到CPU的address為(0x180~0x18F)
3.
DPSRAM Interface電路完成但尚未測試完全
-------------------------------------
2011.02.19-------------------------------------
MVC100透過IDE HDD與FPGA進行溝通
溝通方式是在MVC100版子有塊Dual Port SRAM(DPSRAM)
CPU跟FPGA皆可以存取此塊DPSRAM再加上介面提供的Interrupt機制
CPU與FPGA便可以透過DPSRAM交換資料
但是交換資料的協定必須要自己設計
目前的規劃是以CPU主動下命令給FPGA
CPU把read / write command、address、size寫入到DPSRAM上,並且發出interrupt給FPGA
FPGA收到interrupt後,便讀取DPSRAM上的命令,依據讀取到的命令做動作:
1. CPU發出Read指令 :
FPGA將CPU要讀取的資料寫入到DPSRAM上,並且發出Interrupt給CPU來讀取
2. CPU發出Write指令:
FPGA等待第二次CPU發出的interrupt通知 (第一次interrupt是Read/Write命令)
收到Interrupt,便讀取DPSRAM上的data,並寫入到FPGA的SRAM
目前正在以上述的協定改電路以及Driver
-------------------------------------
2011.01.23-------------------------------------
因為目前MVC100的板子還在測試
因此士敦學長希望可以試著在friendly arm上跑MPI測試
但由於需要額外安裝MPI所需的物件 如:python、ssh
再加上士敦學長使用的arm-linux-gcc版本不同
因此需要重編他修改過的MPI
後來直接借他一顆friendly arm移植MPI
MVC100目前已經可以跑一輝學長的sram與fpga溝通範例
OS: linux2.6.28 (沒有android)
因為排線目前只接出部分sram的address與data腳位
只能使用4個bit address[3:0]、data[3:0]
範例執行結果:
接下來會試著修改driver以及範例電路為我的InterConnect架構
-------------------------------------
2011.01.17-------------------------------------
Friendly arm已經把傳輸的protocol寫入到driver
並且也已經改成士敦學長的架構 (每個connection對應一個file descriptor)
剩下system call poll()還沒有實做
MVC100用廠商附的linux 2.6.28加上driver編譯完成
但是廠商附得file system是read-only的,所以在開機完後drvier掛不上去
這部份文森學長還要花點時間幫忙
所以就先換跑android版本的範例,但是一輝學長給的kernel image在開機的時候會有kernel panic的問題,我會再去問一下或者我目前有也有重編的android版本的linux kernel(2.6.27)再測看看
-------------------------------------
2011.01.10-------------------------------------
friendly arm更改linux char driver的kernel function
原先使用memcpy()去存取fpga對應的virtual address
改成宗胤學長建議的ioread() , iowrite()
發現read指令的CS , OE訊號會有兩個low trigger的情況 沒有了
把呼叫driver的file descriptor函式換成linux system call
int open(const char *pathname, int flags)
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
不使用c lib提供的fopen fread fwrite
就會解決driver command延遲的問題
mvc100目前正試著執行一輝學長的範例
目前順利編譯好linux kernel 2.6.28
但是開機後掛載driver的步驟還有問題 要再請教一下學長
-------------------------------------
2010.12.29-------------------------------------
搞定第三顆ARM了 (把sdcard的資料刪一刪後就又可以使用了)
另外還有跟士敦學長討論MPICH2 Multi-Arm driver的部分
因為學長目前的架構是每個connection各有一個file descriptor負責處理傳輸
如下圖
因此使用者呼叫Driver時不需要給driver 目的ARM對應的memory map addr
driver自行根據fd的minor number判斷目的ARM的memory map addr
呼叫driver的方式使用linux system call :
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
而我目前的架構是一個file descriptor負責所有的connection傳輸
如下圖
因此使用者呼叫Driver時要給driver 目的ARM對應的memory map addr
呼叫driver的方式使用C Lib的:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
目前會再做一版driver配合MPICH2的修改
還有跟文森學長借MVC100測一下InterConnect Circuit、Driver、EBI...
-------------------------------------
2010.12.20
-------------------------------------
Driver裡的read , write函式
write(struct file *filp, const char *buff, size_t count, loff_t *offp)
read(struct file *filp, char *buff, size_t count, loff_t *offp)
其中count可以拿到使用者API要存取的總size大小 bytes
例:
fwrite(DataBuf , size , cnt , fd);
則driver裡收到的count大小為 size * cnt (單位bytes)
並且測試後發現說fwrite(DataBuf , size , cnt , fd);
cnt並不能決定write(struct file *filp, const char *buff, size_t count, loff_t *offp)被呼叫的次數
是write()的return值決定呼叫次數
例:
fwrite(DataBuf , size=1 , cnt=10 , fd); //總共10 bytes資料要寫入
write(struct file *filp, const char *buff, size_t count, loff_t *offp)
{
...
return 5; //假設每次呼叫都只寫入5 bytes
}
則OS會去呼叫write()兩次來符合總大小10 bytes
因此做過一個測試就是故意讓write()只return 0;
發現write()函式會一直被呼叫
但是read(struct file *filp, char *buff, size_t count, loff_t *offp)
不論fread(DataBuf , size , cnt , fd); 的 size * cnt 值為多少
count的值始終是4096
在無法得知總bytes的情況下,我改成從FPGA上的PacketSize取得要讀取的總bytes
歸納一下目前做的
1. write(struct file *filp, const char *buff, size_t count, loff_t *offp)
a . OS會一直呼叫write()直到return value總合等於API要求的大小
b . 測試發現不能寫成只呼叫一次write()就把所有資料(比如10bytes)寫到FPGA電路上
假設呼叫write()一次,寫8 bytes,則只有前2 bytes被寫出去
所以後來寫成每次呼叫只寫2 bytes
c . blocking , 直到寫完API要求的大小才停止
2. read(struct file *filp, const char *buff, size_t count, loff_t *offp)
a . OS同樣會一直呼叫read()直到return value總合等於API要求的大小
但是在return value總和還沒達到API要求的大小時 , 出現return 0
則OS不會再繼續呼叫read()並且fread()的return size為目前的總bytes(不一定等於API要求的大
小)
但是write()並不會因為有return 0出現,OS就停止呼叫write()
而是會繼續呼叫write()直到return值符合為止
b . read()可以一次呼叫就把所有的資料讀進來
假設呼叫read()一次,讀10 bytes,可以正常讀取
因此read()我實作成呼叫一次就讀完8 bytes(看API層要求的大小決定)資料
c . blocking , 直到讀完API要求的大小才停止
但是寫完上述的driver function
發現在每次讀寫memory前,必須先去檢查PacketSize的值的動作會有錯誤
(PacketSize就是記錄目前這塊memory裡面有多少bytes的資料)
原因是因為driver command延遲的問題
driver呼叫write()後memory bus應該要馬上有訊號發出
但是mini2440的卻會延遲直到read()被呼叫後memory bus才發出write()的訊號
但是write()的實作動作為 , 寫memory前要先檢查PacketSize是否為0
否則就要block , 等待PacketSize = 0時才可以做寫入的動作
但是延遲的關係 , 當下抓到的PacketSize值並不是memory bus有動作所抓到的值
例:
fwrite(); //block在迴圈裡 一直檢察PacketSize
fread(); //memory bus的訊號發出write()的訊號
如上 PacketSize的值並不是實際電路上的PacketSize值
而且也無法抓到 因為block住的關係 fread()無法被呼叫
同樣read()也有此問題
-------------------------------------
2010.12.13
-------------------------------------