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

📄 led.c

📁 初始化驱动
💻 C
字号:
/*********************************************	2410U LED Driver *	2008-8-9  *	ciddc@126.com********************************************/#define ARM#define ARM_INT//#define LINUX_PC#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/devfs_fs_kernel.h>#include <linux/fs.h>       #include <linux/errno.h>    #include <linux/types.h>    #include <linux/fcntl.h>   #include <linux/poll.h> #include <linux/delay.h>   #include <asm/system.h>     #include <asm/delay.h>#include <asm/uaccess.h>#ifdef ARM#include <asm/hardware.h>#include <asm/arch/S3C2410.h>#include <asm/arch/irqs.h>#endif#ifndef __KERNEL__#define __KERNEL__#endif#ifndef MODULE#define MODULE#endif#define D_NAME "2410led"//extern struct module __this_module;#ifdef ARM#undef  D_NAME#define D_NAME "myled"#define LED1 GPIO_C5#define LED2 GPIO_C6#define LED3 GPIO_C7static unsigned int LED[] = {LED1, LED2, LED3};#define NUM_LED (sizeof(LED)/sizeof(*LED))#endif#ifdef ARM_INT#define LED_TIME	100#define s3c2410_IRQ3		IRQ_EINT3	//IRQ_EINT3#define GPIO_key_int01  (GPIO_MODE_IN | GPIO_PULLUP_DIS | GPIO_F3)#define led01_enable() ({ GPCCON &=~ 0xc00; GPCCON |= 0x400; GPCDAT&=~ 0x20; GPCDAT |= 0x0;})#define led01_disable()({ GPCDAT&=~ 0x20; GPCDAT |= 0x20; })static void s3c2410_IRQ3_fun(int irq, void *dev_id, struct pt_regs *reg){  	printk("enter interrupt 3 !\n");	led01_enable();//	write_gpio_bit(LED1,1);	mdelay(LED_TIME);	led01_disable();//	write_gpio_bit(LED1,0);	mdelay(LED_TIME);}#endif#define LED_MINOR 1static char led_status = 3;static int led_major = 254;static void update_led(void){#ifdef ARM	int i;	for(i = 0; i < NUM_LED; i++)	{		if (led_status == 0x30){			write_gpio_bit(LED[i],1);//close led			printk("...close led\n");//close led		}		else{			write_gpio_bit(LED[i],0);//open led			printk("...open led\n");//open led		}	}#else 	if (led_status == 0x30)		printk("...close led\n");//close led	else		printk("...open led\n");//open led		#endif							}static int led_open(struct inode* inode,struct file *filep){	MOD_INC_USE_COUNT;	printk("my device open\n"); 		return 0;}static int led_release(struct inode* inode,struct file *filep){	MOD_DEC_USE_COUNT;	printk("my device close\n"); 			return 0;}static int led_write(struct file *file, const char * buffer, size_t count, loff_t * ppos){	copy_from_user(&led_status, buffer, sizeof(led_status));	printk("write: led = 0x%x\n",led_status);	update_led();    	return 0;}static struct file_operations led_fops={	open: led_open,	write:led_write,	release:led_release,};#ifdef CONFIG_DEVFS_FSstatic devfs_handle_t  devfs_led_dir, devfs_led_raw;#endifstatic int __init my_led_init(void){	int ret;#ifdef ARM		int i;	int flags;	//led init	for(i = 0; i < NUM_LED; i++)	{		set_gpio_ctrl(GPIO_MODE_OUT|GPIO_PULLUP_DIS|LED[i]);				}#endif	#ifdef ARM_INT	//irq init	set_gpio_ctrl(GPIO_key_int01);    	local_irq_save(flags);		ret = set_external_irq(s3c2410_IRQ3, EXT_RISING_EDGE, GPIO_PULLUP_DIS);	if (ret){		printk("s3c2410_IRQ3  set_external_irq  failure\n");		return ret;	}	local_irq_restore(flags);	ret = request_irq(s3c2410_IRQ3, s3c2410_IRQ3_fun, SA_INTERRUPT, D_NAME, NULL);	if (ret){        	printk("s3c2410_IRQ3 request_irq  failure\n");        	return ret;    	}	#endif	ret = register_chrdev(led_major,D_NAME,&led_fops);	if(ret<0)	{	printk("cant get major number\n");	 	return ret;	}//	led_major = ret;	#ifdef CONFIG_DEVFS_FS	devfs_led_dir = devfs_mk_dir(NULL, D_NAME, NULL);	devfs_led_raw = devfs_register(devfs_led_dir, "0", DEVFS_FL_DEFAULT,			led_major, LED_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,			&led_fops, NULL);#endif				printk("init 2410 led ==\r\n");	return 0;}static void __exit my_led_exit(void){#ifdef ARM_INT	free_irq(s3c2410_IRQ3,NULL);#endif		#ifdef CONFIG_DEVFS_FS	devfs_unregister(devfs_led_raw);	devfs_unregister(devfs_led_dir);#endif	unregister_chrdev(led_major, D_NAME);		printk("2410 led exit\r\n");}module_init(my_led_init);module_exit(my_led_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("TONY");

⌨️ 快捷键说明

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