0 引言
隨著激光雕刻機的不斷發展和改進,嵌入式Linux的激光雕刻機比CNC(Computer numerical control)激光雕刻的優(you) 勢不斷顯現,它大幅度提高了處理能力,方便了設計開發,節約了成本,是未來經濟型激光雕刻機發展的趨勢。而嵌入式ARM(Advanced RISC Machines)Linux步進電機驅動是實現激光雕刻的核心。
嵌入式開發過程中,經常需要為(wei) 特定設備開發驅動程序。這些驅動程序的編寫(xie) 和編譯與(yu) PC上的Linux驅動開發相比存在明顯的差異,需要考慮的因素較多,實現過程較為(wei) 複雜。本文以Samsung公司的友善之譬S3C2440開發板為(wei) 例,探討如何使用嵌入式Linux開發字符設備驅動程序來驅動步進電動機。
1 硬件係統設計方案
控製係統由處理器、步進電機驅動器、步進電機3部分組成,如圖1所示。

處理器用友善之譬QQ2440V3開發板,內(nei) 核為(wei) ARM920T。步進電機驅動器采用北京和利時電機技術有限公司(原四通電機)的SH-20403。驅動器共有四路輸入信號:公共、脈衝(chong) 信號輸入、方向信號輸入和脫機信號輸入。驅動器的輸入信號既可以采用共陽極也可以采用共陰極接線方式,使用共陽極模式時,應將輸入信號的電源正極連接到公共端,將輸入信號連接到對應的信號端子,信號低電平有效,此時對應的內(nei) 部光耦導通,控製信號輸入驅動器中;對應共陰極模式時,將輸入信號的電源負極連接到公共端,信號高電平有效,我們(men) 采用的是共陽極接法。
控製步進電機驅動器的時序如圖2所示。

2 步進電機驅動係統設計
Linux內(nei) 核結構體(ti) 係可分為(wei) :應用程序、庫函數、操作係統(內(nei) 核)、驅動程序。在Linux操作係統中,驅動程序是操作係統內(nei) 核與(yu) 硬件設備的直接接口,驅動程序屏蔽了硬件的細節,驅動程序是內(nei) 核的一部分,它具有以下功能:
對設備初始化和釋放:比如向內(nei) 核注冊(ce) 這個(ge) 程序,這樣應用程序傳(chuan) 入文件名時,內(nei) 核才能找到相應的驅動程序。
對設備進行管理,包括實時參數設置以及提供對設備的操作接口。
讀取應用程序傳(chuan) 送給設備文件的數據並回送給應用程序請求的數據。
檢測是處理設備出現的錯誤。
如圖3所示,應用程序通過Linux係統的調用實現與(yu) 內(nei) 核通信。由於(yu) Linux中將設備當做文件處理,所以對設備進行操作的調用和對文件操作的操作類似,主要包括open()、read()、write()、ioctl()、close()等接口函數。應用程序發出係統調用命令後,會(hui) 從(cong) 用戶態轉到內(nei) 核態,通過內(nei) 核將openO等的係統調用轉換成對物理設備的操作。在Linux中通過分層實現對物理設備的調用,這樣使得內(nei) 核的結構清晰,提高了模塊化的獨立性。

2.1 嵌入式Linux設備驅動程序的框架
Linux係統設備分成三種基本類型:字符設備、塊設備、網絡設備。每個(ge) 模塊通常實現其中某一種:字符模塊、塊模塊或網絡模塊。
嵌入式設備驅動整體(ti) 可分以下兩(liang) 部分:
(1)硬件設備接口層。這部分主要描述驅動程序與(yu) 設備的交互。
(2)驅動與(yu) 內(nei) 核接口層,它實現驅動模塊在Linux內(nei) 核的注冊(ce) 加載與(yu) 卸除工作。
對於(yu) 驅動程序與(yu) 內(nei) 核接口層,Linux提供了標準的入口點函數init_functionO;在通過模塊化的設計方法設計驅動程序時,使用insmod加載核心模塊時會(hui) 調用本函數,通知內(nei) 核對驅動程序進行注冊(ce) 。模塊的卸除工作與(yu) 加載工作類似,通過rmmod卸載模塊時,調用cleanup_funct-ion0取消驅動程序的注冊(ce) 。
2.2 GPIO的步進電機驅動開發
GPIO(General Purpose Input Output)的步進電機驅動可以歸類為(wei) Linux設備驅動的字符設備驅動,以下是開發它的一些具體(ti) 步驟。
2.2.1 開發步驟
(1)模塊化驅動程序
寫(xie) 字符設備的驅動程序時,也要遵守模塊化編程的一般規範。設備模塊在用戶空間的初始化和終止:
Init_mnodule()向內(nei) 核注冊(ce) 模塊提供數據結構、局部和全局變量。
Cleanup_module()取消所有init_module在內(nei) 核中的注冊(ce) 。
(2)設備模塊在內(nei) 核空間的內(nei) 存申請和釋放
kmalloc()函數分配一段內(nei) 存,這樣就實現了Chrdevs向量表中指向設備驅動程序名稱的指針。使用kfree釋放內(nei) 存。
(3)字符設備主設備號和次設備號的分配
主設備號標誌設備對應的驅動程序,內(nei) 核利用主設備號將設備與(yu) 相應的驅動程序對應起來。主設備號的取值範圍是O~255,如果不善加規劃,則容易造成主設備號的衝(chong) 突。
次設備號由驅動程序使用,內(nei) 核的其他部分並不使用它,僅(jin) 將它傳(chuan) 遞給驅動程序。
(4)設備模塊在內(nei) 核空間的注冊(ce) 與(yu) 注銷
字符設備的注冊(ce) 有兩(liang) 種方法,一種是常用注冊(ce) 方法,通過係統函數registel_chrdev()將設備加入到係統設備列表中;另一種是devfs技術,通過係統函數devfs-regisrer()實現設備的注冊(ce) 。注銷與(yu) 注冊(ce) 相反,分別調用unregister_chrdev()函數和devfs_unregister()函數。
(5)設備模塊在內(nei) 核空間提供係統調用的函數設備驅動程序在注冊(ce) 成功以後,用戶可以通過訪問設備特殊文件(一般情況在/dev目錄下)實現係統調用。
GPIO驅動程序隻需要一個(ge) file operations數據結構體(ti) 就可以了。
2.2.2 驅動開發
要寫(xie) 實際的驅動,就必需了解相關(guan) 的硬件資源。比如:用到的寄存器、物理地址、中斷等。在這裏,它用到如下硬件資源,如表2所示。

要用操作所用到的IO口,就要設置他們(men) 所用到的寄存器,我們(men) 需要調用一些現成的函數或者宏,比如:
/*每個(ge) port有16個(ge) 引腳,而每個(ge) 引腳由兩(liang) 位來配置,所以你看到32×N。 32表示一個(ge) port的配置寄存器,而N代表是第幾個(ge) 端口。而這裏的offset表示的是第幾個(ge) 引腳。*/

S3C2440開發板中GPIO的許多引腳是和地址線、數據線、串口線等引腳複用的。所以我們(men) 必須對GPIO進行重新定義(yi) 和配置。一般來說,寫(xie) 驅動可以在內(nei) 核中找相近的驅動程序,以它為(wei) 模板進行開發,有時也要從(cong) 零開始,這次作者在內(nei) 核Linux-2.6.13-qq2440\kernel2.6.13\drivers\char中的qq2440 led.c進行修改。

最後定義(yi) 了file_operations和各種API函數,配置了init和exit函數以及module_exit和module_init。
驅動開發完後,要進行測試。把編寫(xie) 好的驅動程序在PC機上進行交叉編譯。然後用命令#insmod stepper.ko加載模塊到內(nei) 核中,通過命令#rmmod stepper.ko可以卸載模塊。用mknod/dev/stepper 1000 0建立與(yu) 驅動程序相應的設備節點。編寫(xie) 相應的應用程序。在應用程序中打開步進電機的設備文件,通過調用ioctl(fd,1&dir,O),運行應用程序,查看步進電機的轉向。
3 結論
本文在S3C2440開發板下實現了步進電機的控製。給出了簡單的驅動程序,實驗結果表明驅動運行正常、穩定。但對於(yu) 實現傳(chuan) 能激光雕刻的圖形及灰度雕刻,還有待於(yu) 進一步的完善。#p#分頁標題#e#
轉載請注明出處。







相關文章
熱門資訊
精彩導讀



















關注我們

