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