2440裸機(jī)學(xué)習(xí)心得(下)
NOR和NAND是現(xiàn)在市場上兩種主要的非易失閃存技術(shù)。Intel于1988年首先開發(fā)出NOR flash技術(shù),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。
NOR比較好操作,因為集成了系統(tǒng)地址線和數(shù)據(jù)線在芯片內(nèi),而NAND只有8個I/O,要操作,還需要結(jié)合相應(yīng)硬件,如2440里有的NAND控制器。
14、基于OHCI的USB主機(jī)(僅做了枚舉)
發(fā)現(xiàn)了一個很好的博客講這個的:http://lancelot.blog.51cto.com/393579/328233
部分經(jīng)典內(nèi)容摘要:
在OHCI規(guī)范中,最重要的幾個概念是端點(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個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)前命令的最后一個TD,這樣才能確保整個ED處理完畢。
進(jìn)行U盤的數(shù)據(jù)傳輸時需要通過批量傳輸端口收發(fā)數(shù)據(jù),所使用的協(xié)議為Mass Storage協(xié)議
要學(xué)習(xí)的一種數(shù)據(jù)結(jié)構(gòu)與結(jié)構(gòu)體結(jié)合應(yīng)用的模式:
聲明時:
typedef struct _ED {
…………
} ED,*P_ED;
__inline void CreateEd(unsigned int EDAddr,………….)
{
P_ED pED = (P_ED) EDAddr;//這個在函數(shù)中創(chuàng)建結(jié)構(gòu)體pED來初始化
pED->Control =…………………….
}
調(diào)用時,因16字節(jié)對齊:
__align(16) EDed;(聲明)
CreateEd(
(unsigned int) &ed,// ED Address
………….
);
簡單的USB設(shè)備枚舉,讀取描述符:(控制傳輸步驟)
搞好最重要的3個數(shù)據(jù)結(jié)構(gòu):
端點描述符ED,傳輸描述符TD和共享數(shù)據(jù)域HCCA
由于HCCA只是創(chuàng)建一個空間域,不需要初始化
而ED和TD在設(shè)備枚舉時需要不同初始化,故還要創(chuàng)建兩個
初始化結(jié)構(gòu)體函數(shù):CreateEd和CreateGenTd
初始化OCHI寄存器(僅限枚舉部分,不涉及中斷)
復(fù)位,設(shè)置幀間隔,初始化HcDoneHead,設(shè)置HC為運(yùn)行狀態(tài)
寫HCCA(開拓一片域)
檢測是否有USB設(shè)備
設(shè)一定的時間檢測,如for(i=0;i<100000;i++)
設(shè)備枚舉的5個過程:第一步,主機(jī)得到設(shè)備描述符
第二步為設(shè)備分配地址
第三步,主機(jī)用新的地址再次獲取設(shè)備描述符
第四步,主機(jī)讀取設(shè)備全部配置描述符
第五步,主機(jī)發(fā)送SETUP數(shù)據(jù)包,用以設(shè)置配置,允許所有端點進(jìn)入工作狀態(tài)。
注意:控制寫傳輸需要3個TD:第一個發(fā)送Setup包,第二個用于接收握手或零長度的數(shù)據(jù)包,第三個用于發(fā)送狀態(tài);
控制讀傳輸需要4個TD:第一個發(fā)送Setup包,第二個用于接收數(shù)據(jù),第三個用于發(fā)送一個零長度的數(shù)據(jù)包,,第四個用于接收狀態(tài)
具體有兩種方法判斷TD是否傳送完成:
中斷法
初始化好中斷寄存器rHcInterruptEnable |= (1<<1)|(1<<31);
rHcInterruptStatus |= (1<<1);
pISR_USBH = (int)USBH_interrupt;
rINTMSK = ~BIT_USBH;
當(dāng)有TD完成時,便進(jìn)入中斷。
如何判斷枚舉過程中每一步是否最后一個TD完成呢?
可以通過TD創(chuàng)造函數(shù)中DelayInterrupt即DI變量設(shè)置來巧妙解決
當(dāng)DI=0x7時,即使TD完成也不會進(jìn)入中斷的,故可以只在每一階段最后的TD設(shè)為非0x7,其余的設(shè)為0x7,這樣進(jìn)入中斷就代表是最后數(shù)據(jù)發(fā)送完成了
2、狀態(tài)檢測法:
可以通過rHcCommandStatus寄存器中第二位是否1來判斷Controllistfilled。
當(dāng)其為1時,表示還有TD在隊列,沒發(fā)送完成
為0時,表示無TD在隊列,全部發(fā)送完
可以這樣檢測:while(rHcCommandStatus&&0x02)
{
Delay(50);
}
具體的UFI讀寫設(shè)備參考網(wǎng)上的吧(弄了很久,還沒弄成功)
1、查詢
2、讀余量
3、讀寫扇區(qū)
好啦,到這里,算是結(jié)束了,開始帶LINUX系統(tǒng)的真正學(xué)習(xí)啦,GO
一切都會有新的開始。。。。。。。。。。
關(guān)鍵詞:
2440v裸機(jī)學(xué)
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論