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

📄 led.c

📁 《linux驱动程序设计从入门到精通》一书中所有的程序代码含驱动和相应的应用程序
💻 C
字号:
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2007, 2010 fengGuojin(fgjnew@163.com) */#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/cdev.h>#include <linux/version.h>#include <linux/vmalloc.h>#include <linux/ctype.h>#include <linux/pagemap.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/signal.h>#include <asm/hardware.h>#include <asm/uaccess.h>#include <asm/arch/regs-gpio.h>#include "demo.h"MODULE_AUTHOR("fgj");MODULE_LICENSE("Dual BSD/GPL");#define LED_SI_OUT	__raw_writel((__raw_readl(S3C2410_GPFCON)&(~(3<<8)))|(1<<8),S3C2410_GPFCON)#define LED_SI_H		__raw_writel(__raw_readl(S3C2410_GPFDAT)|(1<<4),S3C2410_GPFDAT)#define LED_SI_L		__raw_writel(__raw_readl(S3C2410_GPFDAT)&(~(1<<4)),S3C2410_GPFDAT)struct DEMO_dev *DEMO_devices;static unsigned char demo_inc=0;int DEMO_open(struct inode *inode, struct file *filp){	struct DEMO_dev *dev;	if(demo_inc>0)return -ERESTARTSYS;	demo_inc++;	dev = container_of(inode->i_cdev, struct DEMO_dev, cdev);	filp->private_data = dev;	return 0;}int DEMO_release(struct inode *inode, struct file *filp){	demo_inc--;	return 0;}int DEMO_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg){	  if(cmd==COMMAND_LEDOFF)	  {		   printk("ioctl LEDOFF successfully\n");		   LED_SI_H;		   return 0;	  }	  if(cmd==COMMAND_LEDON)	  {		   printk("ioctl LEDON successfully\n");		   LED_SI_L;		   return 0;	  }	 	  printk("ioctl error successfully\n");          return -EFAULT;}struct file_operations DEMO_fops = {	.owner =    THIS_MODULE,	.ioctl =    DEMO_ioctl,};/*******************************************************                MODULE ROUTINE*******************************************************/void DEMO_cleanup_module(void){	dev_t devno = MKDEV(DEMO_MAJOR, DEMO_MINOR);	if (DEMO_devices) 	{		cdev_del(&DEMO_devices->cdev);		kfree(DEMO_devices);	}	unregister_chrdev_region(devno,1);}int DEMO_init_module(void){	int result;	dev_t dev = 0;	dev = MKDEV(DEMO_MAJOR, DEMO_MINOR);	result = register_chrdev_region(dev, 1, "DEMO");	if (result < 0) 	{		printk(KERN_WARNING "DEMO: can't get major %d\n", DEMO_MAJOR);		return result;	}	DEMO_devices = kmalloc(sizeof(struct DEMO_dev), GFP_KERNEL);	if (!DEMO_devices)	{		result = -ENOMEM;		goto fail;	}	memset(DEMO_devices, 0, sizeof(struct DEMO_dev));	cdev_init(&DEMO_devices->cdev, &DEMO_fops);	DEMO_devices->cdev.owner = THIS_MODULE;	DEMO_devices->cdev.ops = &DEMO_fops;	result = cdev_add (&DEMO_devices->cdev, dev, 1);	if(result)	{		printk(KERN_NOTICE "Error %d adding DEMO\n", result);		goto fail;	}        LED_SI_OUT;	return 0;fail:	DEMO_cleanup_module();	return result;}module_init(DEMO_init_module);module_exit(DEMO_cleanup_module);

⌨️ 快捷键说明

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