新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440裸機學習心得(下)

        2440裸機學習心得(下)

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

        上一頁 1 2 3 下一頁

        關鍵詞: 2440v裸機學

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黔西| 普陀区| 财经| 绥化市| 文水县| 西丰县| 收藏| 铁岭市| 资中县| 如东县| 潮州市| 桂林市| 冕宁县| 南江县| 锡林郭勒盟| 定兴县| 本溪| 台南县| 南通市| 巢湖市| 固镇县| 洮南市| 会同县| 永安市| 呼伦贝尔市| 南汇区| 临颍县| 泗洪县| 靖远县| 抚顺县| 无为县| 昆明市| 监利县| 襄汾县| 兖州市| 根河市| 吉林市| 湖南省| 台东市| 满洲里市| 中阳县|