📄 led_config.c
字号:
//#include <linux/config.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/wait.h>#include <linux/kernel.h> /* printk() */#include <linux/slab.h> /* kmalloc() */#include <linux/fs.h> /* everything... */#include <linux/errno.h> /* error codes */#include <linux/types.h> /* size_t */#include <linux/mm.h>#include <linux/kdev_t.h>#include <asm/page.h>#include <linux/cdev.h>#include <asm/io.h>#include <linux/device.h>#include <linux/delay.h>#include <asm/uaccess.h>#include "LED_Config.h"//static wait_queue_head_t time_wait;static int LED_Config_major = LED_CONFIG_MAJOR;module_param(LED_Config_major, int, 0);MODULE_AUTHOR("Wu dequan");MODULE_LICENSE("GPL");/* * Set up the cdev structure for a device. */static void LED_Config_setup_cdev(struct cdev *dev, int minor, struct file_operations *fops){ int err, devno = MKDEV(LED_Config_major, minor); cdev_init(dev, fops); dev->owner = THIS_MODULE; dev->ops = fops; err = cdev_add (dev, devno, 1); /* Fail gracefully if need be */ if (err) printk (KERN_NOTICE "Error %d adding MCU_info%d", err, minor);}static int LED_Config_open(struct inode *inode, struct file *file){ //PDEBUG("LED_Config opened OK!!!\n"); return 0;}static int LED_Config_release(struct inode *inode, struct file *file){ //PDEBUG("LED_Config closed OK!!!\n"); return 0;}static int LED_Config_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){// unsigned char TempData; unsigned long TempRegister; printk (KERN_NOTICE "Comand no = %d\n", cmd);// PDEBUG("LED_Config: command no = %d\n", cmd); switch (cmd) {/* case LED_Config_IOC_Setting: if (get_user(TempData, (char *)arg)) return -EFAULT; TempData = TempData & 0xff; PDEBUG ("Tempdata = 0x%x \n",TempData); if((TempData & 0xf) >= ((unsigned char)LED_Config_Data_fail)) return -EFAULT; if ((TempData & 0xf0) != ((unsigned char)LED_low_Data_fail)) return -EFAULT; TempRegister = inb(GPIO_status_register_address); TempRegister = TempRegister & 0xfc; TempRegister = TempRegister + (TempData & 0x03); outb(TempRegister, GPIO_status_register_address); return 0;*/ case LED_PRE_ON: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister & (~(1<<25)); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); TempRegister = inl(LED_ADDRESS); TempRegister = TempRegister & (~(1<<25)); outl(TempRegister,LED_ADDRESS); break; case LED_PRE_OFF: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister & (~(1<<25)); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); TempRegister = inl(LED_ADDRESS); TempRegister = TempRegister | (1<<25); outl(TempRegister,LED_ADDRESS); break; case LED_PRE_BLINK: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister | (1<<25); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); break; case LED_COM_ON: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister & (~(1<<23)); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); TempRegister = inl(LED_ADDRESS); TempRegister = TempRegister & (~(1<<23)); outl(TempRegister,LED_ADDRESS); break; case LED_COM_OFF: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister & (~(1<<23)); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); TempRegister = inl(LED_ADDRESS); TempRegister = TempRegister | (1<<23); outl(TempRegister,LED_ADDRESS); break; case LED_COM_BLINK: TempRegister = inl (GPIO_BLINK_ENABLE_REGISTER); TempRegister = TempRegister | (1<<23); outl(TempRegister,GPIO_BLINK_ENABLE_REGISTER); break; default: return -EINVAL; } return 0;}/* Device MCU_info uses Operation */static struct file_operations LED_Config_remap_ops = { .owner = THIS_MODULE, .ioctl = LED_Config_ioctl, .open = LED_Config_open, .release= LED_Config_release};/* * We export two MCU_info devices. There's no need for us to maintain any * special housekeeping info, so we just deal with raw cdevs. */#define MAX_LED_Config_DEV 2static struct cdev LED_ConfigDevs[MAX_LED_Config_DEV];static int LED_Config_init(void){ int result; unsigned long TempRegister; dev_t dev = MKDEV(LED_Config_major, 0); /* Figure out our device number. */ if (LED_Config_major) result = register_chrdev_region(dev, 1, "LED_Config"); else { result = alloc_chrdev_region(&dev, 0, 1, "LED_Config"); LED_Config_major = MAJOR(dev); } if (result < 0) { printk(KERN_WARNING "LED_Config: unable to get major %d\n", LED_Config_major); return result; } printk (KERN_NOTICE "init success!"); if (LED_Config_major == 0) LED_Config_major = result; //PDEBUG("LED_Config: Major device No. is %d\n", LED_Config_major); /* Now set up one cdevs. */ LED_Config_setup_cdev(LED_ConfigDevs, 0, &LED_Config_remap_ops); TempRegister = inl(GPIO_base_address+0x04); TempRegister = TempRegister & (~(1<<25)); outl (TempRegister,GPIO_base_address+0x04); TempRegister = inl(LED_ADDRESS); TempRegister =TempRegister | (1<<23) | (1<<25); outl(TempRegister , LED_ADDRESS);// TempRegister = inb(GPIO_config_register_address);// TempRegister = TempRegister & 0xfc;// outb(TempRegister, GPIO_config_register_address);// TempRegister = inb(GPIO_status_register_address);// TempRegister = TempRegister | 0x03;// outb(TempRegister, GPIO_status_register_address); return 0;}static void LED_Config_cleanup(void){ cdev_del(LED_ConfigDevs); unregister_chrdev_region(MKDEV(LED_Config_major, 0), 1);}module_init(LED_Config_init);module_exit(LED_Config_cleanup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -