各 OS およびライブラリには、MLD ファイルに関連付けられた Tcl ファイルがあります。この Tcl ファイルには、次のセクションがあります。
- DRC
- OS およびライブラリ パラメーターの一貫性を検証する Tcl ルーチンが含まれます。
- ジェネレーション
- ライブラリ パラメーターに基づいてコンフィギュレーション ヘッダーおよび C ファイルを生成する Tcl ルーチンが含まれます。
MLD デザイン ルール チェック セクション
proc mydrc { handle } { }
DRC 関数は、パラメーターが正しいことを確認する Tcl コードです。DRC プロシージャはプラットフォーム仕様フォーマット データベース (ツールによりハードウェア (XSA) およびソフトウェア (MSS) データベース ファイルを使用してビルド) に読み取りのみでアクセスし、設定したパラメーター値を読み出します。handle は、データベースの現在のライブラリに関連付けられています。DRC プロシージャは、このハンドルから OS およびライブラリのパラメーターを取得します。データベースからのその他のパラメーターも、ハンドルを要求してそのハンドルを使用することにより取得できます。
エラーに対しては、エラー ページに Tcl エラー コマンドの error msg が呼び出されます。
警告に対しては、コンソールに表示可能な文字列値が返されます。
エラーがない場合は、値は返されません。
MLD フォーマットの例
このセクションでは、MLD ファイルおよび対応する Tcl ファイルの例を使用して、MLD フォーマットを説明します。
次に、xilmfs ライブラリの MLD ファイルの例を示します。
option psf_version = 2.1.0 ;
option
はツールで識別されるキーワードです。option
キーワードの後に指定するオプション名は、ツールで特定のアクションを実行するための指示子となります。
この例では、MLD ファイルの psf_version
は 2.1 に定義されています。これが、BEGIN LIBRARY コンストラクトの前に設定可能な唯一のオプションです。
BEGIN LIBRARY xilmfs
BEGIN LIBRARY
コンストラクトは、xilmfs というライブラリの開始を定義します。
option DESC = "Xilinx Memory File System" ;
option drc = mfs_drc ;
option copyfiles = all;
option REQUIRES_OS = (standalone xilkernel freertos_zynq);
option VERSION = 2.0;
option NAME = xilmfs;
NAME
オプションは、ドライバーの名前を示します。VERSION
オプションは、ドライバーのバージョンを示します。
COPYFILES
オプションは、ライブラリ用にコピーするファイルを示します。この DRC オプションでは、このライブラリの処理中にツールが呼び出す Tcl プロシージャの名前を指定します。xilmfs ライブラリの処理中には、xilmfs.tcl ファイルの Tcl プロシージャ mfs_drc が呼び出されます。
PARAM name = numbytes, desc = "Number of Bytes", type = int, default =
100000, drc = drc_numbytes ;
PARAM name = base_address, desc = "Base Address", type = int, default =
0x10000, drc = drc_base_address ;
PARAM name = init_type, desc = "Init Type", type = enum, values = ("New
file system"=MFSINIT_NEW,
"MFS Image"=MFSINIT_IMAGE, "ROM Image"=MFSINIT_ROM_IMAGE), default =
MFSINIT_NEW ;
PARAM name = need_utils, desc = "Need additional Utilities?", type =
bool, default = false ;
PARAM
は、設定可能なライブラリ パラメーターを定義します。各 PARAM
には、NAME
、DESC
、TYPE
、DEFAULT
、RANGE
、および DRC
プロパティが関連付けられています。VALUES
プロパティは、ENUM
型に関連付けられている可能な値のリストを定義します。
BEGIN INTERFACE file
PROPERTY HEADER="xilmfs.h" ;
FUNCTION NAME=open, VALUE=mfs_file_open ;
FUNCTION NAME=close, VALUE=mfs_file_close ;
FUNCTION NAME=read, VALUE=mfs_file_read ;
FUNCTION NAME=write, VALUE=mfs_file_write ;
FUNCTION NAME=lseek, VALUE=mfs_file_lseek ;
END INTERFACE
インターフェイスには、標準関数のリストが含まれます。インターフェイスを定義するライブラリには、標準関数のリストが含まれている必要があります。また、すべての関数プロトタイプを定義するヘッダー ファイルも指定する必要があります。
PROPERTY
は、BEGIN
コンストラクトで定義されているコンストラクトに関連付けられているプロパティを定義します。ここでは、HEADER
はインターフェイスで定義された xilmfs.h を値として含むプロパティです。FUNCTION
は、インターフェイスでサポートされる関数を定義します。
file インターフェイスの open
、close
、read
、write
、および lseek
関数の値は、mfs_file_open
、mfs_file_close
、mfs_file_read
、mfs_file_write
、および mfs_file_lseek
です。これらの関数は、ヘッダー ファイル xilmfs.h
で定義されています。
BEGIN INTERFACE filesystem
BEGIN INTERFACE
は、ライブラリがサポートするインターフェイスを定義します。ここでは、file
はインターフェイスの名前です。
PROPERTY HEADER="xilmfs.h" ;
FUNCTION NAME=cd, VALUE=mfs_change_dir ;
FUNCTION NAME=opendir, VALUE=mfs_dir_open ;
FUNCTION NAME=closedir, VALUE=mfs_dir_close ;
FUNCTION NAME=readdir, VALUE=mfs_dir_read ;
FUNCTION NAME=deletedir, VALUE=mfs_delete_dir ;
FUNCTION NAME=pwd, VALUE=mfs_get_current_dir_name ;
FUNCTION NAME=rename, VALUE=mfs_rename_file ;
FUNCTION NAME=exists, VALUE=mfs_exists_file ;
FUNCTION NAME=delete, VALUE=mfs_delete_file ;
END INTERFACE
END LIBRARY
END
は、BEGIN
文で使用されたコンストラクト名に使用されます。ここでは、END
を INTERFACE
および LIBRARY
コンストラクトと使用して、INTERFACE
および LIBRARY
コンストラクトの終了を示しています。
次に、前のセクションで説明した xilmfs.mld ファイルに対応する xilmfs.tcl ファイルを示します。ライブラリの DRC の実行中、xilmfs ライブラリに対して mfs_drc
プロシージャが呼び出されます。generate ルーチンは、MSS ファイルのライブラリ定義セグメントに基づいて、ヘッダー ファイルに定数および xilmfs ライブラリの C ファイルを生成します。
proc mfs_drc {lib_handle} {
puts "MFS DRC ..."
}
proc mfs_open_include_file {file_name} {
set filename [file join "../../include/" $file_name]
if {[file exists $filename]} {
set config_inc [open $filename a]
} else {
set config_inc [open $filename a]
::hsi::utils::write_c_header $config_inc "MFS Parameters"
}
return $config_inc
}
proc generate {lib_handle} {
puts "MFS generate ..."
file copy "src/xilmfs.h" "../../include/xilmfs.h"
set conffile [mfs_open_include_file "mfs_config.h"]
puts $conffile "#ifndef _MFS_CONFIG_H"
puts $conffile "#define _MFS_CONFIG_H"
set need_utils [common::get_property CONFIG.need_utils $lib_handle]
if {$need_utils} {
# tell libgen or xps that the hardware platform needs to provide
stdio functions
# inbyte and outbyte to support utils
puts $conffile "#include <stdio.h>"
}
puts $conffile "#include <xilmfs.h>"
set value [common::get_property CONFIG.numbytes $lib_handle]
puts $conffile "#define MFS_NUMBYTES $value"
set value [common::get_property CONFIG.base_address $lib_handle]
puts $conffile "#define MFS_BASE_ADDRESS $value"
set value [common::get_property CONFIG.init_type $lib_handle]
puts $conffile "#define MFS_INIT_TYPE $value"
puts $conffile "#endif"
close $conffile
}
次に、スタンドアロン OS の MLD ファイルの例を示します。
option psf_version = 2.1.0 ;
option
はツールで識別されるキーワードです。option
キーワードの後に指定するオプション名は、ツールで特定のアクションを実行するための指示子となります。この例では、MLD ファイルの psf_version は 2.1 に定義されています。これが、BEGIN
OS コンストラクトの前に設定可能な唯一のオプションです。
BEGIN OS standalone
BEGIN
OS コンストラクトは、standalone という OS の開始を定義します。
option DESC = "Generate standalone BSP";
option COPYFILES = all;
DESC
オプションは、MLD の説明を示します。COPYFILES
オプションは、OS 用にコピーするファイルを示します。
PARAM NAME = stdin, DESC = "stdin peripheral ", TYPE =
peripheral_instance, REQUIRES_INTERFACE = stdin, DEFAULT = none; PARAM
NAME = stdout, DESC = "stdout peripheral ", TYPE = peripheral_instance,
REQUIRES_INTERFACE = stdout, DEFAULT = none ; PARAM NAME = need_xilmalloc,
DESC = "Need xil_malloc?", TYPE = bool, DEFAULT = false ;
PARAM
は、設定可能な OS パラメーターを定義します。各 PARAM
には、NAME
、DESC
、TYPE
、DEFAULT
、RANGE
、DRC
プロパティが関連付けられています。VALUES
プロパティは、ENUM
型に関連付けられている可能な値のリストを定義します。
END OS
END
は、BEGIN
文で使用されたコンストラクト名に使用されます。ここでは、END
を OS コンストラクトと使用して、OS コンストラクトの終了を示しています。
次に、前のセクションで説明した standalone.mld ファイルに対応する standalone.tcl ファイルを示します。generate ルーチンは、MSS ファイルのライブラリ定義セグメントに基づいて、ヘッダー ファイルに定数および xilmfs ライブラリの C ファイルを生成します。
proc generate {os_handle} {
global env
set need_config_file "false"
# Copy over the right set of files as src based on processor type
set sw_proc_handle [get_sw_processor]
set hw_proc_handle [get_cells [get_property HW_INSTANCE
$sw_proc_handle] ]
set proctype [get_property IP_NAME $hw_proc_handle]
set procname [get_property NAME $hw_proc_handle]
set enable_sw_profile [get_property
CONFIG.enable_sw_intrusive_profiling $os_handle]
set mb_exceptions false
switch $proctype {
"microblaze" {
foreach entry [glob -nocomplain [file join $mbsrcdir *]] {
# Copy over only files that are not related to exception
handling.
# All such files have exception in their names.
file copy -force $entry "./src/"
}
set need_config_file "true"
set mb_exceptions [mb_has_exceptions $hw_proc_handle]
}
"ps7_cortexa9" {
set procdrv [get_sw_processor]
set compiler [get_property CONFIG.compiler $procdrv]
if {[string compare -nocase $compiler "armcc"] == 0} {
set ccdir "./src/cortexa9/armcc"
} else {
set ccdir "./src/cortexa9/gcc"
}
foreach entry [glob -nocomplain [file join
$cortexa9srcdir *]] {
file copy -force $entry "./src/"
}
foreach entry [glob -nocomplain [file join $ccdir *]] {
file copy -force $entry "./src/"
}
file delete -force "./src/armcc"
file delete -force "./src/gcc"
if {[string compare -nocase $compiler "armcc"] == 0} {
file delete -force "./src/profile"
set enable_sw_profile "false"
}
set file_handle [xopen_include_file "xparameters.h"]
puts $file_handle "#include \"xparameters_ps.h\""
puts $file_handle ""
close $file_handle
}
"default" {puts "unknown processor type $proctype\n"}
}