蜂鳴器驅動程式設計

2022-10-18 15:30:07 字數 4527 閱讀 3157

嵌入式系統開發技術

課程設計

設計題目: 蜂鳴器驅動程式設計

2023年05月

1.緒論 3

1.1概要 3

1.2設計內容 4

2.開發環境的搭建 4

2.1redhat的安裝 4

2.2安裝arm-linux-gcc交叉編譯器 9

2.3安裝及編譯linux-2.6.29-mini2440-20090708核心 9

3.字元裝置驅動相關知識 9

3.1模組機制 9

3.2字元裝置開發基本步驟 10

3.3主裝置號和次裝置號 11

3.4實現字元驅動程式 12

4.蜂鳴器原理 14

4.1蜂鳴器的種類和工作原理 14

4.2開發板上蜂鳴器原理圖分析 15

4.3gpb0引數 15

5.總體設計 16

5.1設計思路 16

5.2設計步驟 16

6. 驅動及測試程式 17

176.2beep_ 21

7.執行結果及截圖 22

綜合設計總結與思考 25

linux 驅動在本質上就是一種軟體程式,上層軟體可以在不用了解硬體特性的情況下,通過驅動提供的介面,和計算機硬體進行通訊。

系統呼叫是核心和應用程式之間的介面,而驅動程式是核心和硬體之間的介面,也就是核心和硬體之間的橋梁。它為應用程式遮蔽了硬體的細節,這樣在應用程式看來,硬體裝置只是乙個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作。

linux 驅動程式是核心的一部分,管理著系統中的裝置控制器和相應的裝置。它主要完成這麼幾個功能:對裝置初始化和釋放;傳送資料到硬體和從硬體讀取資料;檢測和處理裝置出現的錯誤。

一般來說,乙個驅動可以管理一種型別的裝置。例如不同的 u 盤都屬於 mass storage 裝置,我們不需要為每乙個 u 盤編寫驅動,而只需要乙個驅動就可以管理所有這些 mass storage 裝置。

為方便我們加入各種驅動來支援不同的硬體,核心抽象出了很多層次結構,這些層次結構是 linux 裝置驅動的上層。它們抽象出各種的驅動介面,驅動只需要填寫相應的**函式,就能很容易把新的驅動新增到核心。

一般來說, linux 驅動可以分為三類,就是塊裝置驅動,字元裝置驅動和網路裝置驅動。塊裝置的讀寫都有快取來支援,並且塊裝置必須能夠隨機訪問。塊裝置驅動主要用於磁碟驅動器。

而字元裝置的 i/o 操作沒有通過快取。字元裝置操作以位元組為基礎,但不是說一次只能執行乙個位元組操作。例如對於字元裝置我們可以通過 mmap 一次進行大量資料交換。

字元裝置實現比較簡單和靈活。

本次設計是簡單的字元裝置驅動設計,基於mini2440的蜂鳴器的驅動設計。

建立乙個虛擬機器:點選選單欄file->new->virtual machine。點選下一步。

選擇typical選項。

選擇linux下的red hat linux

填寫虛擬機器的命名和儲存位址。

選擇磁碟大小

將 複製到虛擬機器的root目錄下

解壓檔案:tar zxvf

在bash_profile裡新增路徑:gedit ~/.bash_profiel

路徑 /root/usr/local/arm/4.3.2/bin

source ~/.bash_profile 使更改生效

複製核心到root目錄下

解壓核心檔案 tar zxvf

使核心檔案生效:cp config_mini2440_n35 .config

使用make命令完成編譯

linux提供了機制被稱為模組(module)的機制

提供了對許多模組支援, 包括但不限於, 裝置驅動

每個模組由目標**組成( 沒有連線成乙個完整可執行程式 )

insmod 將模組動態載入到正在執行核心

rmmod 程式移除模組

linux核心模組的程式結構

● static int __init beep_init(void)---模組初始化函式

通過alloc_chrdev_region來分配裝置號beep_cdev來對裝置進行各種操作。比如在載入核心模組時,模組的載入函式會自動被核心執行,完成模組的相關初始化工作

● static void __exit beep_exit(void)---模組解除安裝函式(必須)

當通過unregister_chrdev_region命令解除安裝某模組時,模組的解除安裝函式會自動被核心執行,完成與模組裝載函式相反的功能

● module_license()---模組許可證宣告(必須)

模組許可證(license)宣告描述核心模組的許可許可權

如果不宣告license,模組被載入時,將收到核心被汙染(kernel tainted)的警告

● 其他一些宣告module_***xx()---模組宣告(可選)

模組載入函式

static int __init initialization_function(void)

module_init(initialization_function);

模組解除安裝函式

static void __exit cleanup_function(void)

module_exit(cleanup_function);

● 確定主裝置號和次裝置號

● 實現字元驅動程式

實現file_operations結構體

實現初始化函式,註冊字元裝置

實現銷毀函式,釋放字元裝置

● 建立裝置檔案節點

● 主裝置號是核心識別乙個裝置的標識。

整數(佔12bits),範圍從0到4095,通常使用1到255

● 次裝置號由核心使用,用於正確確定裝置檔案所指的裝置。

整數(佔20bits),範圍從0到1048575,一般使用0到255

● 裝置編號的內部表達

dev_t型別(32位):

用來儲存裝置編號(包括主裝置號(12位)和次裝置號(20位))

從dev_t獲得主裝置號和次裝置號:

major(dev_t);

minor(dev_t);

將主裝置號和次裝置號轉換成dev_t型別:

mkdev(int major,int minor);

● 分配主裝置號

手工分配主裝置號:找乙個核心沒有使用的主裝置號來使用。

#include

int register_chrdev_region( dev_t first, unsigned int count, char *name );

● 動態分配主裝置號:

#include

int alloc_chrdev_resion(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);

● 釋放裝置號

void unregister_chrdev_region(dev_t first, unsigned int count);

● cdev 結構體

struct cdev

;● file_operations 結構體

字元驅動和核心的介面:

在include/linux/定義

字元驅動只要實現乙個file_operations結構體

並註冊到核心中,核心就有了操作此裝置的能力。

● file_operations的主要成員:

open:開啟裝置

release:關閉裝置

read:從裝置上讀資料

write:向裝置上寫資料

ioctl:i/o控制函式

● ioctl函式

為裝置驅動程式執行「命令」提供了乙個特有的入口點

用來設定或者讀取裝置的屬性資訊。

int ioctl (struct inode *inode, struct file *filp,

unsigned int cmd, unsigned long arg);

● cmd 引數的定義

不推薦用0x1,0x2,0x3之類的值

linux對ioctl()的cmd引數有特殊的定義

構造命令編號的巨集:

_io(type,nr)用於構造無引數的命令編號;

_ior(type,nr,datatype)用於構造從驅動程式中讀取資料的命令編號;

_iow(type,nr,datatype)用於寫入資料的命令;

_iowr(type,nr,datatype)用於雙向傳輸。

type和number位欄位通過引數傳入,而size位欄位通過對datatype引數取sizeof獲得。

● ioctl函式模板

int ***_ioctl( struct inode *inode, struct f ile *filp, unsigned int cmd,

unsigned long arg)

return 0;

}3.5字元裝置驅動結構

蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種型別。

案例式任務驅動的C程式設計教學方法

摘要 針對理工類非計算機專業計算機基礎教育課程體系中的c程式設計課程的案例式任務驅動教學方法。本文結合c語言編寫的實際案例,分析案例教學的優勢所在,同時闡明了任務驅動教學法的實施經過設計任務 布置任務 實踐任務和成果展示 評價學習任務等階段。以此激發學生的學習興趣,調動學生學習的積極性和主動性,從而...

任務驅動教學模式在C程式設計課程教學中的實踐

任務驅動教學模式在c 程式設計課程教學中的實踐作者 王建芳 中國校外教育 綜合 上旬 2012年第12期分析c 程式設計課程的特點,採用任務驅動教學模式的實踐教學培養學生的學習興趣,提高利用c 程式設計解決實際問題的綜合能力。c 程式設計實踐能力教學模式c 程式設計課程是計算機和軟體技術專業的一門基...

專案驅動式教學方法在C 語言程式設計中的應用

摘要 為了激發學生對c 語言程式設計課程的興趣,提高其動手能力和專案開發技能,結合國內外教學經驗,分析 了驅動式教學方法的實施要點和注意事項,提出專案驅動式教學方法必須要以教學為中心,不能脫離教學才能發揮更好的教學效果。關鍵詞 c 教學方法 專案驅動 過程控制 中圖分類號 tp312.1 4 文獻標...