自己仿照着内核里的mini4410_leds.c驱动改了一下,发现运行不成功,先在把代码贴上来,请大神帮忙看一下是什么原因。
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
//#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-k.h>
volatile unsigned long *gpkconf = NULL;
volatile unsigned long *gpkdat = NULL;
static int led_drv_open(struct inode *inode, struct file *file)
{
unsigned long tmp;
*gpkconf &=~((0xf << 4*4) |(0xf << 4*5) |(0xf << 4*6) |(0xf << 4*7));
*gpkconf |=((0x1 << 4*4) |(0x1 << 4*5) |(0x1 << 4*6) |(0x1 << 4*7));
tmp = readl(gpkconf);
printk("%x",tmp);
printk("led_drv_open\n");
return 0;
}
static long led_drv_ioctl(struct file *file, unsigned int cmd, unsigned long argc)
{
unsigned long tmp;
if(cmd ==0) {
*gpkdat |= (1<<4) |(1<<5) |(1<<6) |(1<<7);
tmp = readl(gpkdat);
printk("%x",tmp);
printk("cmd =0\n");
}
else {
*gpkdat &= ~((1<<4) |(1<<5) |(1<<6) |(1<<7));
printk("cmd =1\n");
}
printk("led_drv_ioctl\n");
return 0;
}
static struct file_operations led_dev_fops = {
.owner = THIS_MODULE,
.open = led_drv_open,
.unlocked_ioctl = led_drv_ioctl,
};
static int led_drv_init(void)
{
gpkconf = (volatile unsigned long*)ioremap(0x7F008800,32);
gpkdat = gpkconf +2;
register_chrdev(112, "led_drv", &led_dev_fops);
printk("init\n");
return 0;
}
static void led_drv_exit(void)
{
iounmap(gpkconf);
unregister_chrdev(112, "led_drv");
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE("GPL");