本文通過TQ2440開發板上可外接的GPIO口GPG14連接蜂鳴器,通過控制GPG14引腳的高低電平的輸出和高低電平輸出之間的時間間隔來使蜂鳴器發出不同的聲音。
1.打開S3C2440的底板原理圖找到GPIO,如下圖所示:
使用萬用表先找到VDD5V那個引腳,然後對照圖找到GPG14,將蜂鳴器的正極連上GPG14,負極連上GND接地。
Ubuntu下搭建TQ2440的程序下載環境 http://www.linuxidc.com/Linux/2011-03/32869.htm
Ubuntu 12.04(32位)下TQ2440開發板環境搭建 http://www.linuxidc.com/Linux/2014-04/100085.htm
【Linux驅動】TQ2440 LED驅動程序 http://www.linuxidc.com/Linux/2014-06/103328.htm
2.蜂鳴器驅動程序源代碼My_Beep.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h> //定義s3c2410的GPIO
#include <mach/hardware.h> //定義操作s3c2410的GPIO的函數
#include <linux/device.h> //自動創建設備文件應該包含的頭文件
#define DEVICE_NAME "My_Beep" //加載模塊後執行cat/proc/devices中看到的設備名稱
#define Beep_MAJOR 104 //主設備號
#define Beep_High 1
#define Beep_Low 0
static int My_Beep_open(struct inode *inode,struct file *file)
{
s3c2410_gpio_cfgpin(S3C2410_GPG14,S3C2410_GPG14_OUTP);//配置GPG14為輸出功能
printk("My_Beep open\n");
return 0;
}
static int My_Beep_ioctl(struct inode * inode, struct file * file,unsigned int cmd)
{
switch(cmd)
{
case Beep_High:
s3c2410_gpio_setpin(S3C2410_GPG14, 1);//設置GPG14引腳為輸出電平為1
return 0;
case Beep_Low:
s3c2410_gpio_setpin(S3C2410_GPG14, 0);//設置GPG14引腳為輸出電平為0
return 0;
default:
return -1;
}
}
//定義文件操作 file_operations
static struct file_operations My_Beep_fops =
{
.owner = THIS_MODULE,
.open = My_Beep_open,
.ioctl = My_Beep_ioctl,
};
static struct class *Beep_class;
static int __init My_Beep_init(void)
{
int ret;
printk("My_Beep start\n");
//注冊字符設備驅動程序
//參數為主設備號、設備名字、file_operations結構
//這樣主設備號就與file_operations聯系起來
ret = register_chrdev(Beep_MAJOR, DEVICE_NAME, &My_Beep_fops);
if(ret < 0)
{
printk("can't register major number\n");
return ret;
}
//注冊一個類,使mdev可以在"/dev/目錄下建立設備節點"
Beep_class = class_create(THIS_MODULE, DEVICE_NAME);
if(IS_ERR(Beep_class))
{
printk("failed in My_Beep class.\n");
return -1;
}
device_create(Beep_class, NULL, MKDEV(Beep_MAJOR,0), NULL, DEVICE_NAME);
printk(DEVICE_NAME "initialized\n");
return 0;
}
static void __exit My_Beep_exit(void)
{
unregister_chrdev(Beep_MAJOR, DEVICE_NAME);
device_destroy(Beep_class, MKDEV(Beep_MAJOR,0));//注銷設備節點
class_destroy(Beep_class);//注銷類
}
module_init(My_Beep_init);
module_exit(My_Beep_exit);
MODULE_LICENSE("GPL");
源碼分析:
本驅動程序通過linux系統內核中對S3C2410 GPIO操作的函數來實現對GPG14引腳輸出功能和引腳高低電平輸出功能的配置。
s3c2410_gpio_cfgpin(S3C2410_GPG14,S3C2410_GPG14_OUTP) 這行代碼實現了配置GPG14為輸出模式的功能。s3c2410_gpio_cfgpin這個函數定義在內核源碼中的hardware.h頭文件中,使用此函數需要包含頭文件 #include<mach/hardware.h> 。
S3C2410_GPG14是GPIO的編號,S3C2410_GPG14_OUTP是端口的功能,他們都定義在內核源碼的regs-gpio.h頭文件中。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-08/106009p2.htm