vxworks嵌入式操作系統下串行設備驅動程序開發思路
1. 概 述
我們在基于vxworks嵌入式操作系統開發產品時,經常會根據自行設計的硬件電路開發專用的驅動程序。Vxworks下的驅動程序根據設備的不同特性,,大體可分為:char driver、serial driver、bLOCk driver、end driver、scsi driver等類型,其中以char driver最簡單,最基礎,以serial driver最常用。掌握驅動程序的基本工作流程,無論對我們開發上層的應用還是自己編寫相應的驅動程序,都很有幫助。本文主要以i8250串口驅動程序為例,介紹一下串行驅動程序編寫的基本思路。
驅動程序,簡而言之就是對具體的硬件設備進行管理和服務的程序。為了提高代碼的可移植性,vxworks將所有的輸入/輸出設備都看成是一個文件,我們對設備的輸入/輸出操作,都可以看作是對指定文件的讀寫操作。例如,我們用c 標準庫函數open()打開一個文件,可以是打開一個傳統意義上的文本文件,也可以是指定一個輸入/輸出設備,如指定對某一個串口的輸入/輸出操作。在vxworks操作系統中,驅動程序的主要作用是完成對相關設備的讀、寫、打開、建立、關閉及控制等功能中的一項或幾項,具體情況視具體的設備及設計要求而定。
概括的說,驅動程序主要完成以下幾項工作:
(1)相關設備的初始化。
(2)底層輸入/輸出函數與上層標準輸入/輸出函數的掛接。
(3)相關設備與對應驅動程序的掛接。
我們就按照這個思路,以I8250串口為例,分析一下串行設備驅動程序的編寫及加載流程。首先,給出串行設備驅動的結構框圖:
需要說明的是,ttyDrv是一個虛擬的設備驅動,與tylib一起,用于處理I/O系統與底層實際設備之間的通信。主要完成以下工作:
(1)處理I/O系統的各種需求,如在driver talbe 中添加相應的驅動條目、創建設備標識符(devise descriptor)。
(2)實現與上層標準I/O函數及實際驅動程序的無縫連接。其中,ttyDrv完成open和ioctl兩項功能(ttyopen()和ttyioctl())。Tylib完成read和write兩項功能(tyRead()和tyWrite())。
(3)管理輸入/輸出數據緩沖區。
下面,我們結合圖(一)給出的框圖,以i8250為例,開始分析串行設備驅動的設計流程。用戶在編寫自己的驅動程序時,可以不按照系統函數命名的方法命名,也可以不按照系統給定的方法進行函數功能的劃分,但其初始化及實現流程卻不能改變。
2. 驅動程序設計流程分析
⑴ i8250相關硬件設備的初始化。
編寫驅動程序的第一步是完成相關硬件的初始化。與I8250相關的硬件初始化函數主要有以下三個:sysSerialHwInit()、i8250HrdInit()、i8250InitChannel(),其調用順序是:sysSerialHwInit()ài8250HrdInit()ài8250InitChannel(),這條工作鏈的主要作用是,完成對I8250_CHAN數據結構的初始化。
下面對分別這幾個函數的功能介紹一下:
l
sysSerialHwInit()
本函數完成的主要任務是初始化設備的中斷向量、串口的通信模式及相關存貯器,在函數的最后調用i8250HrdInit()對I8250_CHAN結構進一步初始化。
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操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論