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

📄 led.c

📁 linux2.6 led driver 是非常难的典形的linux2.6驱动。初学者非常适应
💻 C
字号:
#include <linux/config.h>#include <linux/fs.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/init.h>//Please configure your kernel first to use the following headers, because the directory "asm" is a short cut to your arch's "asm" directory.#include <asm/io.h>  //This header is for ioremap(), iounmap().#include <asm/uaccess.h>  //This header is for get_user(), put_user().#include <asm/irq.h>#include <linux/sched.h>#define NAME "led_test"MODULE_AUTHOR("Lu Xianzi <cosine@126.com>");  //This line and the following 4 lines can be omitted.MODULE_DESCRIPTION("LED Test Driver");MODULE_LICENSE("Dual BSD/GPL");static int major=231;module_param(major, int, 0);MODULE_PARM_DESC(major, "Major device number");unsigned long * pREG;  //Definition of register base.void *LED_GPBCON,*LED_GPBDAT,*LED_GPBUP;static ssize_t led_test_write(struct file *file, const char __user *data, size_t len, loff_t *ppos){ char buf[256]; size_t i; for (i = 0; i < len && i < 254; i++)  if (get_user(buf[i], data + i))   return -EFAULT;    buf[i] = '\0'; printk("LED Test - write: user_data %s\n", buf); return (len < 255 ? len : 255);}static int led_test_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){ unsigned long tmp; printk("LED Test - ioctl: param %u %lu\n", cmd, arg); switch (cmd) {  case 0: {   tmp = ioread32(LED_GPBDAT);              tmp |= 0x002;                        iowrite32(tmp, LED_GPBDAT);  }  case 1:{    tmp = ioread32(LED_GPBDAT);              tmp |= 0x008;                        iowrite32(tmp, LED_GPBDAT);  }//   if (arg > 3)//    return -EINVAL;//   if (!cmd)//    * (volatile unsigned long *)(pREG + 1) |= (0x80 << arg);//   else//    * (volatile unsigned long *)(pREG + 1) &= ~(0x80 << arg);//   tmp = * (volatile unsigned long *)pREG;//   printk("GPBCON = 0x%lx\n", tmp);//   tmp = * (volatile unsigned long *)(pREG + 1);//   printk("GPBDAT = 0x%lx\n", tmp);//   break;  default:   return -EINVAL; } return 1;}static int led_test_open(struct inode *inode, struct file *file){ unsigned m = iminor(inode); if (m > 63)  return -EINVAL; printk("LED Test driver opened!\n"); return nonseekable_open(inode, file);}static int led_test_release(struct inode *inode, struct file *file){ printk("LED Test driver released!\n"); return 0;}static struct file_operations led_test_fops = { .owner   = THIS_MODULE, .ioctl   = led_test_ioctl, .write   = led_test_write, .open    = led_test_open, .release = led_test_release,};static int __init led_test_init(void){ int ret; ret = register_chrdev(major, NAME, &led_test_fops); if (ret < 0) {  printk("Unable to register character device!\n");  return ret; }  LED_GPBCON = ioremap(0x56000010,4); LED_GPBDAT = ioremap(0x56000014,4); LED_GPBUP  = ioremap(0x56000018,4);  unsigned int tmp = ioread32(LED_GPBCON);              tmp &= ~0x0000C0;               tmp |= 0x000040;                        iowrite32(tmp, LED_GPBCON);              //              tmp = ioread32(LED_GPBDAT);//              tmp |= 0x008;          //              iowrite32(tmp, LED_GPBDAT);   printk("LED Test Driver initiated.\n");  return 0;}static void __exit led_test_cleanup(void){ int ret;  iounmap(LED_GPBCON); iounmap(LED_GPBDAT); iounmap(LED_GPBUP);  ret = unregister_chrdev(major, NAME);  if (ret < 0)  printk("Unable to register character device!\n"); else  printk("LED Test Driver unloaded!");}module_init(led_test_init);module_exit(led_test_cleanup);

⌨️ 快捷键说明

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