<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動程序開發(fā)思路

          vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動程序開發(fā)思路

          作者: 時間:2012-10-09 來源:網(wǎng)絡(luò) 收藏

          1. 概 述

          我們在基于操作系統(tǒng)開發(fā)產(chǎn)品時,經(jīng)常會根據(jù)自行設(shè)計(jì)的硬件電路開發(fā)專用的。Vxworks下的根據(jù)設(shè)備的不同特性,,大體可分為:char driver、serial driver、bLOCk driver、end driver、scsi driver等類型,其中以char driver最簡單,最基礎(chǔ),以serial driver最常用。掌握的基本工作流程,無論對我們開發(fā)上層的應(yīng)用還是自己編寫相應(yīng)的驅(qū)動程序,都很有幫助。本文主要以i8250串口驅(qū)動程序?yàn)槔?,介紹一下串行驅(qū)動程序編寫的基本思路。

          驅(qū)動程序,簡而言之就是對具體的硬件設(shè)備進(jìn)行管理和服務(wù)的程序。為了提高代碼的可移植性,將所有的輸入/輸出設(shè)備都看成是一個文件,我們對設(shè)備的輸入/輸出操作,都可以看作是對指定文件的讀寫操作。例如,我們用c 標(biāo)準(zhǔn)庫函數(shù)open()打開一個文件,可以是打開一個傳統(tǒng)意義上的文本文件,也可以是指定一個輸入/輸出設(shè)備,如指定對某一個串口的輸入/輸出操作。在操作系統(tǒng)中,驅(qū)動程序的主要作用是完成對相關(guān)設(shè)備的讀、寫、打開、建立、關(guān)閉及控制等功能中的一項(xiàng)或幾項(xiàng),具體情況視具體的設(shè)備及設(shè)計(jì)要求而定。

          概括的說,驅(qū)動程序主要完成以下幾項(xiàng)工作:

          (1)相關(guān)設(shè)備的初始化。

          (2)底層輸入/輸出函數(shù)與上層標(biāo)準(zhǔn)輸入/輸出函數(shù)的掛接。

          (3)相關(guān)設(shè)備與對應(yīng)驅(qū)動程序的掛接。

          我們就按照這個思路,以I8250串口為例,分析一下驅(qū)動程序的編寫及加載流程。首先,給出驅(qū)動的結(jié)構(gòu)框圖:

          需要說明的是,ttyDrv是一個虛擬的設(shè)備驅(qū)動,與tylib一起,用于處理I/O系統(tǒng)與底層實(shí)際設(shè)備之間的通信。主要完成以下工作:

          (1)處理I/O系統(tǒng)的各種需求,如在driver talbe 中添加相應(yīng)的驅(qū)動條目、創(chuàng)建設(shè)備標(biāo)識符(devise descriptor)。

          (2)實(shí)現(xiàn)與上層標(biāo)準(zhǔn)I/O函數(shù)及實(shí)際驅(qū)動程序的無縫連接。其中,ttyDrv完成open和ioctl兩項(xiàng)功能(ttyopen()和ttyioctl())。Tylib完成read和write兩項(xiàng)功能(tyRead()和tyWrite())。

          (3)管理輸入/輸出數(shù)據(jù)緩沖區(qū)。

          下面,我們結(jié)合圖(一)給出的框圖,以i8250為例,開始分析驅(qū)動的設(shè)計(jì)流程。用戶在編寫自己的驅(qū)動程序時,可以不按照系統(tǒng)函數(shù)命名的方法命名,也可以不按照系統(tǒng)給定的方法進(jìn)行函數(shù)功能的劃分,但其初始化及實(shí)現(xiàn)流程卻不能改變。

          2. 驅(qū)動程序設(shè)計(jì)流程分析

          ⑴ i8250相關(guān)硬件設(shè)備的初始化。

          編寫驅(qū)動程序的第一步是完成相關(guān)硬件的初始化。與I8250相關(guān)的硬件初始化函數(shù)主要有以下三個:sysSerialHwInit()、i8250HrdInit()、i8250InitChannel(),其調(diào)用順序是:sysSerialHwInit()ài8250HrdInit()ài8250InitChannel(),這條工作鏈的主要作用是,完成對I8250_CHAN數(shù)據(jù)結(jié)構(gòu)的初始化。

          下面對分別這幾個函數(shù)的功能介紹一下:

          l

          sysSerialHwInit()

          本函數(shù)完成的主要任務(wù)是初始化設(shè)備的中斷向量、串口的通信模式及相關(guān)存貯器,在函數(shù)的最后調(diào)用i8250HrdInit()對I8250_CHAN結(jié)構(gòu)進(jìn)一步初始化。

          void sysSerialHwInit (void)

          {

          int i;

          for (i=0;i

          {

          i8250Chan[i].int_vec = devParas[i].vector; /*初始化中斷向量*/

          i8250Chan[i].channelMode = 0; /*初始化SIO_MODE 可以是INT或POLL*/

          i8250Chan[i].lcr = UART_REG(UART_LCR,i); /*初始化line control register*/

          ………………………

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();