查看: 3206|回复: 3

[求助] imx6ul在insmod gpio.ko后出现mmcblk1 :error -84

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2016-9-17
发表于 2016-9-16 22:00:36 | 显示全部楼层 |阅读模式
本帖最后由 cscscscs 于 2016-9-16 22:06 编辑

我自己写了个imx6ul的驱动,是通过映射地址的方式去控制寄存器的,但是在insmod驱动后,出现了如图的问题,并且,对应的gpio口也没有反应,我使用的内核是3.14.38 ,文件系统是debian。
有木有大神知道这是什么情况哈

//     下面是源码

#include <linux/module.h>
#include <linux/device.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/slab.h>

static struct class *firstdrv_class ;
volatile unsigned long *GPIO_PAD_BASE = NULL ;
volatile unsigned long *GPIO_PAD = NULL ;
volatile unsigned long *GPIO_CTL = NULL ;
volatile unsigned long *GPIO_CORTOL = NULL ;
volatile unsigned long *GPIO_DI = NULL ;
volatile unsigned long *GPIO_DR = NULL ;

struct gpio_dev{
        struct cdev cdev ;        //       
        unsigned int value ;
} ;

struct gpio_dev *gpio_devp ;
int gpio_major = 322 ;

static int gpio_open(struct inode *inode,struct file *filp)
{
        struct gpio_dev *dev ;
        dev = container_of(inode->i_cdev,struct gpio_dev,cdev) ;
        filp->private_data = dev ;

        return 0 ;
}

struct file_operations gpio_fops = {
        .owner = THIS_MODULE ,
        .open = gpio_open ,
} ;

static void gpio_setup_cdev(struct gpio_dev *dev,int index)
{
        int err,devno = MKDEV(gpio_major,index) ;
        cdev_init(&dev->cdev,&gpio_fops) ;
        dev->cdev.owner = THIS_MODULE ,
        err = cdev_add(&dev->cdev,devno,1) ;
        if(err)
                printk(KERN_NOTICE "Error %d adding globalmem %d",err,index) ;
}

int major = 0 ;

static int __init gpio_init(void)
{
        volatile unsigned long reg_val = 0 ;
        int ret = 0 ;
        dev_t dev = MKDEV(gpio_major,0) ;
        firstdrv_class = class_create(THIS_MODULE,"Firstdrv") ;
        device_create(firstdrv_class,NULL,dev,NULL,"My_GPIO") ;

        if(gpio_major)
                ret = register_chrdev_region(dev,1,"MY_GPIO") ;
        else{
                ret = alloc_chrdev_region(&dev,0,1,"MY_GPIO") ;
                gpio_major = MAJOR(dev) ;
        }

        if(ret < 0)
                return ret ;
        GPIO_PAD_BASE = (volatile unsigned long *)ioremap(0x020E0000,0x10000) ;
        GPIO_DR = (volatile unsigned long *)ioremap(0x0209C000,0x10000)  ;

        if(!GPIO_PAD_BASE){
                printk("GPIO_PAD_BASE ioremap error\n") ;
        }
        else{
                printk("GPIO_PAD_BASE ioremap success\n") ;
        }
        if(!GPIO_PAD_BASE){
                printk("GPIO_DR  ioremap error\n") ;
        }
        else{
                printk("GPIO_DR ioremap success\n") ;
        }
       
        GPIO_PAD = GPIO_PAD_BASE + 0x60 ;
        GPIO_CTL = GPIO_PAD_BASE + 0x02EC ;

        GPIO_DI = GPIO_DR + 0x04 ;
       
        reg_val = __raw_readl(GPIO_PAD) ;
        printk("The  %x GPIO_PAD old val is %x\n",GPIO_PAD,reg_val) ;
        reg_val = 0x05 ;
        __raw_writel(reg_val,GPIO_PAD) ;
        reg_val = __raw_readl(GPIO_PAD) ;
        printk("The GPIO_PAD new val is %x\n",reg_val) ;


        reg_val = __raw_readl(GPIO_CTL) ;
        printk("The %x GPIO_CTL old val is %x\n",GPIO_CTL,reg_val) ;
        reg_val = 0x50B0 ;
        __raw_writel(reg_val,GPIO_CTL) ;
        reg_val = __raw_readl(GPIO_CTL) ;
        printk("The GPIO_CTL new val is %x\n",reg_val) ;

        reg_val = __raw_readl(GPIO_DI) ;
        printk("The %x GPIO_DI old val is %x\n",GPIO_DI,reg_val) ;
        reg_val |= 0x02 ;
        __raw_writel(reg_val,GPIO_DI) ;
        reg_val = __raw_readl(GPIO_DI) ;
        printk("The GPIO_DI new val is %x\n",reg_val) ;

        reg_val = __raw_readl(GPIO_DR) ;
        printk("The %x GPIO_DR old val is %x\n",GPIO_DR,reg_val) ;
        reg_val &= 0xFFFFFFFD ;
        __raw_writel(reg_val,GPIO_DR) ;
        reg_val = __raw_readl(GPIO_DR) ;
        printk("The GPIO_DR new val is %x\n",reg_val) ;

/*
        *GPIO_PAD = 0x05 ;
        *GPIO_CTL = 0x50B0;

        (*GPIO_DI) |= 0x02 ;
        (*GPIO_DR) &= 0xFFFFFFFD ;

*/
        //        set gpio ctl
        //GPIO_PAD = (volatile unsigned long *)ioremap(0x020E0000,0x100000) + 0x02EC ;
        //        set gpio di
        //GPIO_DR = (volatile unsigned long *)ioremap(0x0209C000,0x100000)  ;
        //        set gpio dr
        //GPIO_DI = GPIO_DR + 0x04 ;
        //        gpio init start



        //        gpio init end

        gpio_devp = kmalloc(sizeof(struct gpio_dev),GFP_KERNEL) ;
        if(!gpio_devp){
                ret = -ENOMEM ;
                goto fail_malloc ;
        }

        memset(gpio_devp,0,sizeof(struct gpio_dev)) ;
        gpio_setup_cdev(gpio_devp,0) ;
       
        return 0 ;
fail_malloc:
        unregister_chrdev_region(dev,gpio_devp) ;
        return ret ;
}

void __exit gpio_cleanup(void)
{
        cdev_del(&gpio_devp->cdev) ;
        kfree(gpio_devp) ;
        unregister_chrdev_region(MKDEV(gpio_major,0),1) ;
        device_destroy(firstdrv_class,MKDEV(gpio_major,0)) ;
        class_destroy(firstdrv_class) ;
        iounmap(GPIO_PAD) ;
        iounmap(GPIO_DR) ;
}

module_init(gpio_init) ;
module_exit(gpio_cleanup) ;
MODULE_LICENSE("GPL v2") ;












我知道答案 目前已有3人回答
77A663D915F1348076B27AC8F600D50E.jpg
回复

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2016-9-17
 楼主| 发表于 2016-9-17 11:02:11 | 显示全部楼层
自己顶一下
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2016-9-17
 楼主| 发表于 2016-9-17 18:08:36 | 显示全部楼层
千万别沉啊
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-10-28 10:25
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    65

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2018-3-22
    发表于 2016-9-19 09:10:03 | 显示全部楼层
    您好,
         你这个错误是GPIO映射和存储部分的GPIO打架了,你确认一下有没有重复,其实IMX6UL有了GPIOLIB以后,你没必要自己映射GPIO的,全部可以用GPIOLIB进行映射。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-9 22:26 , Processed in 0.087038 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表