基于ARM+Linux 的儀器控制系統(tǒng)設(shè)計(jì)
在初始化函數(shù)中,首先進(jìn)行設(shè)備的注冊(cè)。主設(shè)備號(hào)表示對(duì)應(yīng)的驅(qū)動(dòng)程序,次設(shè)備號(hào)由內(nèi)核使用,用于正確確定設(shè)備文件所指的設(shè)備。可以動(dòng)態(tài)申請(qǐng)或者靜態(tài)申請(qǐng)?jiān)O(shè)備號(hào)。動(dòng)態(tài)申請(qǐng)使用下面的函數(shù):本文引用地址:http://www.ex-cimer.com/article/160288.htm
dev是一個(gè)只輸出的參數(shù),它在函數(shù)成功完成時(shí)持有分配范圍的第一個(gè)數(shù);firstminor是請(qǐng)求的第一個(gè)要用的次編號(hào);count是請(qǐng)求的連續(xù)設(shè)備編號(hào)的總數(shù);name為設(shè)備名,返回值小于0表示分配失敗。然后通過(guò)major=MMOR(dev)獲取主設(shè)備號(hào)。如果注冊(cè)不成功或者卸載驅(qū)動(dòng)時(shí)需要取消設(shè)備的注冊(cè),使用下面的函數(shù)實(shí)現(xiàn)(其參數(shù)含義同上):
對(duì)于字符型設(shè)備還要定義一個(gè)cdev結(jié)構(gòu)體變量,并使用cdev_init()初始化,然后調(diào)用cdev_add()通知內(nèi)核添加一個(gè)字符設(shè)備。同樣在卸載時(shí)要使用cdev_del()移除,否則用戶使用驅(qū)動(dòng)時(shí),有時(shí)不能打開(kāi)設(shè)備。因?yàn)椴皇褂胏dev或者cdev在模塊卸載時(shí)不刪除會(huì)導(dǎo)致內(nèi)核處在一個(gè)不穩(wěn)定狀態(tài),在用戶層可能無(wú)法打開(kāi)設(shè)備文件。 1.3 I/O端口訪問(wèn)
在系統(tǒng)控制要求中,需要訪問(wèn)ARM的I/O端口,包括普通I/O口和復(fù)用為IRQO的PB29引腳,然而Linux中對(duì)I/O端12和I/0內(nèi)存的讀寫(xiě)指令中使用的都是虛擬地址,所以在訪問(wèn)前要先將物理寄存器地址映射到I/O內(nèi)存。有兩種方法實(shí)現(xiàn)地址映射,一種是使用ioremap為I/O內(nèi)存區(qū)域分配虛擬地址,用iounmap取消,另一種是使用內(nèi)核已經(jīng)定義好的虛擬地址。這里主要介紹第二種方式。
對(duì)于AT91RM9200利用如下轉(zhuǎn)換函數(shù)獲取虛擬地址,其中宏AT91_VA_BASE_SYS是系統(tǒng)虛擬基地址:
讀寫(xiě)端口對(duì)于AT91RM9200還可使用專門(mén)函數(shù)
int at9 1_set_gpio_value(unsigned pin,int value),并包含頭文件asm-arm/arch-at91/gpio.h。一般端口的訪問(wèn)在驅(qū)動(dòng)模塊初始化時(shí)申請(qǐng)資源,在卸載時(shí)釋放資源,而對(duì)于I/O口的使能則在open方法中實(shí)現(xiàn),相應(yīng)的禁用在release方法中實(shí)現(xiàn)。
1.4 ioctl方法的實(shí)現(xiàn)
用戶可以通過(guò)ioctl方法向內(nèi)核發(fā)送各種命令,必要時(shí)傳遞參數(shù),下面展示一個(gè)簡(jiǎn)單實(shí)例。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論