正文
結(jié)合之前對Linux內(nèi)核的misc類設(shè)備驅(qū)動框架的分析 ,本文將編寫基于misc類設(shè)備驅(qū)動框架的Buzzer設(shè)備的實例代碼并對其進行分析。
misc類設(shè)備驅(qū)動框架的分析,詳見Linux字符設(shè)備驅(qū)動框架(三):Linux內(nèi)核的misc類設(shè)備驅(qū)動框架。
硬件接口:
CPU:s5pv210;
Buzzer的GPIO:GPIO_D0_2 ;
LED的工作方式:低電平停,高電平響。
P.S.:無源蜂鳴器聲音頻率可控,一般采用PWM控制;有源蜂鳴器用普通IO控制方式即可。
1. 驅(qū)動程序分析
本代碼取自,九鼎科技x210開發(fā)板的BSP。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME 'buzzer' #define PWM_IOCTL_SET_FREQ 1 #define PWM_IOCTL_STOP 0 static struct semaphore lock; // TCFG0在Uboot中設(shè)置,這里不再重復(fù)設(shè)置 // Timer0輸入頻率Finput=pclk/(prescaler1+1)/MUX1 // =66M/16/16 // TCFG0 = tcnt = (pclk/16/16)/freq; // PWM0輸出頻率Foutput =Finput/TCFG0= freq static void PWM_Set_Freq( unsigned long freq ) { unsigned long tcon; unsigned long tcnt; unsigned long tcfg1; struct clk *clk_p; unsigned long pclk; //設(shè)置GPD0_2為PWM輸出 s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(2)); tcon = __raw_readl(S3C2410_TCON); tcfg1 = __raw_readl(S3C2410_TCFG1); //mux = 1/16 tcfg1 &= ~(0xf<<8); tcfg1 |= (0x4<<8); __raw_writel(tcfg1, S3C2410_TCFG1); clk_p = clk_get(NULL, 'pclk'); pclk = clk_get_rate(clk_p); tcnt = (pclk/16/16)/freq; __raw_writel(tcnt, S3C2410_TCNTB(2)); __raw_writel(tcnt/2, S3C2410_TCMPB(2));//占空比為50% tcon &= ~(0xf<<12); tcon |= (0xb<<12); //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0 __raw_writel(tcon, S3C2410_TCON); tcon &= ~(2<<12); //clear manual update bit __raw_writel(tcon, S3C2410_TCON); } void PWM_Stop( void ) { //將GPD0_2設(shè)置為input s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(0)); } static int x210_pwm_open(struct inode *inode, struct file *file) { if (!down_trylock(&lock))//上鎖 return 0; else return -EBUSY; } static int x210_pwm_close(struct inode *inode, struct file *file) { up(&lock);//解鎖 return 0; } // PWM:GPF14->PWM0 static int x210_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case PWM_IOCTL_SET_FREQ: printk('PWM_IOCTL_SET_FREQ:rn'); if (arg == 0) return -EINVAL; PWM_Set_Freq(arg); break; case PWM_IOCTL_STOP: default: printk('PWM_IOCTL_STOP:rn'); PWM_Stop(); break; } return 0; } //buzzer設(shè)備操作集 static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = x210_pwm_open, .release = x210_pwm_close, .ioctl = x210_pwm_ioctl, }; //misc類設(shè)備信息初始化 static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; //buzzer設(shè)備注冊 static int __init dev_init(void) { int ret; init_MUTEX(&lock); //上鎖 ret = misc_register(&misc); //將buzzer注冊到misc類下 /* GPD0_2 (PWMTOUT2) */ ret = gpio_request(S5PV210_GPD0(2), 'GPD0'); //申請GPIO if(ret) printk('buzzer-x210: request gpio GPD0(2) fail'); s3c_gpio_setpull(S5PV210_GPD0(2), S3C_GPIO_PULL_UP);//將GPIO_D0_2設(shè)置為上拉 s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(1)); //將GPIO_D0_2設(shè)置為輸出模式 gpio_set_value(S5PV210_GPD0(2), 0); //將GPIO_D0_2設(shè)置為低電平 printk ('x210 'DEVICE_NAME' initializedn'); return ret; } //buzzer設(shè)備注銷 static void __exit dev_exit(void) { init_MUTEX_LOCKED(&lock); //解鎖 gpio_free(S5PV210_GPD0(2));//釋放GPIO misc_deregister(&misc); //注銷buzzer設(shè)備 } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE('GPL'); MODULE_AUTHOR('www.9tripod.com'); MODULE_DESCRIPTION('x210 PWM Driver'); 2.測試 Buzzer驅(qū)動模塊被裝載進內(nèi)核之后,可運行如下應(yīng)用程序測試該驅(qū)動是否工作正常。若運行應(yīng)用程序之后,蜂鳴器連響3聲,則說明驅(qū)動工作正常。 #include #include #include #include #include #define FILE_BUZZER '/dev/buzzer' #define PWM_IOCTL_SET_FREQ 1 #define PWM_IOCTL_STOP 0 int main(void) { int fd = -1; int i = 0; fd = open(FILE_BUZZER, O_RDWR); if (fd < 0) { printf('open buzzer file error.n'); return -1; } for (i=0; i<3; i++) { ioctl(fd, PWM_IOCTL_SET_FREQ, 10000); sleep(3); ioctl(fd, PWM_IOCTL_STOP); sleep(3); } return 0; }
上一篇:Linux內(nèi)核靜態(tài)映射表的建立過程
下一篇:驅(qū)動程序?qū)嵗ㄎ澹篖CD驅(qū)動程序分析(Samsung LCD)
推薦閱讀最新更新時間:2025-06-05 04:47






設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- LTC4304 的典型應(yīng)用 - 具有卡死總線恢復(fù)功能的熱插拔 2 線總線緩沖器
- DC104B-C,演示板,通用低噪聲 8 階濾波器構(gòu)建塊(100:1,fc 至 50khz)
- PSoC1 - 使用 CY3210 套件的 32.768-kHz 外部晶體振蕩器應(yīng)用電路
- TWR-KL25Z48M、Kinetis KL1x 和 KL2x 48 MHz MCU 塔式系統(tǒng)模塊,用于 MKL25Z128VLK4 MCU
- Ts4890 軌到軌輸出 1W 音頻功率放大器的典型應(yīng)用,具有待機模式低電平有效
- 使用 Omron 的 S8VS-18024BP 的參考設(shè)計
- DER-259 - 薄型36.3W電源
- REF195 精密微功耗、低壓差電壓基準(zhǔn)的典型應(yīng)用
- 原神15CM直尺
- 使用 ON Semiconductor 的 STK416-090-E 的參考設(shè)計
- 納祥科技2W 24位數(shù)字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調(diào)器的定義和工作原理
- 從性能與網(wǎng)絡(luò)傳輸出發(fā),講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業(yè)與酒店業(yè)運營模式
- 跨國商務(wù)溝通困局破解之道:時空壺 W4Pro 全場景應(yīng)用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構(gòu) AI 同傳技術(shù)標(biāo)準(zhǔn)?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區(qū)電梯場景等的冗余通信
- LoRa與UWB的“定位之戰(zhàn)”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領(lǐng)AI同傳新時代,革新演講翻譯體驗
- ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測試方案
- 業(yè)者看好下一波機器人爆發(fā)點 高精密、負載小是趨勢
- 機器人是智能制造要角 新漢計劃在16所院校開設(shè)「機器人學(xué)」
- 漢鼎咨詢:我國工業(yè)機器人產(chǎn)業(yè)未來市場非常可期
- 我國機器人需求將持續(xù)高增長
- 我國服務(wù)機器人產(chǎn)業(yè)現(xiàn)狀分析,控制器核心技術(shù)有待突破
- STM32驅(qū)動LCD實戰(zhàn)
- 基于硅壓式傳感器和MSP430F149單片機的電子血壓計設(shè)計
- 以MSP430F449單片機為控制核心的智能數(shù)字化SLED控制系統(tǒng)設(shè)計
- 基于MSP430F135與DSl8820芯片設(shè)計煤礦瓦斯?jié)舛葻o線監(jiān)測系統(tǒng)
- 單片機技術(shù)實現(xiàn)藍牙無線充電的系統(tǒng)方案