使用环境为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);
}