UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Highlighted
Visitor keep
Visitor
144 次查看
注册日期: ‎09-21-2018

ZYNQ GPIO重映射后寄存器无法写入

    在调试PS部分的GPIO字符驱动时,驱动程序中对GPIO寄存器物理地址进行ioremap之后,得到寄存器的虚拟地址,对该地址进行写入,然后再读出,读出的结果总是0x0。换了几个不同的寄存器,读出的结果都是0x0

    同样的方法,对AXI GPIO就可以正常驱动。

    两者的驱动程序中,只有物理地址不同,其他的注册、初始化等都是一样的。

    附上驱动程序代码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/semaphore.h>
#include <linux/spinlock.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>



#define DEVNAME "myled"

#define gpio_base_addr 0xe000a000
#define dirm_1 0xe000a244
#define oen_1  0xe000a248
#define data_1 0xe000a044
#define mask_data_1_msw  0xe000a00c


static struct class *myled_class;
static struct device *myled_class_dev;
int major;

volatile void __iomem *GPIO=NULL;

static struct cdev *mydevp;


static int myled_open(struct inode *inode, struct file *file)
{
    printk("Open myled device\n");
    return 0;
}



static long myled_ioctl(struct file *filp, unsigned int reg_num, unsigned long arg)
{
	writel(arg,GPIO);

    return 0;
}

static int myled_read(struct file *filp, char __user *buff, size_t reg_num, loff_t *offp)
{
	int data;    

	data=readl(GPIO);

	return data;

}

static int myled_release(struct inode * inode, struct file *filp)
{
    return 0;
}

static struct file_operations myled_fops = {
    .owner = THIS_MODULE,
    .open = myled_open,
    .unlocked_ioctl = myled_ioctl,
    .release = myled_release,
	.read = myled_read,
};

static int __init myled_init(void)
{
	dev_t devnum;
	int ret;

	if( (mydevp=cdev_alloc()) == NULL ){
		printk("cdev_alloc failed\n");		
		return -1;
	}

	cdev_init(mydevp,&myled_fops);
	if( (ret=alloc_chrdev_region(&devnum,0,1,DEVNAME)) < 0 ){
		printk("alloc_chredv_region failed\n");
		return -1;
	}
	major=MAJOR(devnum);
	printk("Device major num is : %d\n",major);

	if( cdev_add(mydevp,devnum,1) ){
		printk("cdev_add failed\n");
	}

    myled_class=class_create(THIS_MODULE,"myled");
    myled_class_dev=device_create(myled_class, NULL, MKDEV(major,0), NULL, "myled");


    GPIO=ioremap(gpio_base_addr,4);
	printk("GPIO remappped virtual address is: 0x%x\n",GPIO);

//下面对寄存器读写进行测试
	iowrite32(0x0023,GPIO);
	printk("DIRM_1 read32 value : 0x%x\n",ioread32(GPIO));
	writel(0x00300000,GPIO);
	printk("DIRM_1 readl value : 0x%x\n",readl(GPIO));


    printk("Device myled init successfully\n");

    return 0;
}

static void __exit myled_exit(void)
{
    unregister_chrdev_region(MKDEV(major,0),1);
	cdev_del(mydevp);
    device_unregister(myled_class_dev);
    class_destroy(myled_class);

    iounmap(GPIO);

    printk("Exit myled\n");

}

module_init(myled_init);
module_exit(myled_exit);

MODULE_AUTHOR("hjk");
MODULE_DESCRIPTION("Minized Board GPIO Driver");
MODULE_LICENSE("GPL");
0 项奖励
4 条回复
Xilinx Employee
Xilinx Employee
88 次查看
注册日期: ‎09-14-2018

回复: ZYNQ GPIO重映射后寄存器无法写入

hi @keep

操作了GPIO的那几个地址?

另外可以在linux命令行下,用devmem指令直接去操作这几个寄存器,看看能否写入/读出?

----------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
----------------------------------------------------------------------------------------------

 

0 项奖励
Visitor keep
Visitor
55 次查看
注册日期: ‎09-21-2018

回复: ZYNQ GPIO重映射后寄存器无法写入

感谢回复@chaoz

原本打算是要操作DIRM_1、OEN_1、DATA_1三个寄存器,实现对BANK1 MIO的控制,出现问题后,为了测试程序,改为了对单个寄存器进行操作。程序中所示的是对地址为0xe000a000的寄存器进行操作,即GPIO的第一个寄存器,该寄存器说明如下图:

reg.JPG

此外,也尝试过对DIRM_1寄存器(地址为0xe000a000+0x00000244)进行单独操作,无果。

0 项奖励
Xilinx Employee
Xilinx Employee
47 次查看
注册日期: ‎09-14-2018

回复: ZYNQ GPIO重映射后寄存器无法写入

hi, @keep

用devmem 来操作寄存器看能不能成功呢?

另外vivado中使能了GPIO吧? 

 

----------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
----------------------------------------------------------------------------------------------

0 项奖励
Visitor keep
Visitor
45 次查看
注册日期: ‎09-21-2018

回复: ZYNQ GPIO重映射后寄存器无法写入

GPIO已使能

尝试了devmem 0xe000a000

          devmem 0xe000a244

读出来的都是0x00000000

 

0 项奖励