⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 my_bt.c

📁 一个简单明了的用按键点亮LED的驱动(SBC2410),非常适合驱动入门
💻 C
字号:
//#include <linux/config.h>#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/irq.h>  #include <linux/miscdevice.h> #include <linux/sched.h> #include <linux/delay.h> #include <linux/poll.h> #include <linux/spinlock.h> #include <linux/delay.h> #include <linux/interrupt.h>#include <asm/hardware.h> #include <asm/arch/regs-gpio.h> #include <asm/arch/irqs.h> #include <linux/device.h> #include <linux/types.h> #include <linux/cdev.h> #include <linux/errno.h> #include <asm/uaccess.h> #define DEVICE_NAME "button"#define MAX_KEY_BUF 16#define KEY_NUM 4static int button_major = 232;typedef struct{	unsigned int key_status[KEY_NUM];	//unsigned char buf[MAX_KEY_BUF];	//unsigned int head, tail;	//wait_queue_head_t wq;	struct cdev cdev;   }button_dev;static button_dev *button_p; static struct led_info{	unsigned long gpio;	unsigned long gpio_status;}led_table[4] = {	{S3C2410_GPB7,S3C2410_GPB7_OUTP},	{S3C2410_GPB8,S3C2410_GPB8_OUTP},	{S3C2410_GPB9,S3C2410_GPB9_OUTP},	{S3C2410_GPB10,S3C2410_GPB10_OUTP},};static struct key_info{	int irq_no;	unsigned int gpio_port;	int key_no;}key_info_table[4] ={  {	IRQ_EINT1, S3C2410_GPF1, 1},  {	IRQ_EINT2, S3C2410_GPF2, 2},  {	IRQ_EINT3, S3C2410_GPF3, 3},  {	IRQ_EINT7, S3C2410_GPF7, 4},	};static void buttons_irq(int irq, void *dev_id, struct pt_regs *reg){	struct key_info *k;	int i,j = (int)dev_id;	printk("int %d received\n", j);	unsigned int value;	int found = 0;	for (i = 0; i < sizeof key_info_table / sizeof key_info_table[1]; i++)	{	   k = key_info_table + i;	   if (k->irq_no == irq)		 {		    found = 1;		    break;		 }	}	if (!found)	{	   printk("bad irq %d in button\n", irq);	   return;	}  printk("interrupt %d received!\n", i);  value = s3c2410_gpio_getpin(led_table[i].gpio);	if(value)		s3c2410_gpio_setpin(led_table[i].gpio,0);	else		s3c2410_gpio_setpin(led_table[i].gpio,1);}static int request_irqs(void){  struct key_info *k;  int i;  for (i = 0; i < sizeof key_info_table / sizeof key_info_table[1]; i++)	{     k = key_info_table + i;     //set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);		 set_irq_type(k->irq_no, IRQT_BOTHEDGE);     if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME,				i))		 {        return -1;     }  }	printk("irq request successfully!\n");  return 0;}static void free_irqs(void){	struct key_info *k;	int i;	for (i = 0; i < sizeof key_info_table / sizeof key_info_table[1]; i++)	{	  k = key_info_table + i;	  free_irq(k->irq_no, buttons_irq);	}}static void button_setup(button_dev *dev, int index){	int err, devno = MKDEV(button_major, index);	dev->cdev.owner = THIS_MODULE;	err = cdev_add(&dev->cdev, devno, 1);	if(err)	{		printk(KERN_NOTICE"Error %d adding button", err);	}}static int button_init(void){	int ret,i;	dev_t devno = MKDEV(button_major,0);	ret = register_chrdev_region(devno, 1, "button");	if(ret)		return ret;	button_p = kmalloc(sizeof(button_dev), GFP_KERNEL);	if(!button_p)	{		ret = -ENOMEM;		goto fail;	}  memset(button_p, 0, sizeof(button_dev));  button_setup(button_p, 0);	for(i=0;i<4;i++)	{		s3c2410_gpio_cfgpin(led_table[i].gpio, led_table[i].gpio_status);		s3c2410_gpio_setpin(led_table[i].gpio, 1);		printk("led%d initialized!\n",i+1);	}  ret = request_irqs();	if(ret)	{		printk(DEVICE_NAME " can't request irqs\n");		goto fail;	}	printk("int request ok!\n");	return 0;fail:	unregister_chrdev_region(devno, 1);	return ret;}static void button_exit(void){	cdev_del(&button_p->cdev);	kfree(button_p);	unregister_chrdev_region(MKDEV(button_major,0), 1);		free_irqs();}MODULE_AUTHOR("jimmy");MODULE_LICENSE("Daul BSD/GPL");module_param(button_major, int, S_IRUGO);module_init(button_init);module_exit(button_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -