📄 led.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 + -