kobox : key driver -v1 怎样使用中断

kobox之TQ2440 key驱动

一. 实现目标:

  按按键K1,蜂鸣器响一声
  按按键K2,蜂鸣器响二声
  按按键K3,蜂鸣器响三声
  按按键K4,蜂鸣器响四声


二. 按键GPIO:

  GPB5, GPB6, GPB7, GPB8 --- LED1, LED2, LED3, LED4
  GPF1, GPF4, GPF2, GPF0 --- K1, K2, K3, K4

kobox : key driver -v1 怎样使用中断_第1张图片

三. 框架

#include "key.h"
// ref arch/arm/mach-s3c24xx/mach-mini2440.c how to set gpio 
MODULE_LICENSE("GPL");
/*
datasheet: page274
— Port A(GPA): 25-output port
— Port B(GPB): 11-input/out port
— Port C(GPC): 16-input/output por
— Port D(GPD): 16-input/output por
— Port E(GPE): 16-input/output por
— Port F(GPF): 8-input/output port
— Port G(GPG): 16-input/output po
— Port H(GPH): 9-input/output port
— Port J(GPJ): 13-input/output port
*/

/*
GPB5, GPB6, GPB7, GPB8 --- LED1, LED2, LED3, LED4  
GPF1, GPF4, GPF2, GPF0 --- K1, K2, K3, K4  
*/

#define S3C_ADDR_BASE	0xF6000000
#define S3C_ADDR(x)	(S3C_ADDR_BASE + (x))
#define S3C2410_PA_UART		(0x50000000)
#define S3C2410_PA_GPIO		(0x56000000)
#define S3C_VA_UART	S3C_ADDR(0x01000000)	/* UART */
#define S3C24XX_PA_UART		S3C2410_PA_UART
#define S3C24XX_VA_UART		S3C_VA_UART
#define S3C24XX_PA_GPIO		S3C2410_PA_GPIO
#define S3C24XX_VA_GPIO		((S3C24XX_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)

#define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)

#define S3C2410_GPBCON	   S3C2410_GPIOREG(0x10)
#define S3C2410_GPBDAT	   S3C2410_GPIOREG(0x14)
#define S3C2410_GPBUP	   S3C2410_GPIOREG(0x18)

static int kobox_key_open(struct inode *inode, struct file *file)
{
	return 0;
}

static int kobox_key_release(struct inode *inode, struct file *file)
{
	return 0;
}

static long kobox_key_ioctl(struct file *file, unsigned int cmd,
			   unsigned long arg)
{
	return 0;
}

struct file_operations kobox_key_operations = {
	.owner          = THIS_MODULE,
	.open           = kobox_key_open,
	.release        = kobox_key_release,
	.unlocked_ioctl = kobox_key_ioctl,
};

//GPB0
int major;
int minor;
struct cdev cdev;
struct class *kobox_key_class;
struct device *pstdev = NULL;
#define GPIO_KEY_NAME "kobox_key"

int __init key_drv_init(void)
{
	int error;
	dev_t dev;

	printk("#####enter key_drv_init!\n");

	major = register_chrdev(0, GPIO_KEY_NAME, &kobox_key_operations);
	if (major < 0)
	{
		printk(" can't register major number\n");
		return major;
	}

	/* create class */
	kobox_key_class = class_create(THIS_MODULE, GPIO_KEY_NAME);
	if(IS_ERR(kobox_key_class))
	{
		printk("class_create failed!\n");
		goto fail;
	}

	/* create /dev/kobox_gpio */
	pstdev = device_create(kobox_key_class, NULL, MKDEV(major, 0), NULL, GPIO_KEY_NAME);
	if(!pstdev)
	{
		printk("device_create failed!\n");
		goto fail1;
	}

	printk("#####key_drv_init ok!\n");
	
	return 0;
fail1:
	class_destroy(kobox_key_class);
fail:
	unregister_chrdev(major, GPIO_KEY_NAME);
	return -1;
}

void __exit key_drv_exit(void)
{
	printk("exit gpio drv!\n");	

	device_destroy(kobox_key_class, MKDEV(major, 0));
	class_destroy(kobox_key_class);
	unregister_chrdev(major, GPIO_KEY_NAME);

	return;
}

module_init(key_drv_init);
module_exit(key_drv_exit);


你可能感兴趣的:(kobox : key driver -v1 怎样使用中断)