在线时间1 小时
UID3174658
注册时间2016-9-15
NXP金币0
该用户从未签到
新手上路

- 积分
- 13
- 最后登录
- 2016-9-17
|
本帖最后由 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") ;
|
-
|