主题 : tiny6410 LED驱动问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 102354
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
综合积分: 52 分
注册时间: 2014-03-30
最后登录: 2014-08-27
楼主  发表于: 2014-04-23 17:01

 tiny6410 LED驱动问题

自己仿照着内核里的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");
级别: 新手上路
UID: 102354
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
综合积分: 52 分
注册时间: 2014-03-30
最后登录: 2014-08-27
1楼  发表于: 2014-04-23 17:04
LED没反应,猜想应该是LED的寄存器设置好值,但是使用打印出来的gpkdat和gpkconf的值都跟输入进去的一样,不知道是哪儿出了问题,请大神看一下