FC2カウンター FPGAの部屋 AXI4 Master IP にAXI4 Lite Slave を追加6(Cテストプログラム)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXI4 Master IP にAXI4 Lite Slave を追加6(Cテストプログラム)

このブログ記事のトップは、”AXI4 Master IP にAXI4 Lite Slave を追加1(インプリメント)”
前の記事は、”AXI4 Master IP にAXI4 Lite Slave を追加5(Linuxを起動)

前回は、AXI Lite Slave インターフェースを追加したカメラ・インターフェイスIP とビットマップ・ディスプレイ・コントローラIP を入れたSDカードでLinuxをブートして、Sysfs に2つのIPのエントリがあることを確認した。今回は、SDKを立ちあげ、テストプログラムを作製して、AXI Lite Slave インターフェースの動作を調べる。

Ubuntu12.10 でISE14.4 を使用した。

・xsdk コマンドで、SDKを立ちあげ、File メニュー -> New -> Application Project を選択した。

・Project name に AXI_Lite_test_linux と入力した。Next > ボタンをクリックした。
AXI4M_and_Lite_Slave_50_130413.png

・Templates から、Linux Empty Application を選択し、Finish ボタンをクリックした。
AXI4M_and_Lite_Slave_51_130413.png

・ AXI_Lite_test_linux プロジェクトが生成された。

・ AXI_Lite_test_linux プロジェクトの src ディレクトリで右クリックして、New -> File を選択した。
AXI4M_and_Lite_Slave_52_130413.png

・File naem: にAXI_Lite_test_linux.c と入力した。Finish ボタンをクリックした。
AXI4M_and_Lite_Slave_53_130413.png

・空のAXI_Lite_test_linux.c が生成された。カメラ・インターフェイスIP とビットマップ・ディスプレイ・コントローラIP のレジスタに現在のZedBoard Linuxのフレームバッファの開始アドレスを dmesg から抜き出して設定するCプログラムを記述した。
AXI4M_and_Lite_Slave_54_130413.png

dmesg のフレームバッファの開始アドレスを下に示す。

[ 1.370000] fbi->fix.smem_start = 0x19800000


Cプログラムを下に示す。(”RPi Low-level peripherals”の 以前のvoid setup_io(); のコードを元に変更した)

// AXI_Lite_test_linux.c
//
// AXI Lite Slave interface check program for mt9d111_inf_axi_master IP and bitmap_disp_cntrler_axi_master IP.
//
// 2013/04/13
//

#define MT9D111_INF_BASEADDR            0x46000000
#define BITMAP_DISP_CNTRLER_BASEADDR    0x47000000

#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);

volatile unsigned *mt9d111_inf_reg;
volatile unsigned *bm_disp_cnt_reg;

int main()
{
    volatile unsigned mt9d111_inf_reg_d, bm_disp_cnt_reg_d;

    mt9d111_inf_reg = setup_io((off_t)MT9D111_INF_BASEADDR);
    bm_disp_cnt_reg = setup_io((off_t)BITMAP_DISP_CNTRLER_BASEADDR);

    mt9d111_inf_reg_d = *mt9d111_inf_reg;
    bm_disp_cnt_reg_d = *bm_disp_cnt_reg;

    *mt9d111_inf_reg = 0x19800000;
    *bm_disp_cnt_reg = 0x19800000;

    mt9d111_inf_reg_d = *mt9d111_inf_reg;
    bm_disp_cnt_reg_d = *bm_disp_cnt_reg;

    return 0;
}

//
// Set up a memory regions to access GPIO
//
volatile unsigned *setup_io(off_t mapped_addr)
// void setup_io()
{
    int  mem_fd;
    char *gpio_mem, *gpio_map;

   /* open /dev/mem */
   if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
      printf("can't open /dev/mem \n");
      exit (-1);
   }

   /* mmap GPIO */

   // Allocate MAP block
   if ((gpio_mem = malloc(BLOCK_SIZE + (PAGE_SIZE-1))) == NULL) {
      printf("allocation error \n");
      exit (-1);
   }

   // Make sure pointer is on 4K boundary
   if ((unsigned long)gpio_mem % PAGE_SIZE)
     gpio_mem += PAGE_SIZE - ((unsigned long)gpio_mem % PAGE_SIZE);

   // Now map it
   gpio_map = (unsigned char *)mmap(
      (caddr_t)gpio_mem,
      BLOCK_SIZE,
      PROT_READ|PROT_WRITE,
      MAP_SHARED|MAP_FIXED,
      mem_fd,
      mapped_addr
   );

   if ((long)gpio_map < 0) {
      printf("mmap error %d\n", (int)gpio_map);
      exit (-1);
   }

   // Always use volatile pointer!
   // gpio = (volatile unsigned *)gpio_map;
   return((volatile unsigned *)gpio_map);

// setup_io


次のブログ記事は、”AXI4 Master IP にAXI4 Lite Slave を追加7(SDKリモートデバッグ)
  1. 2013年04月15日 05:27 |
  2. 複数のAXI4 バスを持つIPの作製
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/2439-eefb4911
この記事にトラックバックする(FC2ブログユーザー)