0 : ビットマップ・ディスプレイ・コントローラのアドレス設定用AXI4 Lite Slave(これを設定すると画面が表示される)
1 : キャラクタ・ジェネレータ ROM AXI4 Lite Slave (キャラクタのラスタ・データがアドレスを与えると出力される)
2 : LEDの表示する値を設定する
3 : ビットマップ・ディスプレイ・コントローラのフレーム・バッファ(アドレスを与えて、Read/Write
/* * dips_test.c * * Created on: 2014/09/28 * Author: Masaaki */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
int c;
int in_val=0;
int index=0;
int inout=1;
int fd0, fd1, fd2, fd3;
int device;
volatile unsigned *bmdc_axis_lite;
volatile unsigned *char_rom_axi_lite;
volatile unsigned *led_gpio;
volatile unsigned *bmdc_axim;
while ((c = getopt(argc, argv, "d:a:i:o")) != -1){
switch(c){
case 'd' :
device = (int)strtol(optarg, 0, 0);
break;
case 'a' :
index = ((int)strtol(optarg, 0, 0))/sizeof(int);
break;
case 'i' :
in_val = (int)strtol(optarg, 0, 0);
inout = 0;
break;
case 'o' :
default :
inout = 1;
}
}
switch(device){
case 0 :
fd0 = open("/dev/uio0", O_RDWR); // bitmap_display_controller axi4 lite
if (fd0 < 1){
fprintf(stderr, "/dev/uio0 open error\n");
exit(-1);
}
bmdc_axis_lite = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd0, 0);
if (!bmdc_axis_lite){
fprintf(stderr, "mmap error\n");
exit(-1);
}
break;
case 1 :
fd1 = open("/dev/uio1", O_RDWR); // char_rom_axi4 lite
if (fd1 < 1){
fprintf(stderr, "/dev/uio1 open error\n");
exit(-1);
}
char_rom_axi_lite = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
if (!char_rom_axi_lite){
fprintf(stderr, "mmap error\n");
exit(-1);
}
break;
case 2 :
fd2 = open("/dev/uio2", O_RDWR);
if (fd2 < 1){
fprintf(stderr, "/dev/uio2 open error\n");
exit(-1);
}
led_gpio = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
if (!led_gpio){
fprintf(stderr, "mmap error\n");
exit(-1);
}
break;
default :
fd3 = open("/dev/uio3", O_RDWR); // bitmap_display_controller FB
if (fd3 < 1){
fprintf(stderr, "/dev/uio3 open error\n");
exit(-1);
}
bmdc_axim = (volatile unsigned *)mmap(NULL, 0x10000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
if (!bmdc_axim){
fprintf(stderr, "mmap error\n");
exit(-1);
}
}
if (inout == 0){
switch(device){
case 0 :
bmdc_axis_lite[0] = in_val;
break;
case 2 :
led_gpio[1] = 0xf; // Channel1 AXI GPIO 3-state Control Register (output mode)
led_gpio[0] = in_val;
break;
default :
bmdc_axim[index] = in_val;
}
} else {
switch(device){
case 0 :
printf("bmdc_axis_lite = %x\n", bmdc_axis_lite[0]);
break;
case 1 :
printf("char_rom_axi_lite[%x] = %x\n", index, char_rom_axi_lite[index]);
break;
case 2 :
printf("led_gpio = %x\n", led_gpio[0]);
printf("led_gpio_tri = %x\n", led_gpio[1]);
break;
default :
printf("bmdc_axim[%x] = %x\n", index, bmdc_axim[index]);
}
}
switch(device){
case 0 :
munmap((void *)bmdc_axis_lite, 0x10000);
break;
case 1 :
munmap((void *)char_rom_axi_lite, 0x10000);
break;
case 2 :
munmap((void *)led_gpio, 0x10000);
break;
default :
munmap((void *)bmdc_axim, 0x10000000);
}
return 0;
}
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |