ZYNQ linux AXI 读写,已解决: ZYNQ linux下访问AXI_GPIO的三种方式问题 - Community Forums

使用环境为SDX工具,linux由petalinux搭建。

第一种:使用/sys/class/gpio操作,我已经成功实现该方式操作。

第二种:使用UIO操作,目前还没有试验,不过其官网有相应教程,实现应该不难。

但是我没有实现出来,AXI_GPIO没有输出。/ *将设备映射到内存中* /page_addr =(gpio_addr&(〜(page_size-1)));page_offset = gpio_addr-page_addr;ptr = mmap(NULL,page_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,page_addr

上面链接中,作者使用mmap时,填的是页地址和页大小。我不明白在SDX中的mmap到底是使用页地址还是字节偏移;使用页地址我没有实现GPIO输出,使用字节偏移的话,会提示mmap失败。下面是我参照其例子写的程序。我的AXI_GPIO的基地址为0x80000000,使用了双通道,0x80000008为第二通道输出寄存器。

unsigned page_addr, page_offset;

void *ptr;

unsigned page_size=sysconf(_SC_PAGESIZE);

printf("page_size=%d,GPIO access through /dev/mem.\n", page_size);

/* Open /dev/mem file */

int fd = open ("/dev/mem", O_RDWR);

if (fd < 1) {

return -1;

}

unsigned gpio_addr = 0x80000008;

/* mmap the device into memory */

page_addr = (gpio_addr & (~(page_size-1)));

page_offset = gpio_addr - page_addr;

//ptr = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, page_addr);

ptr = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, gpio_addr);

if(ptr == MAP_FAILED)

{

printf("mmap error\n");

return -1;

}

while(1)

{

//*(((int*)ptr + page_offset)) = 1;

//printf("value=%d\n",*(((int *)ptr + page_offset)));

printf("value=%d\n",*(((int *)gpio_addr)));

//*(((int *)ptr + page_offset)) = 0;

sleep(3);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值