www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]嵌入式Linux字符設備驅(qū)動的設計與應用

摘要:描述了基于嵌入式Linux的字符設備驅(qū)動程序的設計方法和實現(xiàn)過程。以電機、數(shù)碼管、串口和mini鍵盤的驅(qū)動設計為例,詳細闡述了嵌入式linux下字符設備驅(qū)動設計中的關鍵技術,包括設備的設備號、設備的操作及設備的注冊和卸載等。通過編寫相應硬件設備的應用程序,測試設備驅(qū)動的正確性。介紹了Troolltech公司開發(fā)的開源圖形用戶界面庫-Qt,并使用Qt編程方法設計出良好的人機交互界面。試驗結果表明設計的驅(qū)動程序完全正確,可以被應用程序使用。

1引言

隨著嵌入式系統(tǒng)的發(fā)展,嵌入式 Linux以其穩(wěn)定性和開放源代碼的優(yōu)點在嵌入式系統(tǒng)的開發(fā)中得到廣泛應用。越來越多的軟硬件廠商使用嵌入式 Linux來開發(fā)自己的產(chǎn)品,對基于嵌入式 Linux平臺開發(fā)設備的驅(qū)動程序和應用程序的需求在成倍增長。本文通過實現(xiàn)對 PXA255開發(fā)板外圍字符設備(電機、數(shù)碼管、串口和 mini鍵盤)的操作和控制,詳細討論了嵌入式 linux字符設備驅(qū)動的設計與應用。

2系統(tǒng)的設計框架

系統(tǒng)的設計分為字符設備驅(qū)動程序和人機交互界面兩部分。驅(qū)動程序為應用程序提供了操作設備的接口;人機交互界面的設計實現(xiàn)設備應用程序并完成人機交互的功能。整個系統(tǒng)軟硬件的關系如圖 1:字符設備被映射到 Linux文件系統(tǒng)的文件和目錄,通過文件系統(tǒng)的系統(tǒng)調(diào)用接口 open(),write(),read(),close()等函數(shù)訪問字符設備,實現(xiàn)設備的操作。

圖 1 系統(tǒng)軟硬件的關系

3系統(tǒng)字符設備驅(qū)動程序的設計方法

Linux驅(qū)動程序是設備與具體的應用程序的中間層,它提供操作設備的接口,應用程序員不需要知道具體設備工作細節(jié),只要調(diào)用一組標準化的函數(shù)就能完成對設備的操作,這些標準化的函數(shù)與具體的驅(qū)動沒有關系,而將這些函數(shù)映射到作用于具體設備上的操作則與驅(qū)動程序相關[1]。Linux設備分為字符設備,塊設備和網(wǎng)絡設備,字符設備是能夠像字節(jié)流一樣被訪問的設備。以下通過描述字符設備(電動機、數(shù)碼管、串口、mini鍵盤)驅(qū)動的實現(xiàn)方法,深入討論了基于嵌入式 linux的字符設備驅(qū)動的設計方法和實現(xiàn)過程。

3.1初始化函數(shù)與清除函數(shù)

Linux系統(tǒng)中,設備驅(qū)動的初始化函數(shù)負責注冊設備,并完成驅(qū)動程序必要的初始化以及申請中斷等[2],Linux系統(tǒng)使用 module_init宏指定初始化函數(shù)。在初始化函數(shù)中調(diào)用 regiSTer_chrdev函數(shù)向系統(tǒng)注冊字符設備,通過 request_IRq 函數(shù)申請中斷。例如電機設備的初始化函數(shù)如下:

  static int __init moto_init(void){

  int ret;

  ret = register_chrdev(MOTO_MAJOR, "moto", &moto_fops);//注冊電機設備

  if (ret) {

  printk(KERN_ERR "%s: can‘t get major %d.n",

  __func__, MOTO_MAJOR);

  return ret;

  }

  printk(KERN_INFO "%s: register moto device successfully.n", __func__);

  return 0;

  } 其中,register_chrdev函數(shù)的第一個參數(shù)為主設備號,如果為0 則系統(tǒng)為此驅(qū)動程序動態(tài)地分配一個主設備號;第二個參數(shù)是設備名稱,這里是以moto為設備名稱;第三個參數(shù)moto_fops是默認的struct file_operations結構體 [3]。

清除函數(shù)的功能和初始化函數(shù)的功能相反,它將驅(qū)動程序所占用的系統(tǒng)資源、中斷號進行釋放。Linux系統(tǒng)使用 module_exit宏指定清除函數(shù)。

3.2中斷

在 Linux 系統(tǒng)中,中斷是由系統(tǒng)來管理與維護的。中斷服務子程序在初始化函數(shù)中調(diào)用 request_irq 函數(shù)與相應中斷號關聯(lián),并將該中斷的相關信息添加到系統(tǒng)的中斷信息列表中。中斷發(fā)生時, Linux系統(tǒng)響應中斷號來實現(xiàn)中斷處理程序的執(zhí)行。mini鍵盤按鍵觸發(fā)產(chǎn)生中斷號為 SIMPLE_KEY_IRQ的中斷,系統(tǒng)自動檢索并調(diào)用鍵盤中斷服務子程序。鍵盤中斷處理流程如圖 2:

3.3 設備驅(qū)動接口的實現(xiàn)

在Linux內(nèi)核中,字符設備使用 struct file_operations結構體來實現(xiàn)設備的各種操作接口,這些操作主要用來實現(xiàn)系統(tǒng)調(diào)用,命名為 open、read等等。file_operations結構是定義在 <linux/fs.h>中的函數(shù)指針數(shù)組,每個設備文件都與它自己的操作函數(shù)相關聯(lián)。編寫字符設備驅(qū)動程序,主要是實現(xiàn) struct file_operations結構中的各個函數(shù)。

本系統(tǒng)各設備驅(qū)動的設計主要實現(xiàn) open、read、write和 release這四個方法接口。 file_operation結構成員如下: /* DEVICE驅(qū)動程序設備操作方法集 */ struct file_operations device_fops = {

open方法提供給驅(qū)動程序以初始化的能力,從而為以后的操作完成初始化做準備。本系統(tǒng)中存在多個設備共用一個驅(qū)動的情況,驅(qū)動中的 open方法程序框架如下:

  int device_open(struct inode *inode, struct file *filp){ int minor = MINOR(kdev); //次設備號的讀取 switch(minor) {

  case first_device: device_first_vaddr = (unsigned long)ioremap (DEVICE_ FIRST _ADDR, 2);

  ……

  case second_device:

  ……

  default:

  ……

  }  MOD_INC_USE_COUNT; // 遞增模塊引用計數(shù) , 防止模塊在使用中被卸載  if (down_interruptible(&device_mutex)) { …… }; }

1)open方法調(diào)用 MINOR(kdev)宏實現(xiàn)次設備號的讀取,使用 switch語句完成設備的匹配初始化。Linux系統(tǒng)為每一個設備分配了一個主設備號和次設備號。主設備號標識具體的設備驅(qū)動程序,次設備號標識具體設備。開發(fā)板電機設備有直流電機和步進電機,它們的主設備號都是 252,次設備號分別為 0和 1。數(shù)碼管、串口、 mini鍵盤的驅(qū)動設計只針對單個設備,次設備號設計為 0。

2)ioremap函數(shù)在 open方法中實現(xiàn)對電機、數(shù)碼管、串口、mini鍵盤寄存器的訪問。 PXA255處理器有專門的存儲器管理單元(MMU),在驅(qū)動中不能直接對設備 I/O內(nèi)存的物理地址進行讀寫,需要調(diào)用ioremap 等內(nèi)核函數(shù)將寄存器的實際物理地址映射到內(nèi)核統(tǒng)一的地址空間中,從而實現(xiàn)了對物理地址的間接調(diào)用。例如寄存器 DEVICE_ FIRST _ADDR的讀寫操作,通過讀寫 device_first_vaddr變量實現(xiàn)。在 asm/arch/pxa-regs.h頭文件中定義了各種寄存器的宏,文件中的宏變量都是經(jīng)過地址映射的可以直接使用。

release方法的作用正好與 open相反,通過調(diào)用 iounmap函數(shù)撤銷 device設備的虛擬地址映射,同時釋放互斥鎖,遞減模塊引用計數(shù),當模塊引用計數(shù)減到 0時,close函數(shù)才能真正的關閉設備。read和 write方法的任務是相似的,主要完成用戶空間和內(nèi)核空間之間的數(shù)據(jù)拷貝。

read方法程序框架如下:

  ssize_t device_read(struct file *filp, char *buf, size_t count, loff_t *offp){

  ……

  if (copy_to_user(buf, (u8 *)&BUF, count)) { ……} //寫數(shù)據(jù)給用戶空間

  return count; // 返回成功讀取的字節(jié)數(shù) }

其中,copy_to_user函數(shù)實現(xiàn)內(nèi)核空間到用戶空間的數(shù)據(jù)拷貝。應用程序調(diào)用該方法接口實現(xiàn)串口數(shù)據(jù)的接收。

write方法的實現(xiàn)同read方法類似。通過調(diào)用 copy_from_user函數(shù)實現(xiàn)用戶空間到內(nèi)核空間的數(shù)據(jù)拷貝。該方法接口實現(xiàn)串口數(shù)據(jù)的發(fā)送、LED和MOTO控制寄存器的設置。

3.4 驅(qū)動的裝載和卸載

Linux驅(qū)動程序的編譯加載有兩種方式。一種是編譯成模塊在運行時加載,不需要重新啟動內(nèi)核,它使用 insmod工具將驅(qū)動模塊加載進內(nèi)核,使用 rmmod從內(nèi)核中卸載模塊。該方法實現(xiàn)如下:1)編譯驅(qū)動并下載驅(qū)動到開發(fā)板:$ arm-linux-gcc device_driver.c -I /home/eflag/kernel/include/ -c生成 device_driver.o文件,通過 tftp工具下載到開發(fā)板;2)驅(qū)動的加載:$ insmod device_driver.o。設備驅(qū)動的加載成功后,可以編寫應用程序進行設備驅(qū)動的檢測;3)驅(qū)動的卸載:$ rmmod device_driver。

另一種是將驅(qū)動程序靜態(tài)編譯進內(nèi)核,再運行新的內(nèi)核來測試驅(qū)動,該方法是在linux系統(tǒng)字符設備驅(qū)動文件夾linux/driver/char/中加入設備驅(qū)動源程序,同時修改 makefile文件,重新編譯內(nèi)核,下載新內(nèi)核到開發(fā)板,系統(tǒng)啟動后自動加載設備驅(qū)動 [3]。在驅(qū)動加載成功后就可以對該驅(qū)動的設備進行讀寫等操作。 4 Qt人機界面的實現(xiàn)

Qt是由 Troolltech公司開發(fā)的一套開源圖形用戶界面庫。它給應用程序開發(fā)者提供了開發(fā)圖形界面所需的各種功能。Qtopia core是嵌入式環(huán)境下所使用的 Qt,很多嵌入式產(chǎn)品如 PDA、手機都采用 qtopia core的圖形庫作為人機界面設計的框架。本系統(tǒng)使用 qtopia core的圖形庫進行用戶界面的開發(fā)。

4.1 Qt應用程序的設計

Qt的事件驅(qū)動機制是 single/slot(信號/槽)機制,通過 connect函數(shù)連接控件信號(Single)與槽函數(shù)(slot)。首先控件觸發(fā)產(chǎn)生 Single信號,然后由 signal信號觸發(fā)執(zhí)行槽函數(shù)[4]。本系統(tǒng)中槽函數(shù)為具體設備應用程序。

設備應用程序的開發(fā)主要是系統(tǒng)函數(shù)的調(diào)用,如 open(打開設備),read/write(讀寫設備),close(關閉設備)等。本系統(tǒng)設備應用程序開發(fā)如下: RS232收發(fā)數(shù)據(jù)功能; LED跑馬燈功能;操控電機轉(zhuǎn)動功能;mini鍵盤鍵值讀取功能。

Linux系統(tǒng)中設備作為文件被訪問,對設備進行訪問前需建立設備節(jié)點:

  $mknod /dev/device_name c MAJOR MINOR

其中 device_name是設備節(jié)點名, c是字符設備標志, MAJOR是主設備號,MINOR是

次設備號。open函數(shù)使用/dev/device_name作為文件路徑來打開設備。

4.2Qt應用程序的運行

1)編譯 Qtopia core應用程序生成可執(zhí)行文件 application。通過 tftp工具下載可執(zhí)行文件到開發(fā)板;2)開發(fā)板中 application可執(zhí)行文件的運行: $ chomd +x application $ ./application –qws。

LCD顯示器顯示人機交互界面如圖 3,通過輸入設備如鼠標、鍵盤、觸摸屏可以完成設備的操作。

5 總結

實現(xiàn)了電機、數(shù)碼管、串口和 mini鍵盤的驅(qū)動程序和應用程序的開發(fā),設計了人機交互界面。本文作者創(chuàng)新點:詳細分析了嵌入式 Linux下字符設備驅(qū)動程序的構建過程。整個系統(tǒng)的設計和實現(xiàn)過程對嵌入式 Linux系統(tǒng)的開發(fā)有一定的參考價值。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉