regs-gpio.h头文件的源码路径为 :arch/arm/mach-s3c2410/include/mach/regs-gpio.h ,打开源码来看下他们的定义:
#define S3C2410_GPG14 S3C2410_GPIONO(S3C2410_GPIO_BANKG, 14)
#define S3C2410_GPG14_INP (0x00 << 28)
#define S3C2410_GPG14_OUTP (0x01 << 28)
在源码中我们可以看到其实S3C2410_GPG14_OUTP就是一个二进制数,再打开S3C2440的芯片手册找到端口GPG14,如下图所示:
可以知道,只要将GPG14的二进制位的29位和28位分别配置成0和1,这个端口便被设置成了输出模式,S3C2410_GPG14_OUTP就实现了二进制29位和28位的正确配置,所以他实现了对GPG14配置成输出模式的功能。
s3c2410_gpio_setpin函数同样定义在hardware.h头文件中,此函数实现了对GPG14输出高低电平的功能。说到这干脆来系统整理下常用的S3C2410 GPIO的操作函数,在hardware.h文件(源码路径:arch/arm/mach-s3c2410/include/mach/hardware.h)中 有:
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) //配置端口的GPIO的功能
其中pin为端口的编号,function为端口的功能。
unsigned int s3c2410_gpio_getcfg(unsigned int pin) //读取功能配置
void s3c2410_gpio_pullup(unsigned int pin, unsigned int to) //配置上拉电阻
unsigned int s3c2410_modify_misccr(unsigned int clr, unsigned int chg) //杂项配置
int s3c2410_gpio_getirq(unsigned int pin) //给定端口,转换出IRQ号
int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on, unsigned int config); //配置IRQ过滤使能与否
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to) //写数据到端口
其中pin为端口的编号,to为你想要写进端口的数据。
unsigned int s3c2410_gpio_getpin(unsigned int pin) //从端口读数据
3.Makefile文件:
obj-m:=My_Beep.o
CC=arm-linux-gcc
KERNELDIR=/usr/local/opt/EmbedSky/linux-2.6.30.4
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
4.驱动程序对应的上层应用程序源码My_Beep_Test.c
#include
#include
#include
#include
#include
#include
int main()
{
int fd,i,cmd=0;
long t;
fd=open("/dev/My_Beep",0);
if (fd<0)
{
printf("open Beep_driver error");
exit(1);
}
printf("please input t\n");
scanf("%ld",&t);
while(1)
{
switch(cmd)
{
case 0:
printf("Beep Low \n");
ioctl(fd,0);
for(i=0;i
case 1:
printf("Beep High \n");
ioctl(fd,1);
for(i=0;i
}
}
return 0;
}
运行此程序时可以通过scanf("%ld",&t)来设置不同的t,从而实现高低电平之间的时间间隔的变化,最终实现蜂鸣器发出不同声音的功能,本人经过尝试发现只要t的值取得恰当,你甚至可以使蜂鸣器发出美妙的音乐出来。