新聞中心

        EEPW首頁 > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > Samsung S3C2440平臺(tái)上的Vxworks BSP移植

        Samsung S3C2440平臺(tái)上的Vxworks BSP移植

        作者: 時(shí)間:2011-08-16 來源:網(wǎng)絡(luò) 收藏
        部分代碼修改如下:

        本文引用地址:http://www.104case.com/article/178741.htm

          /*添加了對(duì)串行口UART的初始化,配置了UART的一些控制寄存器,并設(shè)置了波特率,部分代碼如下*/

          InitUART:

          #define UART_BRD (( 50750000 / (115200 * 16)) - 1)

          mov r2,#UART_BRD /*設(shè)置串口的波特率 */

          /*初始化堆棧指針*/

          ldr sp, L$_STACK_ADDR

          mov fp, #0

          在建立堆棧之后,系統(tǒng)就具備了高級(jí)語言的執(zhí)行條件,后續(xù)的代碼就可以用C語言來實(shí)現(xiàn)了。

          /*使程序跳轉(zhuǎn)至C語言程序段代碼如下*/

          #if (ARM_THUMB)

          ldr r12,L$_rStrtInRom

          orr r12,r12, #1

          bx r12

          #else

          ldr pc,L$_rStrtInRom /*跳轉(zhuǎn)到romStart()中執(zhí)行*/ #endif

          CPU將執(zhí)行權(quán)轉(zhuǎn)移給romStart()之后。該函數(shù)就使內(nèi)存清空,然后把整個(gè)引導(dǎo)映像復(fù)制到內(nèi)存中,最后將CPU的控制權(quán)交給usrInit()。

          修改sysLib.c

          文件sysLib.c提供VxWorks和應(yīng)用程序間的板級(jí)聯(lián)系,這里重點(diǎn)介紹一下內(nèi)存映射函數(shù)。

          目標(biāo)系統(tǒng)開啟了MMU模塊,在sysLib.c文件里面就定義了一個(gè)sysPhysMemDesc[ ]表。部分代碼如下所示:

          PHYS_MEM_DESC sysPhysMemDesc [] =

          { (void*) (ROM_BASE_ADRS+0xf0000000), (void *) (ROM_BASE_ADRS),

          ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE),

          VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE,

          VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT

          }

          上面一小段代碼是對(duì)ROM_BASE_ADRS 的內(nèi)存映射,ROM_BASE_ADRS+0xf0000000是要映射的虛擬地址,ROM_BASE_ADRS是硬件設(shè)計(jì)時(shí)定義的實(shí)際物理地址,ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE)是映射長度,VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE是可初始化的地址狀態(tài),VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT是實(shí)際初始化的地址狀態(tài)。

          若添加新的外設(shè),該外設(shè)對(duì)應(yīng)的內(nèi)存空間必須在sysPhysMemDesc[]中配置。通過這樣的配置就完成了內(nèi)存映射和MMU的開啟。

          修改dm9kEnd.c

          由于使用的是DM9000網(wǎng)卡。要做好DM9000網(wǎng)卡的END驅(qū)動(dòng)首先要初始化網(wǎng)卡的數(shù)據(jù)結(jié)構(gòu)dm9kDevice,這個(gè)數(shù)據(jù)結(jié)構(gòu)如下:

          typedef struct dm9kDevice

          {

          END_OBJ endObj; /*繼承類 */

          int unit; /*設(shè)備單元號(hào) */

          UINT32 flags; /* 本地標(biāo)志信號(hào)*/

          int ivec; /* 中斷向量 */

          int ilevel; *中斷級(jí) */

          ……

          } DM9K_DRV_CTRL

          數(shù)據(jù)結(jié)構(gòu)中的END_OBJ類型成員、網(wǎng)卡單元號(hào)、中斷號(hào)和中斷向量是網(wǎng)卡驅(qū)動(dòng)中必須包含的成員元素。

          驅(qū)動(dòng)的部分接口函數(shù),主要包括網(wǎng)卡加載函數(shù)dm9kEndLoad、網(wǎng)卡啟動(dòng)函數(shù)dm9kStart、停止網(wǎng)卡函數(shù)dm9kStop、網(wǎng)卡控制函數(shù)dm9kIoctl、網(wǎng)卡卸載函數(shù)dm9kUnload、網(wǎng)卡發(fā)送函數(shù)dm9kSend、獲取組播地址函數(shù)dm9kMCastGet、啟動(dòng)輪詢模式函數(shù)dm9kPollStart、關(guān)閉輪詢模式函數(shù)dm9kPollStop、輪詢模式發(fā)送函數(shù)dm9kPollSend、輪詢模式接收函數(shù)dm9kPollRcv等,通過對(duì)這些接口函數(shù)編寫功能,實(shí)現(xiàn)網(wǎng)卡驅(qū)動(dòng)。

          在編寫驅(qū)動(dòng)的過程中,還必須注意:由于目標(biāo)板用一種100pin的DM9000芯片,這種芯片除了有CMD信號(hào)之外,還有6根地址片選信號(hào)SA4~SA9,根據(jù)SA4~SA9對(duì)應(yīng)的CPU地址線和數(shù)據(jù)手冊(cè)上引腳定義,可以計(jì)算出網(wǎng)卡的端口地址,如果SA4~SA9對(duì)應(yīng)CPU地址的addr4~addr9,那么網(wǎng)卡端口基址就是0x18000300,這樣可以計(jì)算出網(wǎng)卡的基地址。

          

          圖2 VxWorks COM1口的打印信息



        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 红桥区| 新蔡县| 曲麻莱县| 宁安市| 儋州市| 浪卡子县| 蚌埠市| 新安县| 墨玉县| 化德县| 阿拉善左旗| 阿坝县| 通城县| 青田县| 台南县| 延长县| 黑水县| 七台河市| 洮南市| 黎平县| 庐江县| 浑源县| 株洲县| 区。| 宁阳县| 仁布县| 晋州市| 石楼县| 昆山市| 隆安县| 罗城| 常州市| 昌图县| 凤阳县| 长宁区| 柯坪县| 荥经县| 新泰市| 哈尔滨市| 辛集市| 陇南市|