📄 led.c
字号:
#include <linux/config.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/ioctl.h>#include <asm/uaccess.h>#include <asm/hardware.h>#include <asm/arch/regs-gpio.h>MODULE_LICENSE("GPL");#define HELLO_MAGIC 'k'#define LED_GPF4 _IO(HELLO_MAGIC,1)#define LED_GPF5 _IO(HELLO_MAGIC,2)#define LED_GPF6 _IO(HELLO_MAGIC,3)#define LED_GPF7 _IO(HELLO_MAGIC,4)#define LED_GPF8 _IO(HELLO_MAGIC,5)#define LED_GPF9 _IO(HELLO_MAGIC,6)#define LED_GPF10 _IO(HELLO_MAGIC,7)#define LED_GPF11 _IO(HELLO_MAGIC,8)#define GPFCON *(volatile unsigned int *)S3C2410_GPFCON#define GPFDAT *(volatile unsigned int *)S3C2410_GPFDATstatic int led_major=0;static int led_open(struct inode *inode ,struct file *file){ GPFCON &=(~(3<<14)+(1<<14)+~(3<<12)+(1<<12)+~(3<<10)+(1<<10)+~(3<<8)+(1<<8)); return 0;}static int led_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg){ int ret=0; switch(cmd) { case LED_GPF4: GPFDAT &=(~(1<<4)); break; case LED_GPF5: GPFDAT &=(~(1<<5)); break; case LED_GPF6: GPFDAT &=(~(1<<6)); break; case LED_GPF7: GPFDAT &=(~(1<<7)); break; case LED_GPF8: GPFDAT |=1<<4; break; case LED_GPF9: GPFDAT |=1<<5; break; case LED_GPF10: GPFDAT |=1<<6; break; case LED_GPF11: GPFDAT |=1<<7; break; } return 0;}static int led_release(struct inode *inode,struct file *file){ return 0;}static void led_setup_cdev(struct cdev *dev,int minor,struct file_operations *fops){ int err; int devno=MKDEV(led_major,minor); cdev_init(dev,fops); dev->owner=THIS_MODULE; dev->ops=fops; err=cdev_add(dev,devno,1); if(err) printk(KERN_INFO"Error %d adding led %d\n",err,minor);}static struct file_operations led_remap_ops={ .owner=THIS_MODULE, .open=led_open, .release=led_release, .ioctl=led_ioctl,};static struct cdev SimpleDevs;static int led_init(void){ int result; dev_t dev=MKDEV(led_major,0); if(led_major) result=register_chrdev_region(dev,1,"led"); else { result=alloc_chrdev_region(&dev,0,1,"led"); led_major=MAJOR(dev); } if(result<0) { printk(KERN_WARNING"led:unable to get major %d\n",led_major); return result; } if(led_major==0) led_major=result; printk(KERN_INFO"led register ok!!!!!!!!!!\n"); led_setup_cdev(&SimpleDevs,0,&led_remap_ops); return 0;}static void led_exit(void){ cdev_del(&SimpleDevs); unregister_chrdev_region(MKDEV(led_major,0),2); printk("led device uninstalled\n");}module_init(led_init);module_exit(led_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -