(注)今回のブログでは、”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の19ページからの”Embedded System Design Using the Zynq Processing System and Programmable Logic”チュートリアル(通称、チュートリアル2)で作成したビットファイルでコンフィギュレーションされた回路をZynqのLinux上から動作させている。
このチュートリアルについては、”Zynq-7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成)”の記事とそれに続く記事を参照のこと。
#define MIO_GPIO_BASE 0xE000A000
#define AXI_GPIO_BASE 0x41200000
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <assert.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define PAGE_SIZE (4*1024)
#define BLOCK_SIZE (4*1024)
// I/O access
volatile unsigned *setup_io(off_t addr);
int main()
{
volatile unsigned *mask_data_0_lsw, *mask_data_0_msw;
volatile unsigned *data_0, *data_0_ro;
volatile unsigned *dirm_0, *oen_0;
volatile unsigned *mio_gpio;
volatile unsigned *axi_gpio, *axi_gpio_tri;
int axi_gpio_val, axi_gpio_val_old;
mio_gpio = setup_io((off_t)MIO_GPIO_BASE);
axi_gpio = setup_io((off_t)AXI_GPIO_BASE);
mask_data_0_lsw = mio_gpio;
mask_data_0_msw = mio_gpio + 1; // 0x4番地
data_0 = mio_gpio + 0x10; // 0x40番地
data_0_ro = mio_gpio + 0x18; // 0x60番地
dirm_0 = mio_gpio + 0x81; // 0x204番地
oen_0 = mio_gpio + 0x82; // 0x208番地
axi_gpio_tri = axi_gpio + 1; // 0x4番地
*(dirm_0) = *(dirm_0)|0x400; // gpio[10]を出力に設定
*(oen_0) = *(oen_0)|0x400; // gpio[10]をイネーブル
*(axi_gpio_tri) = 0x1; // axi_gpio入力設定
printf("AXI_GPIO_TRI = %x\n", *(axi_gpio_tri));
printf("MASK_DATA_0_LSW = %x\n", *(mask_data_0_lsw));
printf("MASK_DATA_0_MSW = %x\n", *(mask_data_0_msw));
printf("DATA_0 = %x\n", *(data_0));
printf("DATA_0_RO = %x\n", *(data_0_ro));
printf("DIRM_0 = %x\n", *(dirm_0));
printf("OEN_0 = %x\n", *(oen_0));
*(data_0) = *(data_0)&(~(0x400)); // DS23 (LED) 消灯
printf("DATA_0 = %x\n", *(data_0));
axi_gpio_val_old = *(axi_gpio);
while(1){
axi_gpio_val = *(axi_gpio);
if (axi_gpio_val)
*(data_0) = *(data_0)|(0x400); // DS23点灯
else
*(data_0) = *(data_0)&(~(0x400)); // DS23消灯
if (!axi_gpio_val && axi_gpio_val_old)
break; // axi_gpio が1から0になった立下りでループを抜ける
axi_gpio_val_old = axi_gpio_val;
}
printf("AXI_GPIO = %x\n", *(axi_gpio));
printf("Hello World\n");
return 0;
}
volatile unsigned *setup_io(off_t mapped_addr)
// void setup_io()
int mem_fd;
char *gpio_mem, *gpio_map;
gpio_map = (unsigned char *)mmap(
(caddr_t)gpio_mem,
BLOCK_SIZE,
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED,
mem_fd,
mapped_addr
);
// gpio = (volatile unsigned *)gpio_map;
return((volatile unsigned *)gpio_map);
zynq> gdbserver :1234 /Apps/linux_hello_world_0.elf null
Process /Apps/linux_hello_world_0.elf created; pid = 655
Listening on port 1234
Remote debugging from host 10.10.70.121
AXI_GPIO_TRI = 1
MASK_DATA_0_LSW = 2ab2
MASK_DATA_0_MSW = 681
DATA_0 = 6812ab2
DATA_0_RO = 6802a32
DIRM_0 = 480
OEN_0 = 480
DATA_0 = 6c12ab2
AXI_GPIO = 0
Hello World
Child exited with status 0
GDBserver exiting
zynq>
zynq> exit
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 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 | - | - | - | - |