新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 2440裸機(jī)學(xué)習(xí)心得(下)

2440裸機(jī)學(xué)習(xí)心得(下)

作者: 時(shí)間:2016-11-29 來源:網(wǎng)絡(luò) 收藏
NOR和NAND是現(xiàn)在市場上兩種主要的非易失閃存技術(shù)。Intel于1988年首先開發(fā)出NOR flash技術(shù),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。
NOR比較好操作,因?yàn)榧闪讼到y(tǒng)地址線和數(shù)據(jù)線在芯片內(nèi),而NAND只有8個(gè)I/O,要操作,還需要結(jié)合相應(yīng)硬件,如2440里有的NAND控制器。
14、基于OHCI的USB主機(jī)(僅做了枚舉)
發(fā)現(xiàn)了一個(gè)很好的博客講這個(gè)的:http://lancelot.blog.51cto.com/393579/328233
部分經(jīng)典內(nèi)容摘要:
在OHCI規(guī)范中,最重要的幾個(gè)概念是端點(diǎn)(EndPoint - ED)、傳輸描述符(Transport Descriptor - TD)、主機(jī)控制器通信區(qū)(HCCA)。其中ED負(fù)責(zé)確定傳輸類型(控制傳輸、批量傳輸、同步傳輸和中斷傳輸)。TD確定傳輸參數(shù)。HCCA用于確定數(shù)據(jù)傳輸是否完畢。
OHCI(基本流程)
進(jìn)行控制/批量傳輸?shù)闹饕幚砹鞒倘缦拢?/div>
1、創(chuàng)建控制/批量傳輸?shù)腅D列表;
2、創(chuàng)建ED下的TD列表;
3、設(shè)置命令到相應(yīng)寄存器開始數(shù)據(jù)傳輸;
4、在中斷處理程序中判斷數(shù)據(jù)傳輸是否結(jié)束;
在OHCI層,主要完成如下功能:
l通過控制端口讀寫數(shù)據(jù)(包含SETUP、DATA、STATUS等3個(gè)TD);
l通過控制端口發(fā)送設(shè)置命令(沒有DATA的TD);
l通過批量端口讀數(shù)據(jù);
l通過批量端口寫數(shù)據(jù);
l中斷處理程序;
在OHCI的體系下,判斷數(shù)據(jù)是否傳輸完畢是需要通過中斷程序來判斷的,當(dāng)USB主機(jī)設(shè)置了HcControl和HcCommandStatus寄存器開始傳輸數(shù)據(jù)后,AM9200自動開始數(shù)據(jù)傳輸,并且定期的檢查HcDoneHead寄存器的內(nèi)容,并且將其轉(zhuǎn)移到HCCA.DoneHead。然后產(chǎn)生中斷,觸發(fā)中斷處理程序。
在中斷處理程序中需要判斷當(dāng)前結(jié)束的TD是否是當(dāng)前命令的最后一個(gè)TD,這樣才能確保整個(gè)ED處理完畢。
進(jìn)行U盤的數(shù)據(jù)傳輸時(shí)需要通過批量傳輸端口收發(fā)數(shù)據(jù),所使用的協(xié)議為Mass Storage協(xié)議
要學(xué)習(xí)的一種數(shù)據(jù)結(jié)構(gòu)與結(jié)構(gòu)體結(jié)合應(yīng)用的模式:
聲明時(shí):
typedef struct _ED {
…………
} ED,*P_ED;
__inline void CreateEd(unsigned int EDAddr,………….)
{
P_ED pED = (P_ED) EDAddr;//這個(gè)在函數(shù)中創(chuàng)建結(jié)構(gòu)體pED來初始化
pED->Control =…………………….
}
調(diào)用時(shí),因16字節(jié)對齊:
__align(16) EDed;(聲明)
CreateEd(
(unsigned int) &ed,// ED Address
………….
);
簡單的USB設(shè)備枚舉,讀取描述符:(控制傳輸步驟)
搞好最重要的3個(gè)數(shù)據(jù)結(jié)構(gòu):
端點(diǎn)描述符ED,傳輸描述符TD和共享數(shù)據(jù)域HCCA
由于HCCA只是創(chuàng)建一個(gè)空間域,不需要初始化
而ED和TD在設(shè)備枚舉時(shí)需要不同初始化,故還要?jiǎng)?chuàng)建兩個(gè)
初始化結(jié)構(gòu)體函數(shù):CreateEd和CreateGenTd
初始化OCHI寄存器(僅限枚舉部分,不涉及中斷)
復(fù)位,設(shè)置幀間隔,初始化HcDoneHead,設(shè)置HC為運(yùn)行狀態(tài)
寫HCCA(開拓一片域)
檢測是否有USB設(shè)備
設(shè)一定的時(shí)間檢測,如for(i=0;i<100000;i++)
設(shè)備枚舉的5個(gè)過程:第一步,主機(jī)得到設(shè)備描述符
第二步為設(shè)備分配地址
第三步,主機(jī)用新的地址再次獲取設(shè)備描述符
第四步,主機(jī)讀取設(shè)備全部配置描述符
第五步,主機(jī)發(fā)送SETUP數(shù)據(jù)包,用以設(shè)置配置,允許所有端點(diǎn)進(jìn)入工作狀態(tài)。
注意:控制寫傳輸需要3個(gè)TD:第一個(gè)發(fā)送Setup包,第二個(gè)用于接收握手或零長度的數(shù)據(jù)包,第三個(gè)用于發(fā)送狀態(tài);
控制讀傳輸需要4個(gè)TD:第一個(gè)發(fā)送Setup包,第二個(gè)用于接收數(shù)據(jù),第三個(gè)用于發(fā)送一個(gè)零長度的數(shù)據(jù)包,,第四個(gè)用于接收狀態(tài)
具體有兩種方法判斷TD是否傳送完成:
中斷法
初始化好中斷寄存器rHcInterruptEnable |= (1<<1)|(1<<31);
rHcInterruptStatus |= (1<<1);
pISR_USBH = (int)USBH_interrupt;
rINTMSK = ~BIT_USBH;
當(dāng)有TD完成時(shí),便進(jìn)入中斷。
如何判斷枚舉過程中每一步是否最后一個(gè)TD完成呢?
可以通過TD創(chuàng)造函數(shù)中DelayInterrupt即DI變量設(shè)置來巧妙解決
當(dāng)DI=0x7時(shí),即使TD完成也不會進(jìn)入中斷的,故可以只在每一階段最后的TD設(shè)為非0x7,其余的設(shè)為0x7,這樣進(jìn)入中斷就代表是最后數(shù)據(jù)發(fā)送完成了
2、狀態(tài)檢測法:
可以通過rHcCommandStatus寄存器中第二位是否1來判斷Controllistfilled。
當(dāng)其為1時(shí),表示還有TD在隊(duì)列,沒發(fā)送完成
為0時(shí),表示無TD在隊(duì)列,全部發(fā)送完
可以這樣檢測:while(rHcCommandStatus&&0x02)
{
Delay(50);
}
具體的UFI讀寫設(shè)備參考網(wǎng)上的吧(弄了很久,還沒弄成功)
1、查詢
2、讀余量
3、讀寫扇區(qū)
好啦,到這里,算是結(jié)束了,開始帶LINUX系統(tǒng)的真正學(xué)習(xí)啦,GO
一切都會有新的開始。。。。。。。。。。

上一頁 1 2 3 下一頁

關(guān)鍵詞: 2440v裸機(jī)學(xué)

評論


技術(shù)專區(qū)

關(guān)閉